天天看點

建立NFS檔案共享,遠端NFS啟動

一、建立NFS檔案共享

       1、安裝NFS 服務

  :~$ sudo apt-get install nfs-kernel-server

  2、建立NFS 共享目錄

  假設 NFS 共享目錄是/home/nfs

  ~$ sudo mkdir /home/nfs

  3、配置NFS

  :~$ vi /etc/exports

  在/etc/exports 檔案末尾加入下面一行:

  /home/nfs *(rw,sync,no_subtree_check,no_root_squash)

允許所有使用者通路 NFS 共享目錄

重新開機伺服器:

  1. sudo /etc/init.d/portmap start      
  2. sudo /etc/init.d/nfs-kernel-server start
  3. 若是找不到portmap有可能ubuntu是64位的沒有這個東東(自己猜的),需要重新開機這個指令(sudo /etc/init.d/rpcbind restart),再打開步驟2就ok了。

注:如果開發闆不能挂載到主控端可以試下以下方式:

  :~$ sudo exportfs –a

  :~$ sudo /etc/init.d/portmap restart

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

5、本地驗證NFS

  :~$ ls /home/nfs

  helloworld.c

  $sudo mount localhost:/home/nfs /mnt

  $ls /mnt

  helloworld.c

  $sudo umont /mnt

開發闆挂載:

[[email protected] ]#mount -t nfs -o nolock 192.168.200.123:/home/nfs /mnt
[[email protected] ]#cd /mnt
[[email protected] mnt]#ls
led_test      zyr-hello.ko
[[email protected] mnt]#insmod zyr-hello.ko
[ 5299.759382] misc-register led_core
[[email protected] mnt]#./led_test
Start led test.
[ 5309.324907] GPIO LED set low.
[ 5310.338522] GPIO LED set high.
[ 5311.342169] GPIO LED set low.
[ 5312.345413] GPIO LED set high.
           

二、設定linx遠端根檔案系統:

修改在/etc/exports 檔案,在末尾加入修改檔案系統路徑:

  /home/root/targetNFS/ *(rw,sync,no_subtree_check,no_root_squash)

setenv serverip 192.168.1.122
setenv server_ip 192.168.1.122
setenv gw_ip 192.168.1.1
setenv client_ip 192.168.1.2
setenv root_dir /home/root/targetNFS/
setenv fdtfile am335x-boneblack.dtb


printenv server_ip client_ip root_dir fdtfile
           

 最後run nfsboot。其中有些路徑要替換成自己開環境使用的相應路徑。

注意:要保證根檔案系統中檔案的所有者,所屬使用者組為root。或者如下圖

建立NFS檔案共享,遠端NFS啟動

在調試NFS根檔案系統時,出現過以下的錯誤:

設定完後,卡死在一個階段,無法運作下去,把核心的DEBUG資訊打開。即zImage替換為帶調試資訊的版本。

1. NFS無法挂載

[  100.344551] VFS: Unable to mount root fs via NFS, trying floppy.

[  100.351929] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6

[  100.359382] Please append a correct "root=" boot option; here are the available partitions:

[  100.367821] 0100           65536 ram0 

[  100.367829]  (driver?)

[  100.374781] 0101           65536 ram1 

[  100.374903]  (driver?)

[  100.381483] 0102           65536 ram2 

[  100.381491]  (driver?)

[  100.388097] 0103           65536 ram3 

[  100.388209]  (driver?)

[  100.394534] 0104           65536 ram4 

[  100.394541]  (driver?)

[  100.400912] 0105           65536 ram5 

[  100.401020]  (driver?)

[  100.407305] 0106           65536 ram6 

[  100.407312]  (driver?)

[  100.413864] 0107           65536 ram7 

[  100.413866]  (driver?)

[  100.420051] 0108           65536 ram8 

[  100.420054]  (driver?)

[  100.426187] 0109           65536 ram9 

[  100.426190]  (driver?)

[  100.432332] 010a           65536 ram10 

[  100.432334]  (driver?)

[  100.438560] 010b           65536 ram11 

[  100.438562]  (driver?)

[  100.444780] 010c           65536 ram12 

[  100.444782]  (driver?)

[  100.451026] 010d           65536 ram13 

[  100.451029]  (driver?)

[  100.457240] 010e           65536 ram14 

[  100.457243]  (driver?)

[  100.463475] 010f           65536 ram15 

[  100.463477]  (driver?)

[  100.469724] b300        15269888 mmcblk1 

[  100.469728]  driver: mmcblk

[  100.476553]   b301         4194304 mmcblk1p1 3567dafc-01

[  100.476555] 

[  100.483476]   b302        11074560 mmcblk1p2 3567dafc-02

[  100.483480] 

[  100.490361] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

[  100.498670] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) ]---
           

原因可能是,設定的目錄不對,或者協定不比對。解決方法如下:

【問題解決】Linux通過nfs挂載根檔案系統報錯:VFS: Unable to mount root fs via NFS, trying floppy_丨匿名使用者丨的部落格-CSDN部落格_cannot mount root

原因:

以前使用的16.04版本的ubuntu沒問題,現在更換了18.04.4版本,開始報錯。

從Ubuntu17.04開始,nfs預設隻支援協定3和協定4,而kernel中預設支援協定2。

修改 NFS 配置檔案:

sudo vim /etc/default/nfs-kernel-server

在末尾添加:

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

重新開機 NFS 服務:

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

