一、创建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
- 若是找不到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根文件系统时,出现过以下的错误:
设置完后,卡死在一个阶段,无法运行下去,把内核的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
然后保存重启板子。之后就出现以下情况:
当遇到这个问题的时候,我首先检查了网络,从开发板中进行本地启动,启动成功之后输入ping 192.168.3.16
结果显示可以ping通
之后在板子启动后已经进入linux系统的情况下,使用以下mount命令:
mount -t nfs -o nolock,vers=2 192.168.3.16:/work/nfs_root /mnt,可以挂载上
在开发板中:
在虚拟机LINUX中:
证明了网络状况没问题。
阅读了网上一些资料,说有可能是因为 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,所以立马去虚拟机中所要挂载的文件系统查看这个文件。
经过查看:
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网段下的地址
保存退出。重启开发板。
在uboot命令模式中设置好板子参数:
主要留意bootargs环境变量
然后保存再次重启板子。终于解决了这个问题:
与虚拟机LINUX中的文件目录一致