如何让 Ubuntu 17.10 中的 nfs 服务器支持协议版本 2?

如何让 Ubuntu 17.10 中的 nfs 服务器支持协议版本 2?

我有一个 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

相关内容