1. 程式人生 > >檔案系統 | 如何使用網路根檔案系統啟動開發板?

檔案系統 | 如何使用網路根檔案系統啟動開發板?

1.前期準備

1.1 開發板通過串列埠連線至Windows主機

1.2 在Windows主機上開啟虛擬機器Ubuntu主機

1.3 已製作好的網路根檔案系統為:Ubuntu主機的 /work/nfs_root/ 這個目錄

1.4 通過 $ ifconfig  命令確定Ubuntu主機IP為192.168.0.7

2.Ubuntu主機上的操作

2.1 檢視是否安裝nfs伺服器

$ sudo apt-get install nfs-kernel-server



我們看到“nfs-kernel-server is already the newest version. ”,說明已安裝

2.2 修改伺服器的配置檔案

伺服器的配置是放在/etc/exports這個檔案下的,編輯它即可

$ sudo vi /etc/exports

加上如下一行,把我們想作為根檔案系統的目錄/work/nfs_root/放進去,並作配置,然後儲存退出:

/work/nfs_root *(rw,sync,no_root_squash)



2.3 重啟nfs伺服器

$ sudo /etc/init.d/nfs-kernel-server restart


可以看到,exportfs: /etc/exports……/work/nfs_root,說明/work/nfs_root/這個目錄已經作為exportfs(輸出檔案系統)了,當然我們也可以通過這個命令來檢視

$ showmount -e


可以看到一個export list,下面就有“/work/nfs_root”這個目錄

3.開發板上的操作

3.1 啟動開發板進入Uboot

3.2 檢視配置資訊

(這一步是為了後面能重新通過設定uboot引數來重新實現從flash啟動)

OpenJTAG> print


記錄下bootargs

“bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0”

3.3 設定bootargs,並儲存

OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.7:/work/nfs_root

ip=192.168.0.17:192.168.0.7:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0

OpenJTAG> save

3.4 重啟開發板

這時候開發板就以網路根檔案系統來啟動了,也就是說,在Ubuntu主機上的/work/nfs_root/這個目錄現在成了開發板的根目錄。

讓我們來驗證一下:

Ubuntu主機的/work/nfs_root/,建立一個名為“666haha”的檔案

$ cd /work/nfs_root/

$ touch 666haha

然後我們在串列埠介面下檢視開發板的根目錄,看一下這個檔案是否存在

# ls 666haha -l


可見它在開發板的根目錄下也是存在的

現在,通過串列埠我們在根目錄下把它刪除

# rm 666haha

然後,回到Ubuntu主機上的/work/nfs_root/目錄檢視一下是否也是刪除掉了

$ ls /work/nfs_root/666haha -l

我們可以看到如下資訊:

ls: cannot access 666haha: No such file or directory

即這個檔案已經不見了

由此可見,我們在開發板的根目錄下的操作,和我們在Ubuntu主機的/work/nfs_root/目錄下的操作是同步的

說明1. bootargs


說明2. 開發板的Linux IP和Uboot IP

我們在設定bootargs的時候用的是Linux系統下的IP,而非Uboot下的"ipaddr"!兩者有何區別?

在3.2裡,我們在Uboot輸入print命令後可看到如下一行:

ipaddr=192.168.0.16

這個就是Uboot IP

而Linux IP和Uboot IP是兩個獨立的IP,可以不一樣(當然也可以一樣)。那麼它是怎麼來的?

其實是我們在構建根檔案系統的時候設定好的,它放在Ubuntu主機的/work/nfs_root/etc/init.d/rcS這個檔案裡

$ cd work/nfs_root/etc/init.d

$ vi rcS

檢視這個檔案(它其實就是一個shell指令碼),有如下一行:

ifconfig eth0 192.168.0.17

當開發板從uboot跳入kernel,開始進行初始化的時候,就會呼叫這個指令碼,這時候開發板的Linux IP就被設定好了

問題:如何改為重新由NandFlash啟動根目錄?

還記得在3.2裡面記錄的資訊嗎?

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

稍微修改一下:

set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

然後,啟動開發板進入Uboot,輸入上面這條命令,重新設定bootargs即可:

OpenJTAG> set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

OpenJTAG> save

再啟動開發板,這時候開發板使用的就是NandFlash上面的根檔案系統了

如果我們想再次使用NFS啟動根檔案系統,就再改一下bootargs就可以了

OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.7:/work/nfs_root/first_fs ip=192.168.0.17:192.168.0.7:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
OpenJTAG> save