こつこつと

2008/11/28

KVM + Virtio on Gentoo

ひさしぶりに、更新。
今回は、KVM(Kernel Based Machine)を使ってみた。

発端は、久しぶりにPCを組んだこと。
なにかといじくるのに、今、性能の良いマシンが手元になかったので、一台、2年ぶりくらいに作ってみた。

構成は以下の通り。
  • CPU: Phenom X4 9950BE (x15に倍率変更して、3GHzで駆動)
  • Memory: DDR2-800 2GB x 4 = 8GB(UMAXの安いの)
  • MotherBoard: GIGABYTE GA-MA78GPM-DS2H
  • 電源:剛力プラグイン 450W
  • DISK: とりあえず、HGSTの500GB 5400rpmのやすいやつ。
  • ケース: DC-ACPCD/R(いわゆる、まな板)
これで、約45,000円、なんか価格に対する性能が半端ない気がします。
まな板 に組んでるので、家に普通に設置するには向きませんが、うちの会社の足下に今は放置されてます。
ちなみに、まな板とマザーは、マザー裏側につけられているファン固定用のプラスチックが干渉して、
ねじ止めできないことが発覚。なので、まな板の上に、置いているだけです。
また、5インチベイにマウントするなにかがあったほうがいいです。
まな板は、構造上、DVD-ROMドライブなどで、アクリル板を支えるようになっているようです。
とりあえず、私は、適当な雑誌で代替してます。

これくらいの性能のマシンだと、そのまま使っても性能使い切れないだろうなぁ、とおもったのが発端。
それで、ちょうどUPnPとかDLNAといった単語が飛び交う仕事もあったりしたので、
この手の環境つくるのに、物理的に複数マシンを用意するのは無駄だな、ってことで、
KVMをいれてみようということになりましたとさ。
んで、調べてると、CPUだけじゃなく、メモリ、ディスク、NIC、RTC?も準仮想かされているって記述があり。
そのへんをvirtioという形ですでに、kernelにマージされているらしいということで使ってみた。
virtioは、基本的に、ゲスト側もドライバが必要です。Windows向けも配布されてます。

まず、このマシンにGentoo 2008.0のinstall CDをもってきてインストールします。
ちなみに、インストールは、SD+USBのリーダーから行いました。このへん見れば、簡単にできます。
あ、メモリ8GBもつんでるし、ってことで、x86_64をインストールしてること前提。
まあ、i386でも、それほど差はないかも。amd64は、Portageで、MASKされまくってるので、むしろそっちのほうが楽?

こちらは、おそらく特に問題なく入るはず。
カーネルの設定は、
  • DISKは、BIOS設定で、とりあえず、全部AHCIにしとけば、カーネルもAHCI有効にしておけばOK。
  • TIMER関係は、virtioの性能向上のために、高精度、高頻度にしとくのが吉らしい。
  • Soundは、SB700は、Intel HD Audioで動く。
    (BIOSで無効にしてても、中途半端に認識する、が音(アナログ)は鳴らないので注意!これで、3時間くらいはまった。)
  • NICは、r8169なので、とくに問題なく動く。
  • Virtualizationから、KVMを有効にしとく。
これくらいで。あとは、手順通りにインストールすれば、すんなりいくはず。

肝心のKVM。
なんか今の環境は、いろいろ試行錯誤したので、結局、素でソース持ってきて、最新版(KVM-79)を使った。
でも、たぶん、Virtioとかはうごくので、PortageのKVM-78でいいかも。

ここからは、一応、Portage使うの前提で。
あ、手でKVMをコンパイルすると、
何故かKVMのconfigureスクリプトがフィルタ(enable/disableが含まれているものしか出さないようにしている?)して、
qemuのac97が有効にするオプション(--audio-cardlist)が./configure --helpで出てこないので、
$ ./qemu/configure --help

も実行してみて、KVMのconfigure実行時にほしいオプションは付け加えるが吉。
kqemuはたぶん、有効にしないほうが安全っぽい。

■Portageからのインストール
GentooのPortageから入れようとすると、~amd64は、Maskされている。
ので、Overlayを作る。
まず、/etc/make.confに
PORTDIR_OVERLAY=/usr/local/overlays

を追加。

# mkdir /usr/local/overlays
# mkdir /usr/local/overlays/app-emulation
# cp -a /usr/portage/app-emulation/kvm /usr/local/overlays/app-emulation/


で、KVMをコピーしてくる。
んで、kvm-78.ebuildのKEYWORDS="~amd64"となってるところを"amd64"(チルダを外す)だけ。
Digest作り直し。
# ebuild kvm-78.ebuild digest


そして、インストール。といきたいけど、道連れ(依存関係)でインストールされるqemuがこのままだとインストールできない。
gcc3系が必要だとのこと。
(ちなみに、KVM-79を手で落としてきて、x86_64なものだけをコンパイルするなら、gcc4.1.2でもいけた。)

なので、まず、
# emerge -av sys-devel/gcc:3.4

として、gcc3を入れる。gcc-3.4.6が入った。

んで、gccを変更。
# gcc-config -l

