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 で準仮想化していく。