qemu networking

以下エントリを参考にしつつ云々してみます。

上記エントリの QEMU networking の項では /etc/qemu-if{down, up} を云々とあります。でローカル側確認してみたらファイルがありました。

$ ls /etc/qemu*
/etc/qemu-ifdown /etc/qemu-ifup

/etc/qemu:
target-x86_64.conf
$

中身を確認してみます。

$ cat /etc/qemu-ifdown 
#!/bin/sh

# NOTE: This script is intended to run in conjunction with qemu-ifup
#       which uses the same logic to find your bridge/switch

nic=$1

if [ -f /etc/default/qemu-kvm ]; then
    . /etc/default/qemu-kvm
fi

if [ -z "$TAPBR" ]; then
    switch=$(ip route list | awk '/^default / { print $5 }')
    if [ ! -d "/sys/class/net/${switch}/bridge" ]; then
        switch=virbr0
    fi
else
    switch=$TAPBR
fi

brctl delif $switch $nic
ifconfig $nic 0.0.0.0 down
$

あるいは ifup

$ cat /etc/qemu-ifup
#!/bin/sh

nic=$1

if [ -f /etc/default/qemu-kvm ]; then
    . /etc/default/qemu-kvm
fi

if [ -z "$TAPBR" ]; then
    switch=$(ip route list | awk '/^default / { print $5 }')
    if [ ! -d "/sys/class/net/${switch}/bridge" ]; then
        switch=virbr0
    fi
else
    switch=$TAPBR
fi

ifconfig $nic 0.0.0.0 up
brctl addif ${switch} $nic
$

これってもしかして bridge-utils って思ったんですが違う模様。ええと話を元に戻すと上記エントリでは ifup は以下に、とのこと。

#qemu-ifup
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap 0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 10.10.10.2 netmask 255.255.255.0

むむ。とりあえず実行してみるか。

$ sudo /etc/qemu-ifup
0.0.0.0: ERROR while getting interface flags: No such device
Incorrect number of arguments for command
Usage: brctl addif <bridge> <device>    add interface to bridge
$

あらら。こうかな。

$ sudo /etc/qemu-ifup wlan0
bridge virbr0 does not exist!
$

む。しかも通信できなくなっとるな。ちなみに /etc/qemu-ifdown wlan0 したら接続復帰しました。これ、現状 eth0 は使ってないのでソレを使う方が良いのかなぁ。
そもそもこのあたりの原理というか知識が皆無orz

とりあえず

virbr0 なデバイスファイルが無いのがアレ。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
$

うーん、Ubuntukvm を導入すれば云々て話がありますね。確かに kvm というパケジはありますが現状では導入されていないな。

$ sudo apt-get install kvm -s
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gnome-backgrounds gnome-search-tool libgdict-common gnome-icon-theme-extras libgdict-1.0-6 fonts-cantarell gdm gnome-dictionary dconf-tools
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
  kvm
0 upgraded, 1 newly installed, 0 to remove and 60 not upgraded.
Inst kvm (1:84+dfsg-0ubuntu16+1.0+noroms+0ubuntu14.1 Ubuntu:12.04/precise-updates [amd64])
Conf kvm (1:84+dfsg-0ubuntu16+1.0+noroms+0ubuntu14.1 Ubuntu:12.04/precise-updates [amd64])
$

入れてみるか。導入後も様子は変わらず。virsh というコマンドで云々、って libvirt-bin パケジが必要とか言われるなど。

$ virsh net-list
The program 'virsh' is currently not installed.  You can install it by typing:
sudo apt-get install libvirt-bin
$

導入して確認も微妙。と、brctl で virbr0 が出てきました。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes
$

これで qemu 起動してみたらどうなるんだろ。つうかコマンドの副作用をきちんと確認した方が良いな。
以下か。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.60eb69b67529       yes             eth0
$

一応、eth0 は UP になってますね。

eth0      Link encap:Ethernet  HWaddr 60:eb:69:b6:75:29  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:41 Base address:0xa000 

うーん、とりあえず別件対応が出てるので一旦割り込み対応する、ということでエントリ投入します。もう少し基本的なあたりから確認しないと駄目な気がしてます。

追記

tap0 は uml-utilities パケジを導入して tunctl したらできた。
つうか、無理やりヤッてみました。openvpn パケジを導入して /etc/qemu-ifup が以下。

$ cat /etc/qemu-ifup
#qemu-ifup
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 10.10.10.2 netmask 255.255.255.0
$

eth0 は使ってないデバイスです。あるいは /etc/qemu-ifdown を以下に。

$ cat /etc/qemu-ifdown
#qemu-ifdown
ifconfig eth0 down
ifconfig eth0 -promisc
ifup eth0
ifconfig br0 down
brctl delbr br0
openvpn --rmtun --dev tap0
$

ある意味コピペ状態です
で、/etc/qemu-ifup を実行して qemu な VM を起動。例えば以下。

$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile -hda hda.img.qcow2 \
-append "root=/dev/sda1" -net nic -net tap,ifname=tap0,script=no

これもドキュメントのまんまです。で、vm 起動したら以下なコマンドを投入したら

# ifconfig eth0 10.10.10.100 netmask 255.255.255.0

ホスト側とゲスト側で ping の返答が戻ってきている (らしい) ことが分かりました。が、ホストとゲストの間の通信しかできなさげ、なことも確認できてます。

ゲストがインターネットと通信

一旦 shutdown してインターネット接続なナニが可能かどうかを確認してみます。shutdown した後で以下。

$ sudo /etc/qemu-ifdown
Thu Aug  9 22:36:38 2012 TUN/TAP device tap0 opened
Thu Aug  9 22:36:38 2012 Persist state set to: OFF
$

この状態で再度 qemu 起動してみます。

$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile -hda hda.img.qcow2 \
-append "root=/dev/sda1"

これで外とやりとりができるのか。つうか普通にどっちもデキて欲しいんだけどorz

通信できてるのかどうか

ping してみたら名前解決はできてるようです。が通信不能らしい。これはこれで微妙だなぁ。もう少し色々確認してみますが今日はもう駄目。