我有一个 Linux 嵌入式系统,(在进行积极开发时)将其根文件系统挂载为从我的 ubuntu 盒导出的 nfs 共享。因此,为了更加清楚:嵌入式 Linux 是 nfs 客户端,我的 ubuntu 盒是 nfs 服务器。我对执行实际 nfs 挂载的嵌入式系统没有太多控制权。
当我升级到 ubuntu 17.10 时,我发现它不再起作用了。
经过多次调试,我认为问题出在协议版本不匹配上:在使用 wireshark 嗅探流量时,我发现嵌入式系统发送的 NFS 数据包使用的是旧协议版本 2,但这是我在运行的 ubuntu 机器上得到的结果
$ rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 43512 mountd
100005 1 tcp 39783 mountd
100005 2 udp 35844 mountd
100005 2 tcp 58287 mountd
100005 3 udp 48188 mountd
100005 3 tcp 60599 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 44366 nlockmgr
100021 3 udp 44366 nlockmgr
100021 4 udp 44366 nlockmgr
100021 1 tcp 43079 nlockmgr
100021 3 tcp 43079 nlockmgr
100021 4 tcp 43079 nlockmgr
100024 1 udp 50305 status
100024 1 tcp 42983 status
所以没有 nfs 版本 2,只有 3 和 4。
有人知道如何向我的 nfs 服务器添加 nfs 版本 2 支持吗?
答案1
您需要修改 /etc/default/nfs-kernel-server 以包含以下行:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
# To confirm above mods are in effect after service restart use
# cat /run/sysconfig/nfs-utils
# or
# service nfs-kernel-server status
#
并重新启动服务
service nfs-kernel-server restart
请注意,服务重启后可能需要重新启动共享
zfs share -a
最后确认协议 2 被支持(如果需要也支持 tcp 和 udp)
rpcinfo -p servername | fgrep nfs
你应该看看这个
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
答案2
如果你升级到 Ubuntu 18.04,你会发现RPCNFSDOPTS
中不再有变量/etc/default/nfs-kernel-server
。
我必须劫持RPCNFSDCOUNT
才能让它使用 NFS v2:
RPCNFSDCOUNT="--nfs-version 2 8"
证明其有效:
$ service nfs-kernel-server restart
$ cat /proc/fs/nfsd/versions
+2 +3 +4 +4.1 +4.2
此后,我可以从 OpenVMS Alpha 8.2 挂载文件系统(......是的,真的......)
$ tcpip mount dnfs2:[000000] /host=beauty /path="/exports/home" /struct=5
%TCPIP$DNFSMOUNT-S-MOUNTED, /exports/home mounted on _DNFS2:[000000]
答案3
对于 Ubuntu 22.04,我使用了上面的答案,但发现直到您编辑 /etc/nfs.conf 并启用 udp=y、vers2=y(默认情况下均处于禁用状态)时,NFSv2 才会出现。重新启动 nfs-kernel-server 并使用 rpcinfo -p 和 cat /proc/fs/nfsd/versions 进行确认
答案4
我的嵌入式系统 (TI AM5728) 也遇到了同样的问题。假设您使用的是 uboot,诀窍是更改传递给内核的命令行。这是由 bootargs 环境变量的内容设置的。(有关详细信息,请参阅 uboot 文档)
要修复此问题,您需要在内核命令行 (bootargs 变量) 的 nfsroot 部分末尾添加“,nfsvers=3”
在我的系统上启动 NFS 时,bootargs 变量行如下所示:
bootargs=console=ttyO2,115200n8 root=/dev/nfs rw rootfstype=nfs ip=dhcp nfsroot=192.168.xx:/path/to/share
这个功能在 17.10 之前一直运行良好,然后就失效了 - 以下更改强制内核使用 NFS v3 进行连接。
bootargs=console=ttyO2,115200n8 root=/dev/nfs rw rootfstype=nfs ip=dhcp nfsroot=192.168.xx:/path/to/share,nfsvers=3