デュアルブートの代わりとしての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]…… ということでクリーンインストールがてらにごにょごにょした結果が先日のツイート。
デュアルブートをやめて、はや1週間 pic.twitter.com/vtWGA6Vllu
— tomo_stone (@tomo_stonehill) February 25, 2019
QEMU/KVMの仮想マシンなのですが、Intel GVT-gという機能を用いることでIntel純正のグラフィックドライバが動くGPUを、ホストOSと共有できます。 KVMでよくやるQXLドライバとは比較にならないくらい快適。
実は"Windowsエクスペリエンスインデックス"の値だけ見るとVirtualBox上のほうがスコアはいい[2]のですが、64bit版のDirect3Dはまだ不安定なようです。
Windowsエクスペリエンスインデックスのほうも貼っておきますね。
- ちなみにベアメタルだとこんな感じです。
まとめ
Windows10が"ちょっと重い"程度で普段使いできるVMが作れました。 また更新でおかしくなっても、影響範囲はVMの中のみなので、精神衛生上とっても嬉しいですね。
また、3Dアクセラレーションが不要ならVirtualBoxもアリかもしれません。
脚注
[1] ブラウザ版Office365で古い資料とかが崩れなければ、この考察は不要であった
[2] 一応マシンスペック等も載せておきます
物理構成
-
- 基本的に同条件
- 準仮想化I/F: KVM
- VideoRAM: 256MB
- ディスクイメージ: vmdk形式
Raspberry Piでコンテナ(LXC/LXD)を使う
これの続きです。 tomo-stone.hatenablog.com
やったこと
- Linux Containers(LXC)のインストール
- snapパッケージを導入する準備
- LXDのインストール・セットアップ
LXDはSnappyというパッケージ管理システムでインストールします。
(Ubuntuならapt
で入る)
環境
ハードウェア
- Raspberry Pi 3B ("+"じゃないほう)
- Raspberry Pi 3B ("+"じゃないほう)
OS
インストール作業
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)を導入して遊び倒したい!
やったこと
3B+だったら2つ目は不要とか言ってはいけない
LXCでブリッジインタフェースを使いたかったので、その準備をします。
調べた感じ、Debianも同じ手順でできそうです。
環境
ハードウェア
- Raspberry Pi 3B ("+"じゃないほう)
- Gigabit Ethernet USB3.0 変換アダプタ
- ノートPC (スループット計測に使用)
OS
インタフェースの切り替え
- ついでといいつつ、先に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をクライアントとして使用しています)。
- Fast Ethernetのとき
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ブート化したいと思って、
microSDカードにdd
コマンドでイメージファイルを書き込む操作を、
HDDに対してやってみました。
とりあえず"環境を一新"するほうはできたのでメモ。
環境
- ハードウェア
- Raspberry Pi 3B ("+"じゃないほう)
- microSDカード(16GB, class10)
- HDD (2TB, 3.5inch)
- SATA USB 3.0 変換アダプタ(ACアダプタ付き)
- OS
- Raspbian GNU/Linux 9.6 (stretch)
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のみでブートしたい場合はやることが異なるので注意
... console=tty1 root=PARTUUID=XXXXXXXX rootfstype=ext4 ...
書き込んだRaspbianの設定
sda2
をマウントする# mount /mnt/ /dev/sda2
fstab
のPARTUUIDを書き換える- ex.
# vi /mnt/etc/fstab
YYYYYYYY
をmmcblk0p1
のPARTUUIDに読み替えてください
- ex.
proc /proc proc defaults 0 0 PARTUUID=YYYYYYYY /boot vfat defaults 0 2 PARTUUID=XXXXXXXX / ext4 defaults,noatime 0 1
sda2
をアンマウントする# umount /mnt
結果
うまく設定できていれば、
みたいな流れで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エンジニア" になりたい?
あえてぼかしました。というのも、
- ネットワークエンジニア
- サーバエンジニア
- ↑ などをいろいろやるインフラエンジニアってのもある
- ↑ の業務で使えるソフトを開発するシステムエンジニアってのも
はい。要するに迷っているのです。
もっともネットワークに興味を持ったのも大学入ってからなので、
業界の様子がさっぱりというか......。
イベント行くなりして、色々見聞きして考えようと思います。
結び
とりあえず今回は自分語りしてみましたが......
ブログの最初のエントリーってこんな感じでいいんですかね?
そんなわけでこれから、色々書いていこうと思います。
特に、技術的に学んだことは忘れないうちにアウトプットしたいですね。
最後まで読んでいただき、ありがとうございました。