高速通信計算研究所

slankdevの報告

QemuコマンドでVMを立てる時にシンプルにNICを生やす方法

part1 超素朴に全部手作業でやる

最初にこの方法でやれば全て理解できるしこれが一番理解しやすい.

ホスト側からVM起動

HOST$ sudo qemu-system-x86_64     \
        -m 2048 -hda vm0.img          \
        -net nic -net tap,ifname=vtap0 \
        -vnc :5 -monitor stdio
(qemu)

ホスト側に新たにvtap0が増えるのを確認する

HOST$ ip a
...
67: vtap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 5a:95:ad:15:13:99 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5895:adff:fe15:1399/64 scope link
       valid_lft forever preferred_lft forever
...

VM側ではこうなった

VM$
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5054:ff:fe12:3456/64 scope link
       valid_lft forever preferred_lft forever

VM側とHOST側にIPアドレスを割り当てる

VM$ sudo ip addr add 10.10.0.1/24 dev ens3
HOST$ sudo ip addr add 10.10.0.2/24 dev vtap0

するとpingが通るようになる

HOST$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
64 bytes from 10.10.0.1: icmp_seq=1 ttl=64 time=10.8 ms
64 bytes from 10.10.0.1: icmp_seq=2 ttl=64 time=0.277 ms
...

VM$ ping 10.10.0.2
PING 10.10.0.2 (10.10.0.2) 56(84) bytes of data.
64 bytes from 10.10.0.2: icmp_seq=1 ttl=64 time=1.37 ms
64 bytes from 10.10.0.2: icmp_seq=2 ttl=64 time=0.267 ms
...

変に紛らわしいことして浪費するよりこれの方がいいかもしれない.

port2 ifupスクリプトを指定する

ググるscript=ifup.shみたいなのを指定する方法があって, 理解しにくい. しかしpart1を理解した人からするととてもシンプルである.

scriptオプションで指定したスクリプトvmを起動したあとにifnameで指定した 内容を引数として渡して実行されるだけなので, 今回はtap0にipアドレスを 設定するスクリプトを書いた. 以下のようにすると, ホスト側のアドレス設定も 自動でやってくれる.

HOST$ cat ifup.sh
#!/bin/sh
/sbin/ip addr add 10.10.0.2/24 dev $1
/sbin/ip link set $1 up

HOST$ chmod -x ifup.sh
HOST$ sudo qemu-system-x86_64 \
        -m 2048 -hda vm0.img      \
        -net nic -net tap,ifname=vtap0,script=ifup.sh \
        -vnc :5 -monitor stdio
(qemu)