1. 程式人生 > >linux開發環境搭建(3)-nfs掛載根檔案系統

linux開發環境搭建(3)-nfs掛載根檔案系統

前面講解了網絡卡配置和使用tftp下載核心,這次要講的是使用nfs掛載根檔案系統。

1、什麼是根檔案系統
所謂根檔案系統,也就是系統啟動後第一個掛載的目錄,根檔案系統包括Linux啟動時所必須的目錄和關鍵性的檔案,例如Linux啟動時都需要有init目錄下的相關檔案,在 Linux掛載分割槽時Linux一定會找/etc/fstab這個掛載檔案等,根檔案系統中還包括了許多的應用程式bin目錄等,任何包括這些Linux 系統啟動所必須的檔案都可以成為根檔案系統。

2、為什麼要使用根檔案系統
可以將根檔案系統製作成img映象檔案,燒寫入nand flash或者emmc中,系統啟動後從nand flash或者emmc中讀出根檔案系統並且掛載。這樣子在開發階段會面臨的一個問題是,在開發階段檔案系統需要頻繁的修改,如果每次一點小小的修改就要重新編譯生成映象然後燒寫,開發效率會比較低。所以就有了nfs掛載根檔案系統,檔案系統並不是燒寫入nand flash或者emmc中,而是放在虛擬機器裡面,開機系統起來後通過網路nfs掛載根檔案系統,從而達到訪問根檔案系統的目的。這樣子在根檔案系統有改動的時候,只需要在rootfs目錄下面替換相應的檔案即可,不需要重新生成映象燒寫進nand flash或者emmc中,開發效率大大提高。

3、製作根檔案系統
製作根檔案系統一般使用busybox,具體制作過程為:

3.1 建立根檔案系統rootfs,這個路徑比較重要,後面很多地方要用到,根據自己的實際目錄建立,我的rootfs目錄路徑為:
~/friendly_arm_source/filesystem/rootfs$

#cd ~/friendly_arm_source/filesystem/
#mkdir rootfs

3.2建立根檔案系統目錄

#cd ~/friendly_arm_source/filesystem/rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules

3.3建立裝置檔案

#cd rootfs/dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
#tar xzvf etc.tar.gz -C ~/friendly_arm_source/filesystem/rootfs/etc/

解壓之後可以看到/etc目錄下面有下面幾個檔案
fstab init.d inittab profile

3.5新增核心模組
新增核心模組主要是將你的核心原始碼裡面編譯出來的ko模板,安裝到rootfs的/lib/modules目錄下面去。
首先需要一份移植好的,可以在開發板上跑起來的linux核心,作為測試使用,之後我們會自己移植linux核心。我這裡使用的是友善的tiny6410開發板,因為核心原始碼比較大有差不多100M,csdn上傳不了這麼大的資源,所以需要的話可以到友善的官網下載。不過其實不一定要用到友善移植好的tiny6410核心,也可以是其他開發的kernel。
進入到kernel目錄,這裡的前提是你的這份kernek已經編譯通過,並且已經正確配置。

#make modules ARCH=arm CROSS_COMPILE=arm-linux-
#make modules_install ARCH=arm INSTALL_MOD_PATH=~/friendly_arm_source/filesystem/rootfs

這樣就在rootfs中安裝好了核心模組,檢視/lib/modules下的模組,可以發現有下面兩個模組,具體生成的模組是根據你kernel配置的情況。

./lib/modules/2.6.38-FriendlyARM/kernel/drivers/scsi/scsi_wait_scan.ko
./lib/modules/2.6.38-FriendlyARM/kernel/drivers/char/mini6410_hello_module.ko

3.6編譯安裝busybox
BusyBox 是一個集成了一百多個最常用linux命令和工具的軟體。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復雜的工具,例grep、find、mount以及telnet。有些人將 BusyBox 稱為 Linux 工具裡的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它整合壓縮了 Linux 的許多工具和命令。
本文使用的busybox可以在這裡下載
http://download.csdn.net/detail/atmega_chen/9772349

3.6.1首先解壓下載的busybox壓縮包

#tar xzvf busybox-1.13.3.tar.gz

3.6.2進入解壓出來的busybox目錄

#cd busybox-1.13.3/

3.6.3配置busybox

#make menuconfig

這裡需要用sudo許可權開啟,否則會提示scripts/basic/fixdep.c:404:1: fatal error: opening dependency file scripts/basic/.fixdep.d: 許可權不夠

