QEMUとHAXMによるハイパーバイザの利用
pkgsrc-2019Q1からemulators/haxmパッケージが提供されるようになりました。NetBSDでの仮想化環境は何のアクセラレータもないQEMUか、あるいはカーネルの入れ替えが必要なXenくらいしか選択肢がなかったように思えます。VMWareやVirtualBoxも動いていたようですがこれについてはよくわかりません。とにかく、ようやくNetBSDでもインストールしやすく高速な仮想化環境を使えるようになりました。
HAXMとは
HAXM(Hardware Accelerated Execution Manager)はIntel社から提供されているFLOSSのハイパーバイザです。Darwin, Linux, NetBSD, Windows上で動作します。HAXMはKamil Rytarowskiによってpkgsrc(7)に取り込まれ、pkgsrc-2019Q1でstable版として使えるようになりました。KVMやHVFと同じく、QEMUのアクセラレータとして利用します。
HAXMはVT-xが利用可能なIntel CPU上でのみ動作します。AMDや非x86アーキテクチャ上では利用できません。
HAXMの利点
Rytarowskiによれば、HAXMには次のような利点があります。
- BSDスタイルのライセンス
- 複数のプラットフォーム(Darwin, Linux, NetBSD, Windows)に対応している
- Intelのハードウェア仮想化支援機能を使っている
- NetBSDでは最大8、他OSでは最大64の仮想マシンを同時に実行できる
- 最大16のVCPUを仮想マシンに割り当てられる
ioctl(2)
ベースのAPI- 独立したカーネルモジュール
- QEMUとの互換性が標準で提供されている
- Intelの支援によって開発が進められている
- デスクトップ環境での利用に最適化されている
- FLOSSで複数のOSに対応した仮想化エンジンである(おそらく、唯一)
- 活発で熱烈なコミュニティによって開発が進められている
HAXMの欠点
以上のような利点がある一方で、Rytarowskiは次のような欠点も指摘しています。
- AMD CPUに対応していない
- 非x86アーキテクチャに対応していない
- 新しいIntel CPUが必要(EPTが必須)
- KVMのように組み込みやサーバ用途として適しているわけではない
- KVMより動作が20%ほど遅い
インストール
コンピュータのBIOSからIntel Virtualization Technology(VT-x)を有効にしてください。VT-xが有効にされていないとHAXMは動作しません。
emulators/qemuとemulators/haxmパッケージをインストールします。
cd /usr/pkgsrc/emulators/qemu
make install clean clean-depends
cd /usr/pkgsrc/emulators/haxm
make install clean clean-depends
HAXM用のdevice special filesを作成します。mknod(8)
のWrapperスクリプトがemulators/haxmパッケージで提供されているのでそれを使うと便利です。
haxm-mknod
HAXMのカーネルモジュールをhaxm-modload
コマンドでロードします。アンロードしたい場合はhaxm-modunload
コマンドを実行してください。
haxm-modload
カーネルモジュールのロードに成功すると、dmesg(8)
からhaxm_warning: -------- HAXM v7.4.1 Start --------
というメッセージを確認できます。
QEMUを使う
インストーラを取得する
ここではNetBSDをゲストOSとして仮想マシンにインストールします。任意のFTPサーバからNetBSDのインストーラをダウンロードしてください。
仮想ディスクを作成する
qcow2フォーマットで20GBの仮想ディスクを作成します。
qemu-img create -f qcow2 NetBSD.qcow2 20G
インストールする
qemu-system-x86_64
コマンドの-boot order=d
オプションを使い、NetBSDインストーラを起動して先ほど作成した仮想ディスクにNetBSDをインストールします。インストール手順は省略します。
qemu-system-x86_64 \
-m 2048M \
-smp cpus=2 \
-drive file=NetBSD.qcow2,if=virtio,format=qcow2 \
-device virtio-net,netdev=n0 \
-netdev user,id=n0 \
-boot order=d -cdrom ~/qemu/iso/NetBSD-8.0-amd64.iso \
-monitor telnet::4444,server,nowait \
-accel hax
見てのとおり、HAXMをQEMUと一緒に使うにはQEMUに-accel hax
オプションを渡します。
インストールが終わったらシャットダウンし、QEMUのモニタからsystem_powerdownコマンドを実行して仮想マシンの電源を落としてください。再起動してもISOファイルは自動で取り外されず、インストーラが起動してしまいます。
telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 3.1.0 monitor - type 'help' for more information
(qemu) system_powerdown
(qemu) q
Connection closed by foreign host.
起動する
インストール後は仮想ディスクからNetBSDを起動します。
qemu-system-x86_64 \
-m 2048M \
-smp cpus=2 \
-drive file=NetBSD.qcow2,if=virtio,format=qcow2 \
-device virtio-net,netdev=n0 \
-netdev user,id=n0 \
-monitor telnet::4444,server,nowait \
-accel hax
OS Gallery
Debian GNU/Linux
Debian GNU/Linuxを使うには、QEMUにno-acpi
オプションを渡してください。インストールISOからブートするときにこのオプションを渡さないと、黒い画面のまま動かなくなります。
qemu-system-x86_64 \
-m 4096M \
-smp cpus=2 \
-drive file=Debian.qcow2,if=virtio,format=qcow2 \
-device virtio-net,netdev=n0 \
-netdev user,id=n0 \
-no-acpi \
-monitor telnet::4444,server,nowait \
-accel hax
トラブルシューティング
Failed to open the hax moduleというエラーが出る
権限が足りていないと以下のようなエラーが出てHAXM付きでQEMUを使えません。
Failed to open the hax module
No accelerator found.
qemu-system-x86_64: failed to initialize HAX: Operation not supported by device
この場合、su(1)
かsudo(1)
を使いroot権限でQEMUを実行してください。
参考文献
- Kamil Rytarowski, Intel HAXM ——a hardware-assisted acceleration engine in the NetBSD kernel
- pkgsrc(7)にHAXMを取り込んだKamil Rytarowskiによる報告の論文です。これを読むとHAXMの概要についておおまかに理解できるのではないかと思います。
- HOWTO set up QEMU with HAX acceleration on NetBSD
- 実際にNetBSD上でQEMU-HAXMを動かすにはどのような手順を踏むのかが説明されています。カーネルにパッチを当ててビルドしたり、GitHubからHAXMのソースコードをcloneしてビルドする項目は読み飛ばして構いません。pkgsrc-wipをcloneする必要もありません。HAXMデバイスの作成は、上述した
haxm-mknod
スクリプトを一度実行すれば良いです。 - QEMU
- QEMUの操作方法はArchWikiを読めば大丈夫でしょう。