注:如果kernel版本較高支援nfs協定3的話,可以在Uboot傳到Kernel的bootargs參數中加入’nfsvers=3’,使kernel使用nfs協定3。

2. nfs: server 192.168.3.16 not responding. still trying. 

我遇到的問題是,系統是emmc裡打包,解壓出來的,IP位址開機後有重配。是以去除IP位址重配置的功能。

systemV的配置在:/etc/network/interfaces檔案中。把IP位址配置成uboot中一樣

systemD的配置在:/etc/systemD /network/01-eth-static.network ,删除這個檔案,或IP位址配置成uboot一樣。

其他原因的解決辦法如下:

開發闆 nfs : server xxx.xxx.xxx.xxx not responding,still trying問題解決方法_BuildMyDream998的部落格-CSDN部落格

首先說說我的開發環境,闆子的IP位址是192.168.3.123,PC機WINDOSW的IP位址是192.168.3.196,而虛拟機LINUX的IP位址是192.168.3.16.

在uboot的指令模式中修改bootargs變量,輸入以下指令: 

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.3.16:/work/nfs_root/tmp/fs_mini_mdev 

ip=192.168.3.123:192.168.3.16:192.168.3.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 

然後儲存重新開機闆子。之後就出現以下情況: 

建立NFS檔案共享,遠端NFS啟動

當遇到這個問題的時候,我首先檢查了網絡,從開發闆中進行本地啟動,啟動成功之後輸入ping 192.168.3.16 

結果顯示可以ping通 

建立NFS檔案共享,遠端NFS啟動

之後在闆子啟動後已經進入linux系統的情況下,使用以下mount指令: 

mount -t nfs -o nolock,vers=2 192.168.3.16:/work/nfs_root /mnt,可以挂載上 

在開發闆中: 

建立NFS檔案共享,遠端NFS啟動

在虛拟機LINUX中: 

建立NFS檔案共享,遠端NFS啟動

證明了網絡狀況沒問題。

閱讀了網上一些資料,說有可能是因為 NFS的預設傳輸協定是 UDP,而PC機與嵌入式系統通過UPD互動時就會出現嚴重的網卡丢包現象。改成TCP協定形式。是以進行了以下更改 

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.3.16:/work/nfs_root/tmp/fs_mini_mdev, 

proto=tcp ip=192.168.3.123:192.168.3.16:192.168.3.1:255.255.255.0::eth0:off init=/linuxrc 

console=ttySAC0 

結果問題還是那樣。

還有就是可能 

Mandag 27 november 2006 20:12 skrev Verner Kjrsgaard:

Mandag 27 november 2006 19:33 skrev John P. New:

Verner,

This is a problem with NFS and 2.6 kernels, fast server NICs and 

comparatively slower client NICs. This will show up when the server has 

a 1000Mb card and the client a 100Mb, or when the server has a 100Mb 

card and the client a 10Mb.

Essentially, you have to pass some options to the kernel on terminal 

boot, and this varies depending on whether you are using etherboot or 

PXE.

See 

Linux Terminal Server Project … rver_not_responding 

for a deeper explanation of the problem and the cure.

大概意思是說具有較高的傳送速率的NFS主機網卡和較低速率的目标機網卡之間不比對,要解決此問題需要在挂載檔案系統時添加額外的參數。 

是以進行以下修改: 

set bootargs noinitrd root=/dev/nfs 

nfsroot=192.168.3.16:/work/nfs_root/tmp/fs_mini_mdev,flags=inir,rsize=1024,wsize=1024 

ip=192.168.3.123:192.168.3.16:192.168.3.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 

相應的參數意思: 

intr – 當伺服器當機或者無法到達時,允許中斷NFS請求。rsize=xxxx 和 wsize=xxxx – 通過設定大的同時傳輸的資料塊大小(bytes),以提高NFS讀寫的速度。改變這些值時要當心,一些舊的linux核心和網卡在大的塊大小不能正常工作。 

本以為這次沒問題,結果還是那樣失望。這個時候已經折騰了我兩三個小時了。

再次通過閱讀網上的一些新的解決方案。發現了一個很關鍵的提示。在加載檔案系統時,是不是進行了系統的IP配置,進而導緻了這樣的錯誤。也就是說開發闆的IP位址被改變了。立馬想到當作業系統啟動時它會立馬去加載/etc/init.d/rsC,是以立馬去虛拟機中所要挂載的檔案系統檢視這個檔案。 

經過檢視: 

建立NFS檔案共享,遠端NFS啟動

Holy cow,第二行ifconfig eth0 192.168.1.17是導緻這個問題的罪魁禍首。 

它會将闆子的IP位址修改為192.168.1.17,但是虛拟機LINUX的IP位址是192.168.3.16,闆子和虛拟機LINUX不在同一個網段上,是以就導緻通信失敗,出現nfs server not responding無應答的錯誤。

将闆子修改為192.168.3.x網段下的位址 

建立NFS檔案共享,遠端NFS啟動

儲存退出。重新開機開發闆。 

在uboot指令模式中設定好闆子參數: 

建立NFS檔案共享,遠端NFS啟動

主要留意bootargs環境變量 

然後儲存再次重新開機闆子。

終于解決了這個問題: 

建立NFS檔案共享,遠端NFS啟動

與虛拟機LINUX中的檔案目錄一緻 

建立NFS檔案共享,遠端NFS啟動

繼續閱讀