今天碰到一个非常有意思的问题,我需要通过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,一个动态IP:10.170.2.xxx,一个静态IP:172.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):
-
同一台服务器:
Linux内核通过检测NFS服务器的fsid或UUID发现,172.16.150.xxx和10.170.2.xxx其实是同一台物理存储服务器(只是不同的网口)。 -
连接复用:因为机器上还有很多挂载点(如
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
完美~