Ubuntu 12.04でQEMUを動かし、その上のLinuxをNFS起動をさせる。 eth0をNFS用の内部ネットワーク、eth1をNAT、eth2をSSH用の内部ネットワー クとして使用した。
1. ネットワークインターフェースの設定
/etc/network/interfacesを下記のように編集。
auto lo iface lo inet loopback auto eth2 iface eth2 inet static address 192.168.56.2 netmask 255.255.255.0 auto br0 iface br0 inet static address 192.168.0.2 netmask 255.255.255.0 bridge_ports eth0 bridge_maxwait 0 bridge_fd 0 bridge_stp off
Ubuntu起動後のネットワークインターフェースは以下の通りになった。
$ ifconfig
br0 Link encap:Ethernet HWaddr 08:00:27:f1:e6:37
inet addr:192.168.0.2 Bcast:192.168.0.255
Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fef1:e637/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39 errors:0 dropped:0 overruns:0 frame:0
TX packets:129 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3786 (3.7 KB) TX bytes:27244 (27.2 KB)
eth0 Link encap:Ethernet HWaddr 08:00:27:f1:e6:37
inet6 addr: fe80::a00:27ff:fef1:e637/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39 errors:0 dropped:0 overruns:0 frame:0
TX packets:158 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4332 (4.3 KB) TX bytes:31383 (31.3 KB)
eth1 Link encap:Ethernet HWaddr 08:00:27:6c:0f:fc
inet addr:10.0.3.15 Bcast:10.0.3.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe6c:ffc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28 errors:0 dropped:0 overruns:0 frame:0
TX packets:92 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4365 (4.3 KB) TX bytes:11937 (11.9 KB)
eth2 Link encap:Ethernet HWaddr 08:00:27:43:97:5d
inet addr:192.168.56.2 Bcast:192.168.56.255
Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe43:975d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:57 errors:0 dropped:0 overruns:0 frame:0
TX packets:138 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8011 (8.0 KB) TX bytes:20735 (20.7 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:58 errors:0 dropped:0 overruns:0 frame:0
TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4523 (4.5 KB) TX bytes:4523 (4.5 KB)
色々試しているとudevが延々とインターフェースのエントリを更新していくの で、設定が固まったら、/etc/udev/rules.d/70-persistent-net.rulesのエン トリを削除する。次回udev起動時に最終的なエントリが記述される。
2. QEMUのネットワーク起動スクリプトの作成
/etc/qemu-ifupと/etc/qemu-ifdownを作成する。両者ともにifconfigとbrctl を使用するのでroot権限が必要となる。 /etc/qemu-ifupでブリッジデバイスを接続する。本書の環境では${1}にtap0が 設定される。
#!/bin/sh ifconfig $1 0.0.0.0 promisc up brctl addif br0 $1
/etc/qemu-ifdownでブリッジデバイスを切断する。
#!/bin/sh brctl delif br0 $1 ifconfig $1 down
3. NFSサーバの設定
apt-getでインストール。
$ sudo apt-get install nfs-server
/etc/exportsを編集する。192.168.0.xのIPアドレスのみに公開する設定にす る。subtree_checkは最近のNFSで追加されたセキュリティ対策のもので、アク セスしようとするファイルが公開ディレクトリ配下にあることを確認する。セ キュリティを犠牲にしてパフォーマンスを向上させるにはno_subtree_checkに する。
<path-to-rootfs> 192.168.0.0/255.255.255.0(rw,sync,no_root_squash,subtree_check)
構文チェックをしてディレクトリを公開する。
$ sudo exportfs -ra
Ubuntu上でNFSマウントできるか確認する。複数のインターフェースを持つ環 境で、NFSマウントできない場合は/etc/exportsで許可されてるIPアドレスで アクセスできていないかもしれない。一度/etc/exportsのIPアドレスを変更し て確認すると良い。
$ sudo mount -t nfs -o rw <serverip>:<path-to-rootfs>/ /mnt $ echo $? 0
4. カーネルの設定
qemu-system-i386で-net tap,vlan=0,ifname=tap0を指定した場合、Intel E1000のネットワークインターフェースが使用されているので、デバイスドラ イバをカーネル組込みにしてカーネルを作成する。
Symbol: E1000 [=y]
Type : tristate
Prompt: Intel(R) PRO/1000 Gigabit Ethernet support
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Ethernet driver support (ETHERNET [=y])
-> Intel devices (NET_VENDOR_INTEL [=y])
Defined at drivers/net/ethernet/intel/Kconfig:46
Depends on: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_INTEL [=y] && PCI [=y]
その他、CONFIG_ROOT_NFS等のネットワークプロトコルも有効する。尚、カー ネル起動パラメータについてはQEMUの引数で指定するので設定していない。
5. QEMUの起動
qemu-ifupとqemu-ifdownを用いたネットワークインターフェースの操作でroot 権限が必要なので、sudoでQEMUを起動している。
sudo <path-to-qemu>/qemu-system-i386 \ -kernel <path-to-kernel>/bzImage -nographic \ -append "console=ttyS0,115200 ip=192.168.0.3 nfsroot=192.168.0.2:<path-to-rootfs> rw" \ -net nic,vlan=0 \ -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
起動メッセージは以下となった。
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.0.3, mask=255.255.255.0, gw=255.255.255.255
host=192.168.0.3, domain=, nis-domain=(none)
bootserver=255.255.255.255, rootserver=192.168.0.2, rootpath=
ALSA device list:
No soundcards found.
VFS: Mounted root (nfs filesystem) on device 0:11.
devtmpfs: mounted
Freeing unused kernel memory: 280K (c13b6000 - c13fc000)
Starting logging: OK
Initializing random number generator... done.
Starting network...
ip: RTNETLINK answers: File exists
Welcome to Buildroot
buildroot login: