文章目录
- 一、NFS
-
- 1. install nfs
- 2. config nfs
- 3. restart nfs
-
- 3.1 exportfs
- 3.2 restart
- 4. test on local
-
- 4.1 error
- 5. test on xhr4412
- 二、NFS rootfs
-
- 1. dependence
- 2. xhr4412
- 三、BUG
- reference
???目前 xhr4412 可以 ping 通外网,说明网络配置已经成功,但是根文件系统在开发板的 emmc 中,这非常不方便,所以首先将 xhr4412 调试到可以挂载 nfs 文件系统,再进一步直接使用 nfs 的根文件系统。
一、NFS
1. install nfs
sudo apt-get update
sudo apt-get install nfs-kernel-server
(安装nfs-kernel-server时,apt会自动安装nfs-common和portmap) 这样,宿主机就相当于NFS Server。
2. config nfs
- 修改配置文件
/etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
## /home/xhr/iTop4412/xhr4412/rootfs/system *(rw, sync, no_root_squash)
/home/xhr/iTop4412/xhr4412/rootfs/system *(rw,sync,no_root_squash) # no space
*
– 表示允许任意用户使用,也可以使用具体IP;rw
– 挂载此目录的客户机对此目录有读写权利;sync
– ……;no_root_squash
– 挂载此目录的客户机享有主机root的权利;
3. restart nfs
3.1 exportfs
-a
全部挂载或者全部卸载-r
重新挂载-u
卸载某一个目录-v
显示共享目录
不重启 nfs,便可使上面修改的 /etc/exports
:
sudo exportfs -arv
不过尝试了一下,好像没成功,语法错误?? = = ||
xhr@ubuntu:~/iTop4412/xhr4412/rootfs/system$ exportfs -arv
exportfs: /etc/exports:2: syntax error: bad option list
exportfs: No file systems exported!
exportfs: could not open /var/lib/nfs/.etab.lock for locking: errno 13 (Permission denied)
exportfs: can't lock /var/lib/nfs/etab for writing
xhr@ubuntu:~/iTop4412/xhr4412/rootfs/system$ sudo exportfs -arv
exportfs: /etc/exports:2: syntax error: bad option list
exportfs: No file systems exported!
xhr@ubuntu:~/iTop4412/xhr4412/rootfs/system$
3.2 restart
/etc/init.d/nfs-kernel-server restart
/etc/init.d/portmap restart
这条似乎是多余的
结果出现这个问题:
???经过一番搜索,原来是因为 /etc/exports
的格式有些问题,括号里的逗号不能有空格。。。看来前面那个 syntax error
指的就是这个。我还以为是命令的语法有错误。。
???果然,删掉空格就可以使用 3.1
的命令了。
4. test on local
sudo mount -t nfs localhost:/home/xhr/iTop4412/xhr4412/rootfs/system /mnt
注:localhost为本机linux的IP地址
这样就把共享目录挂到了/mnt目录,取消挂载用:
sudo umount /mnt
如果用在嵌入式设备上挂载,要加上参数 -o nolock
我在开发板上使用的挂载命令:
mount -t nfs -o nolock 192.168.177.128:/home/xhr/iTop4412/xhr4412/rootfs/system /mnt
4.1 error
mount.nfs: requested NFS version or transport protocol is not supported
/etc/init.d/nfs-kernel-server restart
还是需要 restart 一下。
5. test on xhr4412
mount -t nfs -o nolock 192.168.177.128:/home/xhr/iTop4412/xhr4412/rootfs/system /mnt
???进入 /mnt
目录,就可以看到 Ubuntu 中一模一样的文件了,以后就方便多了。
二、NFS rootfs
???为了更加方便调试,并不直接使用挂载的方式使用 nfs,而是直接将 nfs 作为根文件系统使用。
1. dependence
- 确保linux内核配置的时候配置上了
Root file system on NFS
这一项,也就是CONFIG_ROOT_NFS
,它依赖于IP_PNP
- 当没有使用
ramdisk
根文件系统的时候,则需要使用noinitrd
这个参数,所以用nfs
启动根文件系统则必须要加上这个参数 root=/dev/nfs
,在文件系统为基于nfs
的文件系统时使用,指定root=/dev/nfs
之后还需要指定nfsroot=serveri:nfs_dir
,即指明文件系统存在在哪个主机的哪个目录下ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
client-ip
开发板的 IP 地址server-ip
nfs 文件目录所在的 IP 地址gw-ip
网关的地址netmask
子网掩码hostname
主机名(一般都省略)device
网卡名称(如eth0
)autoconf
自动配置
下面为一条bootargs的例子:
setenv bootargs mem=128M console=ttyS0o,115200n8 root=/dev/nfs nfsroot=host_ip:mount_dir,nolock rw noinitrd ip=192.168.0.8:192.168.0.2:192.168.0.1:255.255.255.0::eth0:off
其中的mem和console参数需要根据具体板子的配置给出相应配置
2. xhr4412
kernel 官方文档:
Documentation/admin-guide/nfs/nfsroot.rst
???官方文档已经写的很清楚了,不过官方文档没有给出一个选项的设置,真的太坑了,搞了挺长时间才谷歌到,应该是 nfs client 和 server 的版本不一致?猜的,可能是这样的。
???需要指定 nfsvers=3
,才挂载成功。
修改 arch/arm/boot/dts/exynos4412-xhr-elite.dts
:
chosen {
bootargs = "root=/dev/nfs rw nfsroot=192.168.177.128:/home/xhr/iTop4412/xhr4412/rootfs/system,nfsvers=3 ip=192.168.177.132:192.168.177.128:192.168.177.2:255.255.255.0::eth0:off:192.168.177.2:114.114.114.114:192.168.177.2 init=/linuxrc rootdelay=1 rootwait nfsrootdebug";stdout-path = "serial2:460800n8";};
???由于 NFS 作为根文件系统启动时,网卡已经配置完成,所以不在启动文件系统后在配置网卡,这里修改一下开机脚本 /etc/init.d/rcS
,来自动判断是从 NFS 启动还是 EMMC 启动。
cmdline=$(cat /proc/cmdline)
nfsdev="/dev/nfs"ret=$(echo $cmdline | grep "$nfsdev")if [[ "$ret" != "" ]]
then # nfsecho "boot from nfs root !"
else # emmcifconfig lo upifconfig eth0 hw ether 08:90:90:90:90:90ifconfig eth0 192.168.177.132 netmask 255.255.255.0 uproute add default gw 192.168.177.2
fi
三、BUG
???这里有发现一个 BUG,在 u-boot 中使用 fastboot
后,直接使用 boot
命令直接启动 kernel 的话,网卡无法正常工作。
???所以使用 fastboot
后,需要重新断电在启动 xhr4412。
???由于不太影响使用,就暂时不去探索为什么会有这样的 BUG。
reference
- nfs 挂载根文件系统
- exportfs 命令
- nfs 服务挂载问题及解决方法
- 嵌入式linux之NFS启动根文件系统
- NFS方式无法挂载根文件系统
- 终于用上了nfsroot[原创]
- LinuxRootfilesystemusingnfsversion3