Embedded Linux 測試:Full root filesystem for ARM9 階段《NFS Mount》

jollen 發表於 February 12, 2007 4:11 PM

Bootstrap root filesystem 是一個基本且可開機的 root filesystem,針對 ARM9 的 root filesystem 建構與開發,要如何有效率的進行測試與發展是必修的一門功課。傳統的 Embedded Linux 應用,大多是以 NFS 的方式來測試 target device 的完整 root filesystem(full root filesystem);另外還有一種較「先進」的測試方式是使用 sshfs 的方式來進行,可參考 Jserv 兄的 blog「sshfs 在 Embedded Linux 開發的應用」。

以 NFS 進行 Embedded Linux 的開發測試,主要是針對 target device 的 full root filesystem 做「立即(right now)」的系統執行測試(run-time),免除「不斷打包 image file、開機」的惡夢。這是一種流行很久的 Embedded Linux 系統測試與開發方式,其概念如下:

1. 將 target 的完整 root filesystem(例如 ARM9 root filesystem)建置後,存放於 host 端的某個目錄下,例如 /home/rootfs
2. 為 target 製作一個「NFS root filesystem」,也就是 bootstrap root filesystem + NFS functionality,並使用 NFS root filesystem 將 target device 開機。
3. 設定 host 端為 NFS server。
4. 以 NFS mount 方式將 server 上的 root filesystem 目錄「mount」進來,即可在 target device 上執行 full root filesystem 裡的應用程式。

這種方式不但簡單,而且方便,需要的基礎建設如下:

1. Target device 使用的 kernel 必須支援 NFS。
2. 製作 bootstrap root filesystem 時,需要加入 mount 指令,並且開啟 mount 指令的 NFS 功能。
3. 加入 NFS functionality 至 bootstrap root filesystem。
4. 當然,您必須知道如何設定 NFS server。

項目 3. 為 NFS root filesystem 的製作,Jollen 提供一個事先建立好的 NFS root filesystem 供大家取用,請下載「nfsroot_arm.img」,這是 U-Boot 格式的 image file,請使用 U-Boot 開機。ARM9 的平臺,都能使用 nfsroot_arm.img

簡單的使用案例(scenario)

原本老王是使用 Busybox 的 tftp 指令來下載程式至 target device,可是老王覺得這樣太麻煩了,所以老王就設定 NFS server,將 /tftpboot 目錄整個 mount 在 target device 的 root filesystem 下,這樣就方便多了。首先,老王要先修改 NFS 的 export 設定檔:

# vi /etc/exports

加入以下內容:

/tftpboot *(ro,sync)

然後啟動 NFS server,以 Red Hat Linux 9 來說,應該執行以下指令:

# /etc/rc.d/init.d/nfs start

Ubuntu 的使用者,必須安裝 nfs-server 套件,接著再啟動 NFS server::

$ sudo apt-get install nfs-server
$ sudo /etc/init.d/nfs-kernel-server start

再把 /etc/exports 的內容「輸出」,Red Hat Linux 9/Ubuntu 都是執行以下指令:

# exportfs -a
# exportfs (做檢查)
/tftpboot <world>

實際畫面如下圖。我以 nfsroot_arm.img 開機,然後設定 IP address,接著再啟動 portmap service。

nfs_root_1.jpg

nfs_root_2.jpg

接著,利用 nfsroot_arm.img 將 target device 開機,設定好 target device 的 IP 後,「請務必啟動 portmap」再做 NFS mount:

# portmap
# mkdir /nfs
# mount -t nfs 10.1.36.4:/tftpboot /nfs

我們將 NFS server 上的 /tftpboot 掛載到 target device裡,如下圖。

nfs_root_3.jpg

成功後,便能在 /nfs 目錄下看到「host 端 /tftpboot 目錄裡的檔案」,恭喜老王學會了一種非常基本,而且方便的 root filesystem for cross development 測試與開發方法。

更多有關 NFS mount

另外一種應用是「把整個 root filesystem」掛進來,這時就會用到在「Embedded Linux 測試:Bootstrap root filesystem(x86)階段《程式執行測試》」日記中所提到的 chroot 指令。

再舉一例 scenario 做說明。例如,我把 ARM9 的完整 root filesystem 放在 host 端的 /home/rootfs 目錄,所以先修改 NFS server 設定:

/home/rootfs *(rw,sync,no_root_squash)

接下來一樣要用 NFS root filesystem 將 target device 開機,並在做完 NFS mount 後,立即以 chroot(for kernel 2.4)指令切換根目錄:

# mkdir /nfs
# mount -t nfs 10.1.36.4:/home/rootfs /nfs
# chroot /nfs /bin/sh

'chroot' 做法需要注意幾個細節:

1. 執行時期(run-time)目錄的問題,像是 /dev/sys(kernel 2.6)與 /proc
2. Initial script 要手動執行;或是 chroot 時,將第一個執行的動作指定為 init process。
3. 有時我只會 mount root filesystem 裡的特定目錄。

只 mount root filesystem 裡的特定目錄,實務上有時頗有用。例如,修改 NFS server 設定如下:

/home/rootfs/bin *(ro,sync)
/home/rootfs/sbin *(ro,sync)

開機後做 NFS mount:

# mount -t nfs 10.1.36.4:/home/rootfs/bin /bin
# mount -t nfs 10.1.36.4:/home/rootfs/sbin /sbin

另外,有同學問到「portmap」service 的問題,這是使用 NFS 必要的 service,請務必加入 NFS root filesystem,並在 mount 前啟動 portmap!

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw