客户端无法挂载:“mount.nfs4:不支持协议”

Chr*_*all 4 nfs4

我只在服务器和客户端上运行 nfs4。我不确定最近更改了什么,但我无法再挂载以前能够挂载的导出文件系统。我刚刚将客户端计算机从 Fedora 31 升级到 32...但我发誓升级后 nfs 仍然可以立即工作。

在客户端我做:

  # mount /foo
  mount.nfs4: Protocol not supported
Run Code Online (Sandbox Code Playgroud)

尚未/etc/fstab更改。处尚未安装任何内容/foomount.nfs4我手动发出相同的结果。

在客户端使用wireshark,我可以看到绝对没有任何内容发送到nfs服务器(或从同一服务器接收)。使用 tcpdump,从客户端重新启动之前到尝试挂载之后,我在服务器端看不到任何内容。所以我猜这是一个客户端问题?

我在日志中看不到任何内容。我找不到任何东西来结束客户端安装的日志记录级别。

谁能告诉我如何发现客户正在做什么(或没有做什么)?


按照要求...

dmesg提及 nfs|NFS:

[    7.987799] systemd[1]: Starting Preprocess NFS configuration convertion...
[    7.993220] systemd[1]: nfs-convert.service: Succeeded.
[    7.993342] systemd[1]: Finished Preprocess NFS configuration convertion.
[   12.484481] RPC: Registered tcp NFSv4.1 backchannel transport module.
Run Code Online (Sandbox Code Playgroud)

fstab客户端:

foo:/ /foo nfs4 noauto,sec=sys,proto=tcp,clientaddr=xx.xx.xx.xx,port=1001  0 0
Run Code Online (Sandbox Code Playgroud)

客户端有多个IP。服务器希望掩盖它提供 nfs 的事实。为了使它更容易,它只支持 nfs4。netstat服务器上的FWIW给出(为了清晰起见进行了编辑):

Prot  R-Q S-Q  Local Address      Foreign Address  State    PID/Program
tcp    0   0   xx.xx.xx.xx:1001   0.0.0.0:*        LISTEN   -
tcp    0   0   0.0.0.0:111        0.0.0.0:*        LISTEN   1/systemd
tcp    0   0   0.0.0.0:1002       0.0.0.0:*        LISTEN   815/rpc.statd
Run Code Online (Sandbox Code Playgroud)

我以为 nfs4 只需要一个端口...但 systemd 似乎无论如何都会唤醒端口 111。还有rpc.statd。

服务器的配置曾经有效...此外,客户端根本没有在任何端口上向服务器发送任何内容!

以及exports服务器上的:

/ bar(fsid=0,no_subtree_check,sec=sys,rw,no_root_squash,insecure,crossmnt)
Run Code Online (Sandbox Code Playgroud)

bar在服务器文件中的位置\etc\hosts

showmount -e foo在客户端做了:

clnt_create: RPC: Program not registered
Run Code Online (Sandbox Code Playgroud)

Wireshark 告诉我,客户端向服务器的端口 111 发出请求MOUNT (100005) Version 3 tcp,但收到“否”响应。戳戳udp得到了同样的答案。由于服务器仅配置了 nfs4,我想这并不奇怪?我注意到这showmount并不要求版本 4...但我不知道您是否希望如此?

Chr*_*all 5

好的...所以我下载了源代码并开始研究strace.

问题是我对 过于热情/etc/nfsmount.conf,具体来说:

  1. 对于 nfs4,设置以下任何一项都是错误的:

     mounthost
     mountaddr 
     mountvers
     mountproto
    
    Run Code Online (Sandbox Code Playgroud)

    /etc/nfsmount.conf任何事物(包括设置和mountvers=4设置mountproto=tcp)。

    如果(像我一样)你愚蠢到这样做,代码会设置errno=EPROTONOSUPPORT并返回错误......就好像socket()失败了一样。[错误报告机制似乎没有意识到这一点,并使用“默认”方式报告错误strerror()。]

  2. mounvers设置也是一个错误/etc/nfsmount.conf

    再说一遍,如果(像我一样)你足够愚蠢,拼写错误mountvers并输入mounvers=4/etc/nfsmount.conf你会得到:

    # mount.nfs4 -v -o noauto,sec=sys,proto=tcp,port=1001 foo:/ /foo
    mount.nfs4: timeout set for Fri Sep 11 16:24:09 2020
    mount.nfs4: trying text-based options 'sec=sys,proto=tcp,port=1001,mounvers=4,vers=4.2,addr=xx,clientaddr=xx'
    mount.nfs4: mount(2): Invalid argument
    ....
    
    Run Code Online (Sandbox Code Playgroud)

    ...我想这是可以预料的。

啊,好吧,这几天我没什么更好的事可做:-(