Unable to mount root fs via NFS

题目是一个非常常见的网络文件系统制作报错,下面列一下制作网络文件系统的一些关键环节。

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试试,板子上的系统不支持某一版本,修改几下试试。

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值