Nfs

nfs 根據客戶端機器從 4.2 降級到 4.0,而理論上可以 4.2 - 為什麼?

  • May 5, 2021

我正在使用 NFS 來測試一些客戶端選項。

在使用“選項”之前,我只是測試了從幾個客戶端到給定伺服器的“預設”連接,所以稍後我將能夠比較選項化行為與預設行為的對比。

但是我觀察到客戶端的行為不同,即使它們都基於ubuntu:20.04並且都安裝了相同的版本nfs-common

這是設置:

伺服器

暴露 IP 192.168.3.81 的橋接虛擬盒中的 Ubuntu 20.40。Server 是 ubuntu 20.04 的預設包。

這些是已安裝的 NFS 軟體包:

xavi@iridio:~$ apt list --installed | grep nfs

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libnfsidmap2/focal,now 0.25-5.1ubuntu1 amd64 [installed,automatic]
nfs-common/focal-updates,focal-security,now 1:1.3.4-2.5ubuntu3.3 amd64 [installed,automatic]
nfs-kernel-server/focal-updates,focal-security,now 1:1.3.4-2.5ubuntu3.3 amd64 [installed]
xavi@iridio:~$

這是導出文件:

xavi@iridio:~$ cat /etc/exports
/files/repos/sharedfolder *(rw,sync,no_subtree_check,no_root_squash,insecure)
xavi@iridio:~$

客戶#1(虛擬盒子)

virtualbox 上的同一台伺服器機器可以作為其自身的客戶端進行測試。掛載時,它確實使用協議 4.2:

xavi@iridio:~$ sudo mount -vvvv 192.168.3.81:/files/repos/sharedfolder iridio/
mount.nfs: timeout set for Tue May  4 10:41:51 2021
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.3.81,clientaddr=192.168.3.81'
xavi@iridio:~$ echo $?
0
xavi@iridio:~$

這是預期的行為:客戶端能夠v4.2,伺服器能夠v4.2,然後通過 連接v4.2

VBox中的核心是5.4:

xavi@iridio:~$ uname -a
Linux iridio 5.4.0-72-generic #80-Ubuntu SMP Mon Apr 12 17:35:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
xavi@iridio:~$

客戶#2(碼頭工人)

然後從主機啟動一個 docker 容器,它也基於 rawubuntu:20.04和 install nfs-common。這是完整的會話:

xavi@msi-laptop:~$ # Launch a fresh container from an empty official stock ubuntu image:
xavi@msi-laptop:~$ 
xavi@msi-laptop:~$ docker run -it --rm --name=nfsclient --hostname=nfsclient --privileged=true ubuntu:20.04
root@nfsclient:/# apt-get update > /dev/null
root@nfsclient:/# apt-get install -y nfs-common > /dev/null
debconf: delaying package configuration, since apt-utils is not installed
root@nfsclient:/#
root@nfsclient:/#
root@nfsclient:/# # Check installed nfs packages. Client is the same than vbox.
root@nfsclient:/#
root@nfsclient:/# apt list --installed | grep nfs

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libnfsidmap2/focal,now 0.25-5.1ubuntu1 amd64 [installed,automatic]
nfs-common/focal-updates,focal-security,now 1:1.3.4-2.5ubuntu3.3 amd64 [installed]
root@nfsclient:/#
root@nfsclient:/#
root@nfsclient:/# # Now mount, but does tries 4.2, fails, tries 4.1, fails then 4.0 and succeeds.
root@nfsclient:/#
root@nfsclient:/# mkdir iridio
root@nfsclient:/# mount -vvvv 192.168.3.81:/files/repos/sharedfolder iridio/
mount.nfs: timeout set for Tue May  4 10:55:35 2021
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.3.81,clientaddr=172.17.0.10'
mount.nfs: mount(2): Invalid argument
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.3.81,clientaddr=172.17.0.10'
mount.nfs: mount(2): Invalid argument
mount.nfs: trying text-based options 'vers=4.0,addr=192.168.3.81,clientaddr=172.17.0.10'
root@nfsclient:/# echo $?
0
root@nfsclient:/#

docker中的核心是4.19。事實上,docker 引擎在 Windows 10 pro 上的 WSL-2 上的 Ubuntu 20.04 上執行:

root@nfsclient:/# uname -a
Linux nfsclient 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@nfsclient:/#

問題

  • 為什麼有兩個ubuntu:20.04,兩者都具有非常精確的nfs-common/focal-updates,focal-security,now 1:1.3.4-2.5ubuntu3.3 amd64行為版本,即一個通過連接到伺服器v4.2,另一個通過連接v4.0
  • 版本是否取決於我擁有的核心?
  • 我看到在嘗試版本v4.2v4.1. 我應該通過任何額外的選項來連接v4.2嗎?

答案就在問題中…

預設情況下,現代版本的 nfs utils 將始終嘗試使用最高的 nfs 版本,截至目前為 4.2。

但是,mount 命令本身並不是一個 nfs 客戶端。因此它將掛載請求轉發給核心。根據核心版本和建構時間選項,不同的核心可以支持不同的 nfs 版本。結果,在某些情況下會立即使用 4.2,而在另一種情況下,核心會簡單地說“不支持”並讓 mout 命令使用不同的 nfs 版本再次嘗試。

引用自:https://serverfault.com/questions/1062512