QEMUとHAXMによるハイパーバイザの利用


pkgsrc-2019Q1からemulators/haxmパッケージが提供されるようになりました。NetBSDでの仮想化環境は何のアクセラレータもないQEMUか、あるいはカーネルの入れ替えが必要なXenくらいしか選択肢がなかったように思えます。VMWareやVirtualBoxも動いていたようですがこれについてはよくわかりません。とにかく、ようやくNetBSDでもインストールしやすく高速な仮想化環境を使えるようになりました。

  1. HAXMとは
    1. HAXMの利点
    2. HAXMの欠点
  2. インストール
  3. QEMUを使う
    1. インストーラを取得する
    2. 仮想ディスクを作成する
    3. インストールする
    4. 起動する
  4. OS Gallery
    1. Debian GNU/Linux
  5. トラブルシューティング
    1. Failed to open the hax moduleというエラーが出る
  6. 参考文献

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には次のような利点があります。

HAXMの欠点

以上のような利点がある一方で、Rytarowskiは次のような欠点も指摘しています。

インストール

コンピュータの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
dmesg on NetBSD on QEMU with HAXM

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
Debian on QEMU with HAXM

トラブルシューティング

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を読めば大丈夫でしょう。