QEMU上のLinuxでNFS起動する(Ubuntu 12.04)

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: