逆噴射式

kvm

Debianでvmwareを愛用してきたのだけど、最新カーネルだと妙に不安定(any-anyを無理矢理当ててるってのもある)で困る。
そこで最近赤丸急上昇という噂を小耳に挟んだような気がほんのりとしているkvmを使ってみたのでメモ。

aptitude install kvm qemu

これだけだよ!!かんたんだね!!
うそ


以下、試行錯誤をそのまんまメモってるのであまり参考にはならないかも。
一旦戻って前提条件へ。
うちの家のネットワークってLinux Box(gw)は1台でNIC2枚刺して、eth0はBフレからPPPoEで外に出て、eth1は192.168.1.1でLANに繋がってて、NATになってます。
Windowsで走らせておきたいプロセスがある&メインのPCではやりたくないので、このgwでvmwareを立ち上げ、eth1にブリッジして192.168.1.5とか振ってる感じ。
これをkvmに置き換えようという作戦。
とりあえずネットワークはおいといて、kvmを走らせるところまでやってみるが吉。
独学Linux:UbuntuのKVMで試す仮想化環境 – livedoor Blog(ブログ)
この記事のステップ2までやればkvmコマンドが叩ける状態までは行くと思いま。
kvm(というかqemu?)にはvncが内蔵されているので、X無しでもリモートから操作出来ます。
vmwareのようにリモートから電源ボタンまでGUIGUI押せる的な便利インターフェースではないですが、うちのケースではgwにXとか入れてませんのでvncを使います。

/usr/bin/kvm -hda /path/to/virt_hdd.img -m 1024 -vnc :0 -cdrom /path/to/install_cd.iso -localtime -net nic -daemonize -boot d

こんな感じで起動すると、gwマシンの:0にvncで繋げるはず。
HDDイメージのとことCDイメージのとこは適宜環境に合わせて、-mはメモリ量(ここでは1G)、-boot dはCD起動なので2回目からは外す。
-vnc :0のところは既にvnc立ち上げてるマシンなら番号変えてちょ。
-localtimeはゲイツOS的事情。Linuxだと-no-acpiする必要があるかも。
kvmをrootで起動していいなら多分これだけで(ネットワーク以外は)いけます。
一般ユーザだと/dev/kvmがアクセス出来ないので、kvmグループに入れてやる必要があります。
あと、ifconfigとか叩けないといけないのでsudoの設定も要ります。
まどいなら、rootでやっちゃいなよ!!
ではネットワーク。多分Xenと同じなのだと思う。Xen使ったことがないけど。
(うちLinux Box1個しかなくて、こいつルータだから、これをハイパーバイザ構成にするのはさすがに怖い)
ネットワークはuserモードとtapモードがあるんですが、はっきり言ってuserモードは簡単ですがつかえねーです。デスクトップ向けモード?
tapモードはvmwareで言うところのブリッジモードなんですが、ブリッジIFを別途自分で用意してやらないといけません。
大ざっぱな流れから。まず使用する外部(物理)IFをpromiscuousモードにして何でも受け取る子にします。

/sbin/ifconfig eth1 promisc up

(あー、これやるとeth1から繋いでるsshとか全部死んじゃうのでコンソールからやりましょう)
ブリッジIFを作成します。

/usr/sbin/brctl addbr br0

これにpromiscuous化したeth1を繋ぎます。

/usr/sbin/brctl addif br0 eth1

これでeth1から来た全パケットはとりあえずbr0に流れ込むようになりました。
このままだと192.168.1.1さんが行方不明になってしまいますが、これはbr0にIPアドレスを振ってやれば受け取れます。
eth1に192.168.1.1振ってそれ以外はbr0に投げるような形にしたかったけどなんか上手く行かんかった。
eth1にIPアドレス振っても、eth1から外に行こうとするパケットまで全部br0に行っちゃって外に出られない……という認識でいいの?
で、ここまでのを設定として書くとこんな感じになりました。
まず、/etc/network/interfaces。eth1はごそっと消して

auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
mtu 1500
pre-up /sbin/ifconfig eth1 promisc up
pre-up /usr/sbin/brctl addbr br0
post-up /usr/sbin/brctl addif br0 eth1
pre-down /sbin/ifconfig eth1 down
post-down /sbin/ifconfig br0 down
post-down /usr/sbin/brctl delbr br0

起動時は、eth1をpromiscで上げて、br0なブリッジIFを生成、ここまでpre-up。
192.168.1.1としてbr0を使えるようにする。
post-upでeth1をbr0に繋ぐ。
終了時は、eth1を落とし(これで自動的にbr0からも切れる)、post-downでbr0を落とし、ブリッジIFを削除。
次に、/etc/kvm/kvm-ifup。ブリッジIF(switch)を自分で探すような作りになってますがNIC2枚刺しだとbr0が見つからなくてキョドります。なのでずんばらりんと消しちゃって

#!/bin/sh
/sbin/ifconfig $1 0.0.0.0 up
/usr/sbin/brctl addif br0 $1

これでおk
あとはkvmの起動オプションに-net tapを追加してやればいいです。
kvm自体の起動スクリプトはinit.dに置けばいいんだけど、終了時にgracefulな死に方をする方法がまだ良く分かんない。できないのかもしれない。
start-stop-daemonで素直にkill飛ばしたらゲスト側からは電源ブッコ抜かれたような動作になるので、vmwareみたいに「電源ボタン押されたつもり」の動作をして欲しいなぁと思いつつ、手動でやれば実害もないので放置中。

/usr/bin/kvm -hda /path/to/virt_hdd.img -m 1024 -vnc :0 -localtime -net nic -net tap -daemonize

一旦インストールしてしまえばCDとかいらねーのでこんな感じに。
起動後にCD入れ替える方法が分からないけど、もしかしてvncベースの起動だと無理?

One thought on “kvm
  • [仮想PC] KVM+QEMU on UbuntuでAMD-V

    仮想PC、今度は「KVM」+「QEMU」にトライ中です。 もうほとんどビョーキですね。
    しかし、かなりサクサク動く印象です。

コメントを残す

メールアドレスが公開されることはありません。

*