で、今使えるgccのリストが出る。gccって、こんな機能あったんだね、とひとりで感心。
余談ですが、crossdevで、クロスコンパイラ入れてると、それも出てきた。

左の添え字を指定すると切り替えれる。2がgcc-3.4.6だったら、
# gcc-config 2

んで、/etc/profileを読み直せ、と言われるので、
# source /etc/profile


この状態で、
# emerge qemu

とすると、インストールできるはず。

そして、gccをもとに戻す。
# gcc-config -l
# gcc-config 7


そして、
# emerge kvm

でインストールできるはず。

この後、kvmをロードする。AMD Phenomなので、
# modprobe kvm_amd

でいけた。

そして、Gentoo用のHDDイメージ作成とインストール
ここでも、試行錯誤の結果、virtio_blkを有効にして起動しちゃうと、ゲスト側のkernelが2.6.25以上じゃないと、
ディスクが認識されないので、だめぽ。
まあ、model=scsiとかを指定して、インストールすればいけるんですが、
それはちょっとカコワルイとか、意味のないことをおもったので、手順を軽く変更しました。

とりあえず、Gentooのインストール作業は、Linuxが動いていればそれなりにどうにかなるので、
Ubunto 8.10のインストールCDで起動してインストールしちゃいます。
てことで、適当に、ubuntuのインストールCDのISOイメージをダウンロードしてきます。

それに先だって、まずは、インストール先のHDDイメージ作成。
# kvm-img create -f qcow2 gentoo.img 60GB

で、qcow2という伸縮するimgができるみたい。とりあえず、60GBで作った。

そして、インストール用に以下のようなオプションで起動。(オプションの意味は、man qemuとかで。)
$ export QEMU_AUDIO_DRV=alsa
$ sudo kvm \
-m 2048m -monitor stdio -curses -vnc :0 \
-vga vmware \
-soundhw ac97 \
-drive file=hdd_image/gentoo.img,if=virtio,boot=on \
-localtime -k ja \
-net nic,vlan=0,model=virtio,macaddr=52:54:00:12:34:00 \
-net tap,vlan=0,ifname=tap0,script=scripts/ifup \
-cdrom install_image/ubuntu-ja-8.10-desktop-i386.iso \
-boot d


あ、ネットワークは、NATでなく、ブリッジで動かしてます。
なので、modprobe tunは実行しておく必要ありです。
また、ホスト側のマシンで、あらかじめブリッジを構築しておく必要があります。
それで、/dev/net/tunは、groupにrwの権限あたえたのですが、うまく動かなかったので、
sudoして、rootで動かしてます。これはどうにかしたい。

script/ifupは以下のような内容。
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
sudo /sbin/brctl addif br0 $1

たしかこれは、どっかからぱくってきただけ。

んで、起動すると、Ubuntuがあがってくるはず。最悪、Xは起動しなくてもOK。コンソールだけでもインストールはできる。
そして、VNCクライアントを用意します。
これは、Windowsだと、UltraVNC、Macだと、Vine Viewerを使っています。(Chiken of VNCはうまく動かんかった。)

そして、通常と同じ手順でインストールをしていきます。
ただし、ディスクは、/dev/vdaとして認識されているので、注意。
カーネル構築時には、virtio関連を、Mではなく、yでカーネルに組み込みます。
はじめは、genkernelでinitramfsで起動しようとがんばってみたけど、
/usr/share/genkernel/x86/modules_load
に、virtio_blkを書いても、どうもうまくいかんかったので、挫折。なんでかはわからずじまい。

Grubインストールは、Gentooのstage3 tarball付属のでは、どうも/dev/vd*に対してのインストールは対応してない模様。
なので、苦肉の策で、Ubuntuのほうに、chrootな環境から抜けて、Ubuntuに付属のgrubでインストールをする。
そこでも、grub-installコマンドでは、どうもうまくいかんかったので、
# grub

で、とりあえず、コンソールにはいって、
# root (hd0, 0)
# setup (hd0,0)

なら、うまくいった。謎。
あ、あと、/boot/grub/device.mapもたぶん、(hd0,0) /dev/vdaとか手で書き加えた。
これで、一回、シャットダウンします。

そして、もう一回、qemu起動。
$ export QEMU_AUDIO_DRV=alsa
$ sudo kvm \
-m 2048m -monitor stdio -curses -vnc :0 \
-vga vmware \
-soundhw ac97 \
-drive file=hdd_image/gentoo.img,if=virtio,boot=on \
-localtime -k ja \
-net nic,vlan=0,model=virtio,macaddr=52:54:00:12:34:00 \
-net tap,vlan=0,ifname=tap0,script=scripts/ifup


cdrom関連のオプションを外して、起動します。
これで、うまく起動できたら、成功。
あとは、通常のGentooとして使えます。

うちの環境だと、
ディスクは、90MB/s前後出ています。快適。
ネットワークも、100Mbps前後は出ているようです。

ちなみに、Ubuntuだとこんな苦労なしに、さくっと入ります。
でも、Gentooをがんばっていれてみたかったので、楽しかったです。

次回があれば、このVM上で、CoherenceというDLNAサーバを動かしてみる話を書くかも。

0 件のコメント: