Gentoo Linux で kvm-qemu: Gentoo Linuxゲストを作成する


 以前、Gentoo Linuxベースの kvm ホストを作成するところまで紹介したが、次は kvm 上で動くゲストに Gentoo Linux をインストールする。

 まずディスクの準備をする必要がある。kvm 関係の記事をググるとよく raw イメージや qcow2 で仮想ディスクを作っているが、開発環境で検証していたときは qcow2 で運用していたものの、最終的に Xen から引き続き LVM で仮想ディスクを作成した。ディスクイメージのほうがポータブルではあるが、今回はそもそもポタービリティが必要ではないこと、バックアップで LVM スナップショットを使いたかったことによる。

 lvcreate で論理ボリュームを作成したらそれを元に kvm を起動する。検証環境では NIC が 1 つしかなかったので直接 qemu-kvm コマンドで

qemu-kvm -net nic,model=virtio \
-net tap,script=/etc/qemu/qemu-ifup,downscript=/etc/qemu/qemu-ifdown \
-m 2048 -drive file=/var/lib/kvm/beta.choita.me.img,if=virtio,boot=on \
-vnc 192.168.1.201:0 -smp 2

などとして起動していたが、仮想環境をホストしているマシンでは

  • グローバル IP を割り振れる NIC
  • LAN に接続されている NIC
  • DB サーバと接続されている NIC

と 3 口あって qemu-ifup では対応し切れず面倒なので、libvirtd によしなにやってもらうことにした。

USE="lvm qemu virt-network" emerge libvirtd virt-manager

してインストールしたら、virt-install で仮想マシンを作成する。この時点では、VirtIO は指定しないようにしておく。

virt-install --name=kvm001 --connect=qemu:///system --ram=2048 --vcpus=2 \
--os-type=linux --virt-type=kvm --disk path=/dev/lg00/lv00 \
--cdrom=/root/install-amd64-minimal.iso --keymap=ja \
--network=bridge:br0 --network=bridge:br1 --hvm \
--vnc --vncport=5900 --vnclisten=0.0.0.0

うちの環境だと Gentoo minimal CD-ROM の ISO イメージがマウントされていなかったので、一旦 virsh destroy kvm してホストを強制終了してから virsh edit kvm で XML を編集し、CD-ROM を無理やりマウントして対応した。

 virsh start kvm 後は VNC で接続して通常通り Gentoo のインストールを行うが、一点だけ注意する箇所がある。gcc の最近のバージョンでは -mtune=native -march=native オプションで各 CPU に最適化されたバイナリを吐き出してくれるが、kvm-qemu 上ではこれは使えない。理由は簡単で、BIOS が返す CPU のモデル名が QEMU Virtual CPU version 0.15.0 などになってしまい、最適化ターゲットが絞れないのだ。

 そのため、-mtune=native -march=native と同等の最適化を行うためには、一旦このオプションを展開の上、対応するオプションを指定する必要がある。

 gcc -march=native -E -v - 2>&1 | grep cc1 すると以下のようにオプションが展開されるので、

/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.3/cc1 -E -quiet -v - \
-D_FORTIFY_SOURCE=2 -march=amdfam10 -mcx16 -msahf \
-mpopcnt -mabm --param l1-cache-size=64 --param \
l1-cache-line-size=64 --param l2-cache-size=512 \
-mtune=amdfam10

そこから最適化オプションを抽出すれば良い。今回は -march=amdfam10 -mcx16 -msahf -mpopcnt -mabm --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10 がそれに該当するので、これを CFLAGS に反映する。

 あとは通常通り Gentoo Linux をインストールしていく。カーネルの再構築では、当初は rtl8169 など仮想環境でエミュレートされているハードウェアを選んでいくが、それと同時に VirtIO ドライバをコンパイルしておく。最終的に grub をインストールし、Gentoo Linux 環境が立ち上がるようになれば ok。

 次回以降、こうして作ったゲストを VirtIO で準仮想化していく。