题目是一个非常常见的网络文件系统制作报错,下面列一下制作网络文件系统的一些关键环节。
1. 配置环境
1.1 软件环境
主机:Linux redhat7 64位
文件系统:busybox-1.31.1,使用动态编译制作完成,放在目录rootfs
1.2 硬件环境
任意arm开发板
2. 主机软件
2.1 portmap:Linux的RPC服务,它响应RPC服务的请求和与请求的RPC服务建立连接。(注意,在centos7以上或redhat7以上,portmap改名为rpcbind了)
检查主机是否安装了rpcbind
rpm -qa | grep rpcbind
显示为:
rpcbind-0.2.0-47.el7.x86_64
2.2 nfs: 启动相应RPC服务进程来服务对于NFS文件系统的请求。
检查主机是否安装了nfs
rpm -qa | grep nfs-utils
显示为:
nfs-utils-1.3.0-0.61.el7.x86_64
2.3 nfslock:一个可选的服务,用于启动相应的RPC进程,允许NFS客户端在服务器上对文件加锁。
如果主机没有安装rpcbind和nfs程序,下载相应的版本安装,安装过程略。
3. 启动rpcbind和nfs一般要注意顺序,应该是rpcbind先启动,nfs后启动
3.1 启动服务:
systemctl start rpcbind
systemctl start nfs
3.2 设置开机自动启动:
systemctl enable rpcbind.service
systemctl enable nfs.service
3.3 查看版本,这是很多文件系统启动失败的原因之一
查看版本:
rpcinfo |grep portmap
显示如下:
100000 4 tcp6 ::.0.111 portmapper superuser
100000 3 tcp6 ::.0.111 portmapper superuser
100000 4 udp6 ::.0.111 portmapper superuser
100000 3 udp6 ::.0.111 portmapper superuser
100000 4 tcp 0.0.0.0.0.111 portmapper superuser
100000 3 tcp 0.0.0.0.0.111 portmapper superuser
100000 2 tcp 0.0.0.0.0.111 portmapper superuser
100000 4 udp 0.0.0.0.0.111 portmapper superuser
100000 3 udp 0.0.0.0.0.111 portmapper superuser
100000 2 udp 0.0.0.0.0.111 portmapper superuser
100000 4 local /var/run/rpcbind.sock portmapper superuser
100000 3 local /var/run/rpcbind.sock portmapper superuser
注意第2列显示版本号,也就是主机支持2,3,4版本,如果后面挂不上,排除了其
它原因后,应该考虑这里的版本号对应。
4. 配置共享文件夹
vi /etc/exports
输入以下内容:
/home/software/rootfs 192.168.1.*(rw,sync) *(rw,sync,no_root_squash)
rootfs为我的根文件系统,已配置完善,192.168.1.*示允许192.168.1的任何机器访问。
其它配置项很多地方介绍很详细,不再赘述。
5. 配置防火墙
如果开了防火墙,是挂不上的,将3.3节查看的111端口号加入防火墙,或者关掉防火墙
systemctl stop firewalld
在本机试挂一下:
mount -t nfs 192.168.1.9:/home/software/rootfs /mnt
查看挂载情况:
showmount -e localhost
6. 编译内核时的配置
6.1 如果配置了路由器的dhcp, 内核中设置为自动获取ip,这种方式是比较顺利的一种。
Networking support --->
Networking options --->
TCP/IP networking
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
3项都选*
6.2 网络文件选项
File systems --->
[*] Network File Systems --->
<*> NFS client support(如果编译内核文件大小没有超的话这下面的项都选上吧)
[*] Root file system on NFS
[*] RPC: Enable dprintk debugging (这一项调试很重要呀,如果出错后面可以输出相关信息)
6.3 启动参数配置
root=/dev/nfs rw init=/linuxrc nfsroot=192.168.1.9:/home/software/rootfs,proto=tcp,vers=3 rootfstype=nfs console=ttySAC2,115200 init=/linuxrc ip=dhcp rootdelay=5 nfsrootdebug
ip=dhcp 表示让路由器分配ip地址
192.168.1.9表示我的主机
proto=tcp表示nfs使用tcp传输
vers=3表示板子端的rpc客户端使用的是rpc版本3,如果排除了网卡驱动不正常,主机rpc不正常,防火墙问题之外,挂不上的问题一般出在这儿。
rootdelay=5表示延时5秒,在有些情况下,不延时好像挂不上,至于延时几秒,可以修改试试。
nfsrootdebug这项表示配合内核的rpc调试,如果挂不上可以看调试结果,开启此项后, 可以看到类似以下输出信息:
[ 8.088632] Waiting 5 sec before mounting root device...
[ 13.121983] Root-NFS: nfsroot=/home/software/rootfs,proto=tcp,vers=3
[ 13.128728] NFS: parsing nfs mount option 'source'
[ 13.133775] NFS: parsing nfs mount option 'vers'
[ 13.138163] NFS: parsing nfs mount option 'tcp'
[ 13.143709] NFS: parsing nfs mount option 'rsize'
[ 13.148149] NFS: parsing nfs mount option 'wsize'
[ 13.153383] NFS: parsing nfs mount option 'proto'
[ 13.157864] NFS: parsing nfs mount option 'vers'
[ 13.162887] NFS: parsing nfs mount option 'nolock'
[ 13.167547] NFS: parsing nfs mount option 'addr'
[ 13.172490] NFS: MNTPATH: '/home/software/rootfs'
[ 13.178035] NFS: sending MNT request for 192.168.1.9:/home/software/rootfs
[ 13.266511] NFS: received 1 auth flavors
[ 13.268997] NFS: auth flavor[0]: 1
[ 13.274015] NFS: MNT request succeeded
[ 13.276311] NFS: attempting to use auth flavor 1
[ 13.299952] VFS: Mounted root (nfs filesystem) on device 0:14.
看到这样的信息,清清楚楚,心情自然畅。
7. 启动可能出现的错误
[ 4.977061] Waiting 15sec before mounting root device...
Root-NFS: nfsroot=/home/software/rootfs,tcp,vers=4
[ 19.986568] Root-NFS: nfsroot=/home/software/rootfs,tcp,vers=4
NFS: nfs mount opts='vers=2,udp,rsize=4096,wsize=4096,tcp,vers=4,nolock,addr=192.168.1.9'
[ 20.001732] NFS: nfs mount opts='vers=2,udp,rsize=4096,wsize=4096,tcp,vers=4,nolock,addr=192.168.1.9'
NFS: parsing nfs mount option 'vers=2'
[ 20.014557] NFS: parsing nfs mount option 'vers=2'
NFS: parsing nfs mount option 'udp'
[ 20.022876] NFS: parsing nfs mount option 'udp'
NFS: parsing nfs mount option 'rsize=4096'
[ 20.031542] NFS: parsing nfs mount option 'rsize=4096'
NFS: parsing nfs mount option 'wsize=4096'
[ 20.040814] NFS: parsing nfs mount option 'wsize=4096'
NFS: parsing nfs mount option 'tcp'
[ 20.049480] NFS: parsing nfs mount option 'tcp'
NFS: parsing nfs mount option 'vers=4'
[ 20.057799] NFS: parsing nfs mount option 'vers=4'
NFS: parsing nfs mount option 'nolock'
[ 20.066378] NFS: parsing nfs mount option 'nolock'
NFS: parsing nfs mount option 'addr=192.168.1.9'
[ 20.075823] NFS: parsing nfs mount option 'addr=192.168.1.9'
NFS4: mount program didn't pass callback address
[ 20.085962] NFS4: mount program didn't pass callback address
<3>VFS: Unable to mount root fs via NFS, trying floppy.
注意,这里vers=4 不行,就改为2或者3试试,板子上的系统不支持某一版本,修改几下试试。