马春杰杰 Exit Reader Mode

关于mount远程NFS共享时不遵守fstab文件的问题

今天碰到一个非常有意思的问题,我需要通过NFS挂载一些远程目录,这些挂载行为是通过fstab定义的,之前是这样的:

10.170.2.xxx:/NFSshare/mount/ljq-5wwmo0 /NFS_auto_mount/ljq-5wwmo0 nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/xihaobo-a23nmp /NFS_auto_mount/xihaobo-a23nmp nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/mashibo-v4wwew /NFS_auto_mount/mashibo-v4wwew nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/songchengyuan-ztj8fq /NFS_auto_mount/songchengyuan-ztj8fq nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0

NFS服务器有两个IP,一个动态IP10.170.2.xxx,一个静态IP172.16.150.xxx,现在我想把最后一条挂载原地址改为静态IP,即:

10.170.2.xxx:/NFSshare/mount/ljq-5wwmo0 /NFS_auto_mount/ljq-5wwmo0 nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/xihaobo-a23nmp /NFS_auto_mount/xihaobo-a23nmp nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/mashibo-v4wwew /NFS_auto_mount/mashibo-v4wwew nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
172.16.150.xxx:/NFSshare/mount/songchengyuan-ztj8fq /NFS_auto_mount/songchengyuan-ztj8fq nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0

本来正常是先卸载/NFS_auto_mount/songchengyuan-ztj8fq,然后再重新挂载就好了,但是这次的非常奇怪,无论怎么重新挂载,查看挂载地址,仍然是原来的动态地址。

10.170.2.xxx:/NFSshare/mount/ljq-5wwmo0            200G  139G   62G  70% /NFS_auto_mount/ljq-5wwmo0
10.170.2.xxx:/NFSshare/mount/xihaobo-a23nmp        200G  183G   18G  92% /NFS_auto_mount/xihaobo-a23nmp
10.170.2.xxx:/NFSshare/mount/mashibo-v4wwew        300G  241G   60G  81% /NFS_auto_mount/mashibo-v4wwew
10.170.2.xxx:/NFSshare/mount/songchengyuan-ztj8fq  200G   51G  150G  26% /NFS_auto_mount/songchengyuan-ztj8fq

让人百思不得其解,后来通过大量查阅资料才发现,原来根本原因在于 Linux 内核的 NFS 客户端优化机制(连接复用/Trunking

  1. 同一台服务器Linux 内核通过检测 NFS 服务器的 fsidUUID 发现,172.16.150.xxx10.170.2.xxx 其实是同一台物理存储服务器(只是不同的网口)。

  2. 连接复用:因为机器上还有很多挂载点(如 lihuan-pkrfem, wyh-67tat5 等)正通过 10.170.2.xxx 保持着活跃连接,内核为了节省资源,强制复用了现有的到 10.170 的连接,直接忽略了我们请求的 172 IP

解决方案:强制建立新连接 (nosharecache)

我们需要在 /etc/fstab 中添加 nosharecache 选项,这会告诉内核:“不要复用现有的连接,必须为这个挂载点建立一个新的独立连接”。

所以,改为这样就可以了:

10.170.2.xxx:/NFSshare/mount/ljq-5wwmo0 /NFS_auto_mount/ljq-5wwmo0 nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/xihaobo-a23nmp /NFS_auto_mount/xihaobo-a23nmp nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
10.170.2.xxx:/NFSshare/mount/mashibo-v4wwew /NFS_auto_mount/mashibo-v4wwew nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,x-systemd.requires=network-online.target 0 0
172.16.150.xxx:/NFSshare/mount/songchengyuan-ztj8fq /NFS_auto_mount/songchengyuan-ztj8fq nfs vers=4.1,rsize=1048576,wsize=1048576,noatime,soft,timeo=600,retrans=5,_netdev,bg,intr,nofail,nosharecache,x-systemd.requires=network-online.target 0 0

然后,按照下面的标准流程进行重启挂载:

sudo umount /NFS_auto_mount/songchengyuan-ztj8fq
sudo systemctl daemon-reload
sudo systemctl start NFS_auto_mount-songchengyuan\\x2dztj8fq.mount

然后再重新查看挂载情况:

root@autodl:~# df -h | grep songchengyuan
172.16.150.xxx:/NFSshare/mount/songchengyuan-ztj8fq  200G   51G  150G  26% /NFS_auto_mount/songchengyuan-ztj8fq

完美~