建立nfs網路根檔案系統
使用環境:
- VMware® Workstation 10.0.2
- ubuntu-16.04 LTS
- arm-linux-gcc-4.9.1
- busybox-1.17.2-20101120
- uboot_tiny4412-sdk1506.tar
- kernel –>linux 3.5
Tiny4412的檔案系統在除錯階段使用網路檔案系統,將使用busybox工具進行製作。Busybox是linux下的管理工具類似於電腦的360安全衛士、電腦管家。
nfs根檔案系統的建立分為四部分:
- busybox的安裝
- 檔案系統檔案的配置
- nfs服務搭建
- 修改uboot啟動引導引數
一、busybox的安裝
1.1、把busybox安裝包解壓到指定的工作目錄。
1.2、執行make menuconfig命令進入配置介面進行配置。
a、定義交叉編譯器(arm-linux-)
Busybox Settings --->
Build Options --->
(arm-linux-)Cross Compiler Prefix(NEW)
b、選定庫支援
Busybox Settings --->
Build Options --->
[*]Build shared libbusybox(NEW)
C、指定安裝目錄
Busybox Settings --->
Installation Options --->
(/tiny4412_nfs)Busybox Installation Prefix(NEW)
D、指定模組使用方式,不使用工具預設方式,取消下述該項,選擇insmod、rmmod、lsmod
Linux Module Utilities --->
[]Simplified modutils(NEW)
1.3、配置完成後,執行make命令進行過編譯。
使用4.9.1版本交叉編譯器,會有兩個錯誤:
error: storage size of ‘rlimit_fsize’ isn’t known struct rlimit rlimit_fsize;
缺少型別定義,使用4.5.1版本是沒這個錯誤的,感覺是使用4.8以上的編譯器會有這個問題。檢視passwd.c檔案,發現其包含了libbb.h,而libbb.h中包含了platform.h檔案。
解決辦法:在platform.h中包含sys/resource.h
error: redefinition of ‘struct sysinfo’
在交叉編譯工具鏈中的標頭檔案kernel.h與busybox原始碼中的標頭檔案libbb.h出現了相同的結構體定義,造成了衝突。
解決辦法:保留交叉編譯器的標頭檔案,維持該編譯鏈的環境,對busybox原始碼進行修改。
在libbb.h檔案中,註釋掉struct sysinfo的定義,並新增交叉編譯工具鏈標頭檔案#include <linux/kernel.h>
1.4、編譯完成後,make install命令進行安裝。
1.5、安裝完成後,在安裝目錄下會有bin、sbin、linuxrc、usr。
二、檔案系統檔案的配置
2.1、將交叉編譯器中的動態庫檔案複製到根檔案系統目錄/tiny4412_nfs下,-arp項表示保留檔案的一切屬性。/opt/gcc-……是我的安裝目錄
cp /opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/arm-linux-gnueabihf/bin/ /tiny4412_nfs –rap // 4.9.1版本還有libc
rm /tiny4412_nfs/bin/*.a –r // 刪除靜態庫
如果啟動過程中出現錯誤:
Failed to execute /linuxrc. Attempting defaults...
kernel panic - not syncing: No init found. Try passing init= option to kernel.
其中linuxrc連線到bin中的可執行檔案busybox,執行失敗,則可能是由於缺少動態庫依賴造成的。此時需要新增交叉編譯器動態庫的支援,進入bin目錄,使用file busybox檢視動態庫依賴,從交叉編譯安裝目錄中查詢相應庫,把依賴的動態庫複製到根檔案系統/bin目錄下即可。
2.2、建立系列資料夾
mkdir root home proc tmp sys opt var dev etc/init.d –p
2.3、進入etc 資料夾,輸入cp /etc/passwd ./回車,再輸入cp /etc/group ./回車,兩個檔案賦值到/tiny4412_nfs/etc路徑下,這兩個檔案是跟使用者登入相關的配置檔案
2.4、在etc檔案中,輸入cp /etc/fstab ./回車,將fstab檔案複製到當前資料夾內,修改並保留如下內容:
tmpfs /dev/shm tmpfs defaults 1 0 devpts /dev/pts devpts defaults 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
2.5、在etc資料夾下,輸入cp /busybox安裝目錄/examples/inittab ./,修改並保留如下內容:
::sysinit:/etc/init.d/rcS #系統啟動首先執行/etc/init.d/rcS檔案 console::askfirst:-/bin/sh #將字元中斷輸入資訊用/bin/sh直譯器來解釋 ::ctrlaltdel:/sbin/reboot #熱重啟則執行sbin/reboot命令 ::shutdown:/bin/umount -a –r #系統關閉時解除安裝所有的磁碟
2.6、在dev目錄下建立console檔案節點(控制檯終端)
mknod console c 5 1 // 建立節點, c—字元裝置 5—主裝置號 1—次裝置號
2.7、進入etc/init.d資料夾中輸入touch rcS建立rcS檔案
建立後之後,輸入chmod 777 rcS將許可權設定為最高,開啟rcS檔案,新增如下內容:
#!/bin/sh #載入sh直譯器,開發板啟動後使用sh直譯器 mount –a #掛載所有的磁碟裝置 mkdir devpts /dev/pts #建立一個devpts和/dev/pts資料夾 mount -t devpts devpts /dev/pts #將devpt掛載到/dev/pts資料夾下以devpts系統 echo /sbin/mdev > /proc/sys/kernel/hotplug # 掃描裝置增加減少並編輯節點功能 mdev –s #啟用mdev的這個功能 /bin/hostname Fu #環境變數賦值,這個值出現在命令提示符中
2.8、在etc目錄下輸入vim profile並編輯如下內容(其中斜點為tab鍵上的點):
USER="`id -un`" #得到當前登入使用者名稱
LOGNAME=$USER #將當前登入使用者名稱重新賦值給LOGNAME
PS1='[\u@\h \W]#' #設定命令提示符 \u-當前登入使用者 \h-主機名\W當前路徑
PATH=$PATH #路徑變數賦值
HOSTNAME=`/bin/hostname` #主機名賦值
export USER LOGNAME PS1 PATH #宣告為環境變數
三、nfs服務搭建
如果安裝的時候沒有nfs服務,則需要進行安裝
3.1、安裝nfs服務
服務端:sudo apt-get nfs-kernel-server
客戶端:sudo apt install nfs-common
3.2、修改配置檔案
sudo vim /etc/exports
修改內容如下:/home *(rw,sync,no_root_squash)
/home :共享的目錄
* :指定哪些使用者可以訪問
* 所有可以ping同該主機的使用者
192.168.1.* 指定網段,在該網段中的使用者可以掛載
192.168.1.12 只有該使用者能掛載
(ro,sync,no_root_squash): 許可權
ro : 只讀
rw : 讀寫
sync : 同步
no_root_squash: 不降低root使用者的許可權
其他選項man 5 exports 檢視
3.3、重啟nfs服務
sudo /etc/init.d/nfs-kernel-server restart
3.4、檢視伺服器共享目錄:
showmount -e 伺服器IP 例:showmount -e localhost
四、修改uboot啟動引導引數
進入uboot,修改bootargs變數為如下所示:
set bootargs “noinitrd root=/dev/nfs nfsroot=192.168.134.128:/tiny4412_nfs ip=192.168.134.10:192.168.134.128:192.168.134.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=HD700”
saveenv
其中:192.168.134.128為Ubuntu網址,192.168.134.10為開發板網址(uboot環境變數),eth0表示開發板網路裝置,console=>控制檯輸出到串列埠0,lcd=>LCD屏型號。
使用nfs網路根檔案系統,虛擬機器網路需要配置成橋接模式,在連線前,需要確保主機能夠ping通開發板。