1. 程式人生 > 實用技巧 >建立nfs網路根檔案系統

建立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通開發板。

THE END