2010年02月15日
ARM QEMUでDebianをNFSrootで起動する
大昔、まだハードディスクが高価だったころ、ディスクレスワークステーションというのがありました。自前でハードディスクを持たずに、ルートディレクトリから全てNFSでマウントするというものです。
この技術はいまでもUnix系OSのDNAに埋め込まれていて、簡単なセットアップでそれを行うことができます。組み込みLinuxの開発でこれを応用すると3つのよい点があります。
1. ターゲット内のファイルにホストからいつでも自由に簡単にアクセスできる。
2. ターゲットにストレージ系のデバイスドライバがまだ実装できていない状態でもカーネルを起動することができる。
3. ターゲットのディスクの空き容量を気にしなくてすむ。
QEMU上のARMのDebianでこれをやってみたので紹介します。
NFSサーバの準備
前回のページを参照してください。
NFSサーバにはUbuntu 9.04を使用しています。NFSサーバのIPアドレスは192.168.xx.xx とします。適宜読み替えてください。
仮想ハードディスクからのファイルの取り出し
hda.img.qcow2という仮想ハードディスクの内容を全て /export/debian_lenny_armel/root にコピーします。
$ sudo qemu-nbd --connect=/dev/nbd0 hda.img.qcow2 $ sudo mount /dev/nbd0p1 /mnt $ cd /export/ $ sudo mkdir debian_lenny_armel $ cd debian_lenny_armel/ $ sudo cp -a /mnt root $ sudo umount /mnt $ sudo qemu-nbd --disconnect /dev/nbd0
fstabの変更
ターゲットの/etc/fstab すなわちNFSサーバ上の/export/debian_lenny_armel/root/etc/fstab を編集します。
(ルート権限が必要なので sudo vi で編集します。この時うっかり/etc/fstabを編集しないように!!)
$ diff -u fstab.org fstab --- fstab.org 2010-02-10 19:46:38.000000000 +0900 +++ fstab 2010-02-10 19:47:08.000000000 +0900 @@ -2,5 +2,6 @@ # #proc /proc proc defaults 0 0 -/dev/sda1 / ext3 errors=remount-ro 0 1 -/dev/sda5 none swap sw 0 0 +#/dev/sda1 / ext3 errors=remount-ro 0 1 +192.168.xx.xx:/export/debian_lenny_armel/root / nfs defaults 0 1 +#/dev/sda5 none swap sw 0 0
カーネルのリビルド
カーネルのコンフィグを変更して
- Networkのkernel auto configurationを有効にし、DHCPが使用できるようにします。
- Network File System を有効にします。
- Root NFSを有効にします。
make menuconfig 等でこれを行ってください。.configの差分を以下に示します。
$ diff -u config-2.6.26-2-versatile.noinitrd config-2.6.26-2-versatile.nfsroot --- config-2.6.26-2-versatile.noinitrd 2010-01-29 17:58:03.000000000 +0900 +++ config-2.6.26-2-versatile.nfsroot 2010-02-08 16:26:04.000000000 +0900 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.26-2-versatile -# Fri Jan 29 17:50:21 2010 +# Mon Feb 8 11:39:21 2010 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -316,7 +316,10 @@ CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_PNP is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y @@ -1929,21 +1932,22 @@ # CONFIG_UFS_FS_WRITE is not set # CONFIG_UFS_DEBUG is not set CONFIG_NETWORK_FILESYSTEMS=y -CONFIG_NFS_FS=m +CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y -CONFIG_NFSD=m +# CONFIG_NFS_V4 is not set +CONFIG_NFSD=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y -CONFIG_NFSD_V4=y -CONFIG_LOCKD=m +# CONFIG_NFSD_V4 is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y CONFIG_LOCKD_V4=y -CONFIG_EXPORTFS=m -CONFIG_NFS_ACL_SUPPORT=m +CONFIG_EXPORTFS=y +CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y -CONFIG_SUNRPC=m +CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_BIND34=y CONFIG_RPCSEC_GSS_KRB5=m
起動
qemu-system-arm -M versatilepb -kernel zImage -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/debian_lenny_armel/root ip=dhcp"
注意
ここで紹介した手順は完全ではありません。たまに起動の途中で
nfs: server 192.168.xx.xx not responding, still trying
と出て止まってしまうことがあります。
おそらくユーザーランド側をもっと変更する必要があるのだと思います。何かご存知の方教えてください。
参考にさせてもらったページ
http://www.faqs.org/docs/Linux-mini/NFS-Root.html