Busybox Settings -> build Options ->
選中“Build busybox as a static binary”, 靜態連結。
編輯Cross Compiler prefix,輸入arm-linux-

Busybox Settings -> Installation Options->
選中“Don‘t use /usr”, 選中該項可以避免busybox 被安裝到宿主系統的/usr目錄下,破壞宿主系統。
編輯Busybox Installation Prefix (/xxx/rootfs),輸入你的rootfs的路徑,該選項表明編譯後的busybox的安裝位置。

3.6.4編譯安裝busybox

#make
#make install

這樣busybox就安裝到了你的rootfs目錄下面,可以參考到之前建立的空的rootfs目錄下面多出了許多的檔案,至此根檔案系統也製作完成了。

5、配置核心支援nfs啟動
進入到kernel目錄,注意這裡的ARCH=arm,不加的話有可能編譯出來的image是x86平臺的。

#make menuconfig ARCH=arm

general setup -> 去掉Initial RAM filesystem and RAM disk (initramfs/initrd) support。要使用nfs掛載文根檔案系統,則需要將基於記憶體的randisk或者Initramfs檔案系統去掉。
這裡寫圖片描述

File systems -> Network File Systems -> 選中Root file system on NFS,和其他和NFS相關的
這裡寫圖片描述

修改好以後重新編譯核心,將編譯出來的uImage通過tftp方式下載到nand flash中,具體如何下載在前面有提到。

6、修改uboot命令列引數,支援nfs
要使用nfs掛載根檔案系統,首先需要uboot在啟動的時候傳入的引數bootargs告訴kernel啟動的rootfs,kernel才能選擇啟動哪種檔案系統,bootargs的引數設定,在前面講tftp下載檔案的時候已經設定過,只不過當時這個引數並沒有用。
在start_armboot函式最後進入死迴圈前,加入下面幾句設定環境變數的程式碼。

    setenv("ipaddr", "192.168.2.3");
    setenv("serverip", "192.168.2.2");
    setenv("gatewayip", "192.168.2.1");
    setenv("bootcmd", "nand read c0008000 400000 500000; bootm c0008000");
    setenv("bootargs", "noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.2.2:/home/chen/friendly_arm_source/filesystem/rootfs,proto=tcp,nfsvers=3 ip=192.168.2.3:192.168.2.2:192.168.1.1:255.255.255.0::eth0:off");
    /* main_loop() can return to retry autoboot, if so just run it again. */
    for (;;) {
        main_loop ();
    }

    /* NOTREACHED - no way out of command loop except booting */

其中bootargs引數中的ip引數,第一個引數為開發板ip地址,第二個為伺服器ip地址,第三個是閘道器,第四個是掩碼,第五個是開發板名字,可以不填,第六個將ip地址複製給哪個網絡卡,這裡必須eth0,否則無法掛載nfs,第七個關閉動態ip獲取。

修改好後,重新編譯uboot燒寫到nand flash中,可以使用dnw下載,也可以使用tftp下載。

7、配置ubuntu上的nfs掛載目錄

#vi /etc/exports
在最後加入:
/home/chen/friendly_arm_source/filesystem/rootfs *(rw,sync,no_root_squash,no_subtree_check)

第一個目錄為表示要掛載的根檔案系統目錄;
*表示所有網段ip都可以訪問這個目錄;
rw:掛接此目錄的客戶端對該共享目錄具有讀寫許可權;
sync:資料同步寫入記憶體和硬碟;
no_root_squash:客戶機用root訪問該共享資料夾時,不對映root使用者;
no_subtree_check:不檢查父目錄的許可權。

編輯好後source一下配置檔案使nfs配置生效

#source /etc/exports

重啟nfs服務

#/etc/init.d/nfs-kernel-server restart

8、開機啟動開發板,驗證掛載是否成功
在uboot和kernel都配置好並且燒寫到nand flash後,就可以開啟開發板,通過串列埠檢視列印log,如果最後出現下圖的現象,說明掛載成功。通過串列埠可以輸入shell命令,則說明掛載成功。
如果出現開機到掛載檔案系統時無法掛載的現象,首先要檢查你的網路是否有正確設定,如果網路不通,則無法掛載,具體網路設定可以參考前面的文章,然後檢查windows和ubuntu的防火牆是否關閉,如果都沒問題,則要檢查各個步驟引數是否有輸入錯誤,再仔細核對每一步。
這裡寫圖片描述