这是关于怀旧的。
我这里有一台运行 SuSE Linux 4.3 和内核 2.2.6 的旧 PC。所有硬件包括。以太网工作正常,我正在尝试安装由最近的 Ubuntu 20.04 托管的 NFS 共享。
两台 PC 都可以互相 ping 通并通过 中的条目解析它们的名称/etc/hosts
。例如 FTP 正在运行。
出口是:
/data 192.168.3.0/24(ro,no_subtree_check)
据我了解,这将创建 NFS v2/v3 导出。
尝试安装它会导致:
nostalgy:/root # mount -t nfs linus:/data /data
mount: wrong fs type, bad option, bad superblock on linus:/data,
or too many mounted file systems
在/var/log/messages
客户端:
May 10 15:42:18 nostalgy kernel: nfs warning: mount version older than kernel
May 10 15:42:18 nostalgy kernel: call_verify: server accept status: 2
May 10 15:42:18 nostalgy kernel: RPC: garbage, retrying 0
May 10 15:42:18 nostalgy kernel: call_verify: server accept status: 2
May 10 15:42:18 nostalgy kernel: RPC: garbage, retrying 0
May 10 15:42:18 nostalgy kernel: call_verify: server accept status: 2
May 10 15:42:18 nostalgy kernel: RPC: garbage, exit EIO
May 10 15:42:18 nostalgy kernel: nfs_get_root: getattr error = 5
May 10 15:42:18 nostalgy kernel: NFS: cannot create RPC transport.
在/var/log/syslog
服务器上(使用 启用调试日志记录后rpcdebug -m rpc -s all
)每次安装尝试都会记录三次:
Jul 12 19:35:18 linus kernel: [25882.293061] svc: socket 00000000d25fa09a(inet 00000000ad30a7ef), busy=0
Jul 12 19:35:18 linus kernel: [25882.293096] svc: server 000000006bec18a0, pool 0, transport 00000000d25fa09a, inuse=2
Jul 12 19:35:18 linus kernel: [25882.293138] svc: svc_authenticate (1)
Jul 12 19:35:18 linus kernel: [25882.293144] svc: server 00000000ed86c4fe, pool 0, transport 00000000d25fa09a, inuse=3
Jul 12 19:35:18 linus kernel: [25882.293152] svc: server 00000000ed86c4fe waiting for data (to = 900000)
Jul 12 19:35:18 linus kernel: [25882.293173] svc: 192.168.3.4, port=800: unknown version (2 for prog 100003, nfsd)
Jul 12 19:35:18 linus kernel: [25882.293241] svc: socket 00000000d25fa09a sendto([00000000dc11bc2f 32... ], 32) = 32 (addr 192.168.3.4, port=800)
Jul 12 19:35:18 linus kernel: [25882.293245] svc: server 000000006bec18a0 waiting for data (to = 900000)
Jul 12 19:35:18 linus kernel: [25882.295154] svc: socket 00000000d25fa09a(inet 00000000ad30a7ef), write_space busy=0
我想unknown version (2 for prog 100003, nfsd)
这可能意味着客户端正在使用 NFSv2,而服务器不再支持它。事实上,在旧客户端中,内核没有配置对 NFSv3 的支持。但即使我这样做并重新编译内核后,仍然出现相同的错误。
在服务器上,nfsstat
说:
Server rpc stats:
calls badcalls badfmt badauth badclnt
0 7 7 0 0
每次安装尝试时,两个计数都会增加 3,并重试 2 次,以便匹配。 badcalls/badfmt 是吗unknown version (2 for prog 100003, nfsd)
?
rpcinfo -p 的输出:
dode@linus:~$ rpcinfo -p
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 59155 mountd
100005 1 tcp 44609 mountd
100005 2 udp 56137 mountd
100005 2 tcp 37447 mountd
100005 3 udp 56639 mountd
100005 3 tcp 57329 mountd
100003 3 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 34312 nlockmgr
100021 3 udp 34312 nlockmgr
100021 4 udp 34312 nlockmgr
100021 1 tcp 34245 nlockmgr
100021 3 tcp 34245 nlockmgr
100021 4 tcp 34245 nlockmgr
当服务器运行 Ubuntu 14.04(内核 4.4.0)、16.04(内核 4.15)时,挂载导出工作正常,而当运行 18.04(内核 5.3)或更高版本时,导出会失败。
我也尝试过禁用 NFS v4,例如这
那么也许内核 5 中相关的东西(RPC?)发生了变化?
答案1
终于我可以让它工作了。
尽管我在支持 NFSv3 的旧 SuSE 机器上编译了内核,但它似乎仍然使用 v2。也许需要一个内核选项来启用 v3?
在 Ubuntu 20.04 服务器上,命令sudo cat /proc/fs/nfsd/versions
返回:
-2 +3 -4 -4.0 -4.1 -4.2
所以,不支持 v2。
要启用 v2,需要添加-V 2
到:RPCNFSDCOUNT
/etc/default/nfs-kernel-server
# Number of servers to start up
RPCNFSDCOUNT="8 -V 2 --no-nfs-version 4"
然后只需重新启动nfs-kernel-server
即可使更改生效:
sudo systemctl restart nfs-kernel-server
之后,在旧 SuSE 机器上安装 NFS 导出再次起作用:-)