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

と出て止まってしまうことがあります。

おそらくユーザーランド側をもっと変更する必要があるのだと思います。何かご存知の方教えてください。



トラックバックURL

トラックバック一覧

1. クロス開発でのQEMU まとめ(基礎編)  [ KMC Staff Blog ]   2010年09月16日 11:08
ここまでのQEMUの記事のリンク集です。 なお、CELFテクニカルジャンボリーにて、時間をいただきましたので、このあたりについて話をさせていただきます。 (3月5日 中野サンプラザ 入場無料) よろしければご参加ください。

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード