tomo_stoneのメモ帳

ついったーに収まらないやつはこちら

デュアルブートの代わりとしてのWindows10仮想化

  • 2019/11/22 更新: ベアメタル時の記述を追加

NOTE: 本エントリはポエムです――詳しい解説もそのうち書きたいです

およそ2ヶ月ぶりのエントリになってしまいました……(;´・ω・)

いままで

大学に入学した当時、私はよく判らないまま大学の共通PCを購入しました。 入っていたOSは言うまでもなくWindows10。

しかしその後1ヶ月も経たないうちにLinuxの存在を知ります(情報学部生とは……)。 そして、すぐにそのLinux環境が必要になりました。

最初は講義で使用したVMWareを使っていましたが、Windows Update後に仮想ネットワークアダプタが動かなくなるトラブルを切っ掛けにデュアルブートを敢行。

初めてのパーティション操作は上手くいき、ネット上に情報が多かった(ように感じた)Ubuntuをインストール。

Windows Updateの際にパーティションの番号が変わるなどのトラブルはあったものの、自力で解決できるものであったため、そのまま使い続けることができました。

こうして、快適な開発環境を手に入れたかに思われました。

"やっぱりデュアルブートって難しいのね"

切っ掛けはまたもやWindows Update

新しく生成された回復パーティションがなぜか自動マウントされ、 その為かは判りませんがWindowsが不安定に (e.g. エクスプローラが突然フリーズ&強制終了など)。

おまけに扱いが雑だったせいかUbuntu側も "Sorry, Ubuntu 16.04 has experienced an internal error." みたいなメッセージが頻発するように。

本題: Linux環境上で仮想のWindowsマシンをこしらえたい

長くなりましたがここからが本題です。

あのWindowsの更新の呪縛から逃れたい、でもWindows版のOfficeでないと大学の資料が開けない[1]…… ということでクリーンインストールがてらにごにょごにょした結果が先日のツイート。

QEMU/KVM仮想マシンなのですが、Intel GVT-gという機能を用いることでIntel純正のグラフィックドライバが動くGPUを、ホストOSと共有できます。 KVMでよくやるQXLドライバとは比較にならないくらい快適。

実は"Windowsエクスペリエンスインデックス"の値だけ見るとVirtualBox上のほうがスコアはいい[2]のですが、64bit版のDirect3Dはまだ不安定なようです。

64bit版Direct3Dは上手く動かない
VirtualBox上のx64版Win10で3Dアクセラレーションを有効にしてExcel起動

Windowsエクスペリエンスインデックスのほうも貼っておきますね。

Videoは"4.6"
KVMIntel GVT-gで立てたVMのWEIの評価

Videoは"5.3"
同じ条件でVirtualBoxで立てたVMのWEIの評価


- ちなみにベアメタルだとこんな感じです。

全体的に1.0前後高い値になる
同じPCで、ベアメタルで測った場合

まとめ

Windows10が"ちょっと重い"程度で普段使いできるVMが作れました。 また更新でおかしくなっても、影響範囲はVMの中のみなので、精神衛生上とっても嬉しいですね。

また、3Dアクセラレーションが不要ならVirtualBoxもアリかもしれません。

脚注

[1] ブラウザ版Office365で古い資料とかが崩れなければ、この考察は不要であった

[2] 一応マシンスペック等も載せておきます

  • 物理構成

    • 機種名: Let's note CF-SZ6
    • CPU: Core i7-7500U
    • GPU: 内蔵(HD Graphics 620)
    • RAM: 8GB DDR3
    • SSD: 256GB SATA
    • OS: Arch Linux(後から入れたもの)

  • QEMU/KVM

    • CPU: 4コア
    • RAM: 6GB
    • ストレージ: 64GB qcow2 / SCSI VirtIO Controller
    • GPU: Intel GVT-g (解像度1920x1200)
    • OS: Windows10 64bit

  • VirtualBox

    • 基本的に同条件
    • 準仮想化I/F: KVM
    • VideoRAM: 256MB
    • ディスクイメージ: vmdk形式

Raspberry Piでコンテナ(LXC/LXD)を使う

これの続きです。 tomo-stone.hatenablog.com

やったこと

  • Linux Containers(LXC)のインストール
  • snapパッケージを導入する準備
  • LXDのインストール・セットアップ

LXDはSnappyというパッケージ管理システムでインストールします。 (Ubuntuならaptで入る)

環境

インストール作業

  • LXCのインストール

    • # apt install lxc

  • snapパッケージを導入する準備

    • # apt install snapd

  • LXDのインストール

    • # snap install lxd

  • ユーザをlxdグループに追加する

    • 私の場合tomostoneというユーザ名なので......
    • # gpasswd -a tomostone lxd

※これで$ lxd --versionみたいにしてエラーが出なければOKなのですが、 私の場合はエラーが出たので対処しました。

トラブルシューティング

ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.

共有ライブラリのエラーらしいです。

  • libarmmem.soを無効化する
    • /etc/ld.so.preload
# /usr/lib/arm-linux-gnueabihf/libarmmem.so ← コメントアウトする

問題なく動きはしましたが.......

今ひとつ理解できていないので、どなたか教えて頂けるとうれしいです。

あと、LXDは自分でビルドしたほうが早かったかも......?

LXDの初期設定

  • 今回はブリッジインタフェースを使うように設定しました。
tomostone@raspberrypi:~$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=100GB]:
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Would you like LXD to be available over the network? (yes/no) [default=no]: yes
Address to bind LXD to (not including port) [default=all]:
Port to bind LXD to [default=8443]:
Trust password for new clients:
Again:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: y
...
/* ↑を`y`にすると設定が出力される */

確認してみる

  • コンテナの作成

    • sandboxという名前でUbuntu 16.04のコンテナを立てる例
    • $ lxc launch ubuntu:16.04 sandbox

  • コンテナの一覧を表示

tomostone@raspberrypi:~$ lxc list
+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| sandbox | RUNNING | 192.168.116.69 (eth0) |      | PERSISTENT |           |
+---------+---------+-----------------------+------+------------+-----------+

例えば$ lxc exec sandbox bashとすることで、コンテナのシェルが使えます。

IPアドレスを固定したい」みたいなときも、コンテナ側から設定すればOKです。

このあと

コンテナを利用して、色々なサーバを立ててみます。

先ずはファイルサーバとかですかね。

参考にしたページ

Linux Containers - LXD - イントロダクション

Raspberry pi, libarmmem.so (cannot open shared object file) error - Stack Overflow

Raspberry Piにブリッジインタフェースの設定をする

ラズパイにLinux Containers(LXC)を導入して遊び倒したい!

やったこと

  • ブリッジインタフェースの設定
  • ついでにGigabit Ethernet化(USB2.0に変換)

3B+だったら2つ目は不要とか言ってはいけない

LXCでブリッジインタフェースを使いたかったので、その準備をします。

調べた感じ、Debianも同じ手順でできそうです。

環境

インタフェースの切り替え

  • ついでといいつつ、先にUSBに接続したeth1インタフェースに切り替える作業
    • /etc/dhcpcd.conf
...
# eth0の設定をコメントアウトします
interface eth1
static ip_address=192.168.116.1/24 # IPアドレスの設定は適宜読み替えてください
static routers=192.168.116.254
static domain_name_servers=192.168.116.254 1.1.1.1
  • サービスの再起動
    • # systemctl restart networking

これで、eth1インタフェースで接続できることを確認できればOK。

ブリッジインタフェースの設定

  • bridge-utilsをインストールする

    • # apt install bridge-utils

  • /etc/network/interfaces

auto br0
iface br0 inet manual
        bridge_ports eth1
  • /etc/dhcpcd.conf
# 先ほどの設定をコメントアウトします
interface br0
denyinterfaces eth0 eth1
static ip_address=192.168.116.1/24
static routers=192.168.116.254
static domain_name_servers=192.168.116.254 1.1.1.1
  • サービスの再起動

    • # systemctl restart networking

  • br0インタフェースが有効になっているか確認

    • # brctl show
user@raspberrypi:~$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.1cc03501ac96       no              eth1

おまけ: スループット計測してみる

今回はiperfを使用しました(ノートPCをクライアントとして使用しています)。

user@raspberrypi:~$ iperf -c 192.168.116.1 -u -b 100M -t 10 -i 2
------------------------------------------------------------
Client connecting to 192.168.116.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.116.66 port 57261 connected with 192.168.116.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 2.0 sec  24.0 MBytes   101 Mbits/sec
[  3]  2.0- 4.0 sec  24.0 MBytes   101 Mbits/sec
[  3]  4.0- 6.0 sec  24.0 MBytes   101 Mbits/sec
[  3]  6.0- 8.0 sec  24.0 MBytes   101 Mbits/sec
[  3]  8.0-10.0 sec  24.0 MBytes   101 Mbits/sec
[  3]  0.0-10.0 sec   120 MBytes   101 Mbits/sec
[  3] Sent 85470 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   114 MBytes  95.6 Mbits/sec   0.017 ms 4079/85469 (4.8%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order
user@raspberrypi:~$ iperf -c 192.168.116.1 -u -b 340M -t 10 -i 2
------------------------------------------------------------
lient connecting to 192.168.116.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.116.66 port 39948 connected with 192.168.116.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 2.0 sec  82.4 MBytes   345 Mbits/sec
[  3]  2.0- 4.0 sec  82.4 MBytes   346 Mbits/sec
[  3]  4.0- 6.0 sec  82.3 MBytes   345 Mbits/sec
[  3]  6.0- 8.0 sec  82.3 MBytes   345 Mbits/sec
[  3]  8.0-10.0 sec  82.4 MBytes   346 Mbits/sec
[  3]  0.0-10.0 sec   412 MBytes   345 Mbits/sec
[  3] Sent 293741 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   391 MBytes   328 Mbits/sec   0.045 ms 15100/293740 (5.1%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

結果は95.6Mbps → 328Mbps。 こちら(3B+)よりもいい結果がでました。

参考にしたページ

https://blog.ymyzk.com/2018/05/raspbian-9-stretch-bridge-interface/ https://www.jeffgeerling.com/blog/2018/raspberry-pi-3-b-review-and-performance-comparison

Raspberry PiにHDDを繋いで、OSをインストール

USBブートは上手くいきませんでした......(;-ω-)

やったこと

  • USB接続したHDDにOS(Raspbian)をインストール
  • microSDカード内のブートローダから、HDD内のRaspbianを起動する設定

今回は環境を一新&USBブート化したいと思って、 microSDカードにddコマンドでイメージファイルを書き込む操作を、 HDDに対してやってみました。

とりあえず"環境を一新"するほうはできたのでメモ。

環境

  • ハードウェア
    • Raspberry Pi 3B ("+"じゃないほう)
    • microSDカード(16GB, class10)
    • HDD (2TB, 3.5inch)
    • SATA USB 3.0 変換アダプタ(ACアダプタ付き)

  • OS

HDDにOSをインストール

今回はmicroSDカードに入っているRaspbianから操作しています。

  • HDDの接続を行う
  • バイスファイルを確認(今回はsdaがHDD、mmcblk0はSDカード)
    • 以下はblkidを使った例
user@raspberrypi:~$ blkid
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  1.8T  0 disk
mmcblk0     179:0    0 14.7G  0 disk
├─mmcblk0p1 179:1    0 43.1M  0 part /boot
└─mmcblk0p2 179:2    0 14.6G  0 part /
  • OSのイメージファイルを用意する
    • 私はPCで公式サイトからDLして、それからラズパイに転送しました
    • 今回は2018-11-13-raspbian-stretch-lite.zip

  • ファイルを解凍する
    • $ unzip 2018-11-13-raspbian-stretch-lite.zip

  • HDDにイメージファイルを書き込む(危険なコマンドなので慎重に)
    • # dd bs=4M if=2018-11-13-raspbian-stretch.img of=/dev/sda conv=fsync

  • パーティションの拡大
    • 注: この段階ではUSBブートしようとしていたのでブート領域をそのままにしています
root@raspberrypi /home/user# parted /dev/sda

(parted) print

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  50.2MB  46.0MB  primary  fat32        lba
 2      50.3MB  1866MB  1816MB  primary  ext4

(parted) resizepart 2 100%
(parted) print

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  50.2MB  46.0MB  primary  fat32        lba
 2      50.3MB  2000GB  2000GB  primary  ext4

(parted) quit

ブートローダの設定

※USBのみでブートしたい場合はやることが異なるので注意

  • ブートローダとルートパーティションのPARTUUIDを確認する
    • $ blkid
    • 今回はmmcblk0p1sda2の項を確認

  • /boot/cmdline.txtの変更 (追記しました)
    • ex. # vi /boot/cmdline.txt
    • XXXXXXXXsda2のPARTUUIDに読み替えてください
    • また、自動でパーティションを拡張するスクリプトを無効化します(init=/usr/lib/raspi-config/init_resize.shという部分を削除)
... console=tty1 root=PARTUUID=XXXXXXXX rootfstype=ext4 ...

書き込んだRaspbianの設定

  • sda2をマウントする
    • # mount /mnt/ /dev/sda2

  • fstabのPARTUUIDを書き換える
    • ex. # vi /mnt/etc/fstab
    • YYYYYYYYmmcblk0p1のPARTUUIDに読み替えてください
proc            /proc           proc    defaults          0       0
PARTUUID=YYYYYYYY  /boot           vfat    defaults          0       2
PARTUUID=XXXXXXXX  /               ext4    defaults,noatime  0       1
  • sda2をアンマウントする
    • # umount /mnt

結果

うまく設定できていれば、

  1. 電源を投入
  2. microSDカードのブートローダが起動
  3. ブートローダがHDDのルートパーティションを読み込み、ブートする

みたいな流れでRaspbianが起動します。

上手くいかなかった場合は他のPCを使って設定を直しましょう。

ディスクIOのベンチマーク

hdparmはAPTのパッケージが使えます。 - # apt install hdparm

user@raspberrypi:~$ sudo hdparm -t /dev/mmcblk0 

/dev/mmcblk0:
 Timing buffered disk reads:  30 MB in  3.09 seconds =   9.71 MB/sec

user@raspberrypi:~$ sudo hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 102 MB in  3.02 seconds =  33.77 MB/sec

およそ270Mbps。 USB2.0の理論値(480Mbps)には届かず。

USBブートできなかった原因

$ dmesg | less

...
[    2.551665] usb 1-1: New USB device found, idVendor=0424, idProduct=9514
[    2.563530] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    2.576437] hub 1-1:1.0: USB hub found
[    2.585444] hub 1-1:1.0: 5 ports detected
...
[   11.301430] usb 1-1.2: new high-speed USB device number 5 using dwc_otg
[   11.442967] usb 1-1.2: New USB device found, idVendor=174c, idProduct=55aa
[   11.455298] usb 1-1.2: New USB device strings: Mfr=2, Product=3, SerialNumber=1
[   11.468045] usb 1-1.2: Product: 3.0
[   11.476864] usb 1-1.2: Manufacturer: USB
[   11.486118] usb 1-1.2: SerialNumber: 000000000001
[   11.496730] usb-storage 1-1.2:1.0: USB Mass Storage device detected
...

おそらくHDDがスピンアップする前にタイムアウトしたのでしょうね... (program_usb_boot_timeoutでも5秒でタイムアウト)

まとめ

ひとまずラズパイで大きなストレージが扱えるようになったので、良しとします。

USBブートしたい方は、ちょっと奮発してSSDとかにするのもアリなのかもしれませんね。

参考にしたページ

https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
https://www.raspberrypi.org/forums/viewtopic.php?t=209416
https://wiki.archlinux.jp/index.php/GNU_Parted
https://www.raspberrypi.org/forums/viewtopic.php?t=164500

# はじめてのブログ

はてなブログ、始めました

いやですね、私の周りにいる技術力のある方々が、
こぞってブログなどで技術的な記事をアウトプットしていたんです。

私「うわぁ! カッコいいですね〜!」
強い知人とか先輩とか「tomo_stoneもやってみたら?」

おっしゃ私も始めたろ。

というわけで、こちらには技術ネタ(主にネットワークかな?)を中心に、
Twitterには長すぎるメモや文章、何か思ったことetc.をゆるーく書ければと。

まずは自己紹介とか

tomo_stone (ともすとーん) と申します。

つよつよなITエンジニアになりたい学生です(後述)。
情報分野、特にネットワークを学んでいます。

最近うれしかったことは、CCNA合格をもぎ取ったことですかね。

あと、趣味はネットサーフィンとかです。

つよつよ "ITエンジニア" になりたい?

あえてぼかしました。というのも、

  • ネットワークエンジニア
  • サーバエンジニア
  • ↑ などをいろいろやるインフラエンジニアってのもある
  • ↑ の業務で使えるソフトを開発するシステムエンジニアってのも

はい。要するに迷っているのです。

もっともネットワークに興味を持ったのも大学入ってからなので、
業界の様子がさっぱりというか......。

イベント行くなりして、色々見聞きして考えようと思います。

結び

とりあえず今回は自分語りしてみましたが......
ブログの最初のエントリーってこんな感じでいいんですかね?

そんなわけでこれから、色々書いていこうと思います。
特に、技術的に学んだことは忘れないうちにアウトプットしたいですね。

最後まで読んでいただき、ありがとうございました。