一、创建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
  1. 若是找不到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

开发板挂载:

[root@zyr-am335x ]#mount -t nfs -o nolock 192.168.200.123:/home/nfs /mnt
[root@zyr-am335x ]#cd /mnt
[root@zyr-am335x mnt]#ls
led_test      zyr-hello.ko
[root@zyr-am335x mnt]#insmod zyr-hello.ko
[ 5299.759382] misc-register led_core
[root@zyr-am335x 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) ]---

 

原因可能是,设置的目录不对,或者协议不匹配。解决方法如下:

原因:
以前使用的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一样。

其他原因的解决办法如下:

首先说说我的开发环境,板子的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共享_开发板_02

当遇到这个问题的时候,我首先检查了网络,从开发板中进行本地启动,启动成功之后输入ping 192.168.3.16 

结果显示可以ping通 

如何验证nfs共享 创建nfs共享_IP_03

 

之后在板子启动后已经进入linux系统的情况下,使用以下mount命令: 

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

在开发板中: 

如何验证nfs共享 创建nfs共享_linux_04

在虚拟机LINUX中: 

如何验证nfs共享 创建nfs共享_linux_05

 

证明了网络状况没问题。

阅读了网上一些资料,说有可能是因为 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共享_开发板_06

 

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共享_IP_07

保存退出。重启开发板。 

在uboot命令模式中设置好板子参数: 

如何验证nfs共享 创建nfs共享_linux_08

 

主要留意bootargs环境变量 

然后保存再次重启板子。终于解决了这个问题: 

如何验证nfs共享 创建nfs共享_IP_09

 

与虚拟机LINUX中的文件目录一致 

如何验证nfs共享 创建nfs共享_linux_10