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

use*_*949 4 nfs 17.10

我有一个 linux 嵌入式系统(在对其进行主动开发时)将其根文件系统挂载为从我的 ubuntu 盒子导出的 nfs 共享。所以要特别清楚:嵌入式 linux 是 nfs 客户端,我的 ubuntu 机器是 nfs 服务器。我对执行实际 nfs 安装的嵌入式系统没有太多控制权。

当我升级到 ubuntu 17.10 时,我发现这不再起作用。

经过多次调试,我想我将问题确定为协议版本不匹配:在使用wireshark嗅探流量时,我发现嵌入式系统使用旧协议版本2发送NFS数据包,但这是我在运行的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
Run Code Online (Sandbox Code Playgroud)

所以没有 nfs 版本 2,只有 3 和 4。

任何人都知道如何向我的 nfs 服务器添加 nfs 版本 2 支持?

小智 10

您需要修改 /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
#
Run Code Online (Sandbox Code Playgroud)

并重启服务

service nfs-kernel-server restart
Run Code Online (Sandbox Code Playgroud)

请注意在服务重启后您可能需要重新启动共享

zfs share -a
Run Code Online (Sandbox Code Playgroud)

最后确认是否支持协议 2(必要时也支持 tcp 和 udp)

rpcinfo -p servername | fgrep nfs
Run Code Online (Sandbox Code Playgroud)

你应该看到这个

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
Run Code Online (Sandbox Code Playgroud)


小智 5

如果升级到Ubuntu 18.04,你会发现,没有任何RPCNFSDOPTS变化了在/etc/default/nfs-kernel-server

我不得不劫持RPCNFSDCOUNT它才能使用 NFS v2:

RPCNFSDCOUNT="--nfs-version 2 8"
Run Code Online (Sandbox Code Playgroud)

证明它有效:

$ service nfs-kernel-server restart
$ cat /proc/fs/nfsd/versions
+2 +3 +4 +4.1 +4.2
Run Code Online (Sandbox Code Playgroud)

在此之后,我可以从 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]
Run Code Online (Sandbox Code Playgroud)