Linux

2010年6月 8日 (火)

Ubuntu 10.04 で KVM の vhost-net を試す

またまたインフラ屋の山本です(プロジェクトマネージャーだったり、CTOだったような気もします)。こんにちは。
今日は先日リリースされた Ubuntu 10.04 LTS で KVM の最新機能を試そうというお話です。

解説する必要はさらさら感じませんが、KVMというのは RedHat さん一押しの Linux カーネルに標準搭載されている仮想マシン支援機構です。実際には、QEMU というシステムエミュレーターと組み合わせて使います。最近ではその上にさらに libvirt という便利ツールで仮想マシンを構築するのが普通だと思います。

KVMを実際に評価すると、VMware と比較してまだまだ残念なところがあります。性能面では、I/O性能が良く言われているところでしょう。で、ネットワークの I/O 性能を改善する vhost-net というカーネルモジュールが開発されていて、Linux 2.6.34 でメインラインに取り込まれています。QEMUでも対応が必要で、これはまだリリース前の開発版です。

で、本題。Ubuntu 10.04 は Linux 2.6.32 ですので、まだ vhost-net が使えません。正確にはホスト側が対応必要で、ゲスト側の virtio ドライバは 2.6.31 以降なら大丈夫という状況です。Ubuntu 10.10 を待ってから評価する手もありますけど、今どうしても試してみたいとう方は以下のようにしてみるとできるかもしれません、YMMV

1.Linux 2.6.34 の Ubuntu パッケージを持ってくる
      http://jp.archive.ubuntu.com/ubuntu/pool/main/l/linux/ に行って、
      linux-image-2.6.34-5-server_2.6.34-5.14_amd64.deb を拾ってきます。
      Ubuntu 10.10 α1 のパッケージだと思いますけど、10.04 にインストールできるので気にしない ;)

2.VMホストに linux-image-2.6.34-*.deb をインストールする
     # dpkg -i linux-image-2.6.34-5-server_2.6.34-5.14_amd64.deb
     # reboot

3.リブート後に vhost-net カーネルモジュールを読み込んでみる
     # modprobe vhost-net

4.QEMU 開発版を git clone して持ってくる
     $ sudo apt-get install git-core
     $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/mst/qemu-kvm.git vhost

5.QEMUをコンパイルする
     $ sudo apt-get install gcc zlib1g-dev libpci-dev libaio-dev uuid-dev ncurses-dev
     $ ./configure --enable-io-thread
     $ make && sudo make install
     コンパイルエラーが出たら適当に直してください :)

6.新しい QEMU でゲストVMを立ち上げてみる
     $ sudo /usr/local/bin/qemu-system-x86_64 -enable-kvm -name vm \
        -usb -drive file=/path/to/drive.img,if=virtio,index=0,boot=on,cache=none \
        -net nic,vlan=0,model=virtio \
        -net tap,ifname=your_bridge-tap,vlan=0,script=/your/ifup/script,downscript=/your/ifdown/script,vhost=on

最後のオプションが vhost-net を有効にします。こんなの試したい人は ifup や ifdown をどうすればいいか分かると思うので、そのあたりは省略。libvirt も最新版なら vhost-net が使える場合は自動的に使うようになっているらしいですよ。

--
twitter:tnnrg

2010年5月21日 (金)

MACアドレスからIPを自動設定する

最近はもっぱらインフラ屋の山本です。

今回のネタは掲題の通り、NICのMACアドレスからIPを自動設定できるかな、
ということでやってみました。ちなみに背景としては、

1.VMの仮想NICのMACアドレスは自己管理していて、KVMだと上3バイトは
      52:54:00 で固定で、下3バイトで管理。
2.IPアドレスは10.0.0.0/8 なので、下3バイトで管理。お、MACと一緒じゃん。
3.じゃ、VMのIP指定はDHCPとかじゃなくてMACアドレスでできるんじゃね?

てな感じです。

材料:

・ /sys/class/net/eth*/address
  Linux で各NICのMACアドレスはこのファイルを cat すれば入手できます
・ /etc/init/networking.conf
  Ubuntu の upstart ではネットワークの初期化はこいつがやります。
  なかでは "ifup -a" してるだけです。

方法:

/etc/init/networking.conf の exec で以下のスクリプトを実行するように変更します。

#!/bin/sh

INTERFACES=`(cd /sys/class/net; ls -d eth*)`

mac_to_ip ()
{
    shift 3
    ip1=`printf '%d' 0x$1`
    ip2=`printf '%d' 0x$2`
    ip3=`printf '%d' 0x$3`
    ip=10.$ip1.$ip2.$ip3
}

for if in $INTERFACES; do
 MAC=`cat /sys/class/net/$if/address | tr : ' '`
    mac_to_ip $MAC
    /sbin/ifconfig $if $ip netmask 255.255.240.0 up
done

以上、簡単3分ハッキングでした。

続きを読む "MACアドレスからIPを自動設定する" »

2010年4月30日 (金)

KVM にシリアルコンソールで Ubuntu をインストールする

最近はインフラ屋な山本です。

KVMにシリアルコンソールで Ubuntu をインストールする、と題しているわけですが、
やりたいことはこんな感じです。

  • インターネットにつながらない環境で
  • X Window System とか VNC とかを使わずに
  • Ubuntu Server をゲスト VM にインストール

実は、インターネットにつながる環境だとこれはとても簡単です。こんな感じ。

$ sudo virt-install --connect=qemu:///system -n test \
  -r 2048 --serial pty -v --disk=... --nographics \
  -l http://us.archives.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/ \
  --extra-args=console=ttyS0,9600

"-l http://..." を "-c ISO_FILE" に置き換えたいところなわけですが、うまくいきません。ブートローダーがシリアルコンソールを認識しないんですかね。

そこで少し考えると、上のコマンドがうまくいく理由はおそらく、kernel をダウンロードしてきて "console=ttyS0" というカーネルブートパラメーターを与えて QEMU だか KVM だかがブートローダーがわりにブートしているんでしょう。推測ですが。

そこまで推測したらやることはひとつ、ISO をループバックマウントです。こんな感じ。

$ sudo mount -t iso9660 -o loop,ro \
  ubuntu-10.04-server-amd64.iso /home/cybozu/cdrom

そして "-l http://..." を "-l /home/cybozu/cdrom/install" にしてみます。が、動きません。そこでおもむろに virt-install のコード(Python)を眺めると、以下のことがわかります。

  • OSDistro.py がディストリビューションの自動判別をしている
  • Ubuntu の自動判別に用いているファイルやディレクトリが ISO にはない
  • でも、ISOにブートに必要なカーネルや initrd は存在する

ここまでわかればやることはひとつ。OSDistro.py にパッチをあてちゃいましょう。パッチは Ubuntu 10.04 専用ですけど、やってることは単純なんで他の distro に対応させたければ同じようにやってみてください。

あとひとつ。OSDitro.py は元々ネットワークインストール用にできてるのですが、このパッチをあてることで、DVDブート用のカーネルを立ち上げるようになります。が、当然 DVD が見える必要があるので、"--disk=ISO_FILE,device=cdrom,perms=ro" も追加します。

パッチをあてた virt-install で以下のように実行すると、見事シリアルコンソールで Ubuntu Server のインストールが開始できます。VNCやXやネットワークが使えないことはそうそうないでしょうけど、インフラ屋的にはとっても嬉しい?かなと。

$ sudo virt-install --connect=qemu:///system -n test -r 2048 \
  --serial pty -v --disk=... --nographics \
  --disk=ubuntu-10.04-server-amd64.iso,device=cdrom,perms=ro \
  -l /home/cybozu/cdrom/install --extra-args=console=ttyS0,9600

インストールが終わったら、そのままシリアル端末でログインできます。
ログインしたら、grub やゲストのVMカーネルがシリアル端末を使うように設定します。
c.f. Ubuntu Wiki

$ sudo vi /etc/default/grub
  GRUB_CMDLINE_LINUX="console=ttyS0,9600"
  GRUB_TERMINAL=serial
$ sudo update-grub $ sudo poweroff

最後にゲストVMの定義ファイルから、ISOファイルを削除しておきましょう。

$ virsh edit test
$ virsh start test

ゲストVMのシリアル端末には以下のコマンドでアクセスできます。

$ sudo virsh console test

以上です。

--
http://twitter.com/tnnrg