每当必须重新启动server1时,我可以将NFS挂载到server2上的唯一方法是更改server1上/ etc / exports文件中的一个“fsid”整数。 否则, mount -a命令只会挂在server2上。
典型场景:
Server1重新启动。 在server1上,我在/ etc / exports中有两行代码:
/mnt/ramdisk/dir1 *(fsid=0,rw,no_root_squash,no_subtree_check,async) /mnt/ramdisk/dir2 *(fsid=1,rw,no_root_squash,no_subtree_check,async)
我发出这个命令:
"exportfs -r".
在server2上,我在/ etc / fstab中有这个:
xxx.xxx.xx:/server1_dir1/ /dir1_server2 nfs async,noatime 0 0 xxx.xxx.xx:/server2_dir2 /dir2_server2 nfs async,noatime 0 0
我首先“卸载”那些现在有过时的NFS处理的老旧的dirs。 然后,
"mount -a"
该命令挂起。 我杀了之后, df显示dir1挂载,但dir2没有。
让这两个dirs挂载的唯一方法是将fsid整数更改为其他值。 例如,在server1上,我们现在有:
/mnt/ramdisk/dir1 *(fsid=0,rw,no_root_squash,no_subtree_check,async) /mnt/ramdisk/dir2 *(fsid=2,rw,no_root_squash,no_subtree_check,async)
我改变了fsid = 1到= 2 。 我再次发出exportfs -r命令,瞧, mount -a命令在server2上工作。
也许我不明白什么是fsid真的,但显然必须有一个更好的方式来“重新安装”NFS,而不是每次随机编辑fsid数字?
编辑 :如果我没有包含在我的导出文件server1上的fsid ,它给了我
"Warning: /mnt/ramdisk/dir1 requires fsid= for NFS export"
而且,如果我为两行(dir1和dir2)设置了fsid = 0,那么挂载点最终将与所有文件被复制到dir1位置相同! 所以这似乎是这个工作的唯一方法是不断切换fsid整数,有点随意。
编辑2 :我删除了fsid = 0,因为它是“特殊的”,并将其更改为fsid = 1和fsid = 2在/ etc / exports在server1上。 这当然有效(因为文件被改变)。 但是今天只是强行重新启动,之后(缓慢地)卸载server2的旧硬盘, mount -a失败了。 所以,(和以前一样),我编辑了server1上的exports文件,这次是fsid = 2和fsid = 3 , exportfs -r和voila, mount -a再次在server2上工作。 回到方块1。
EDIT3关键信息:如果我以受控的方式(即.server1不会“崩溃”)取下所有内容,首先卸载server2上的目录,然后重新启动server1,然后mount -a在server2上,它工作的很好。 只有在服务器2上的挂载突然中断时才会出现此问题。 所以我猜测一些需要在server2上重置?我知道,server1崩溃后,需要很长时间卸载server2上的陈旧句柄。
我的猜测是这个问题是由在你的一个导出中使用fsid=0引起的。
请记住,当底层文件系统驱动程序不提供自己的唯一ID时, fsid是为了唯一标识设备。 特别是, fsid=0有一个特殊的含义 :
对于NFSv4,有一个独特的文件系统,它是所有导出的文件系统的根。 这是用
fsid=root或者fsid=0指定的,两者意味着完全一样的东西。
由于这显然不是你想要的,总是使用一个不是0的fsid。