我必须“捏造” /etc/exports 中的更改才能执行 mount -a,有什么问题?

Cor*_*her 5 nfs mount

每当我必须重新启动 server1 时,我可以在 server2 上重新安装 NFS 的唯一方法是更改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)
Run Code Online (Sandbox Code Playgroud)

我发出这个命令:

"exportfs -r".
Run Code Online (Sandbox Code Playgroud)

在 server2 上,我在/etc/fstab 中有这个

xxx.xxx.x.x:/server1_dir1/ /dir1_server2 nfs async,noatime 0 0
xxx.xxx.x.x:/server2_dir2  /dir2_server2 nfs async,noatime 0 0
Run Code Online (Sandbox Code Playgroud)

我首先“卸载”现在具有陈旧 NFS 句柄的旧目录。然后,

"mount -a"
Run Code Online (Sandbox Code Playgroud)

命令挂起。在我杀死它之后,df显示 dir1 已安装,但 dir2 没有。

让两个目录都挂载的唯一方法是将 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)
Run Code Online (Sandbox Code Playgroud)

我将fsid=1更改为 =2。我再次发出exportfs -r命令,瞧,mount -a命令适用于 server2。

也许我不明白fsid到底是做什么的,但显然必须有更好的方法来“重新安装”NFS,而不是每次都必须随机编辑 fsid 编号?

编辑:如果我在 server1 上的导出文件中没有包含fsid,它会给我

"Warning: /mnt/ramdisk/dir1 requires fsid= for NFS export" 
Run Code Online (Sandbox Code Playgroud)

而且,如果我为两行(dir1 和 dir2)都设置 fsid=0,那么挂载点最终会与我的所有文件都被复制到 dir1 位置相同!所以似乎唯一的方法是不断地切换 fsid 整数,有点随机。

EDIT2:我删除了fsid=0因为它是“特殊的”,并将它们更改为fsid=1fsid=2在server1 上的/etc/exports中。这当然有效(因为文件已更改)。但是今天只需要强行重启,然后(缓慢地)从 server2 卸载过时的驱动器后,mount -a失败了,就像以前一样。所以,(和以前一样),我在 server1 上编辑了导出文件,这一次,fsid=2fsid=3exportfs -r,瞧,mount -a再次在 server2 上工作。回到广场 1。

EDIT3关键信息:如果我以受控方式删除所有内容(即..server1 不会“崩溃”),并首先卸载 server2 上的目录,然后重新启动 server1,然后在 server2 上挂载 -a,效果很好。只有当server2 上的挂载突然中断时才会出现此问题。所以我猜测需要在 server2 上重置某些东西?我知道在 server1 崩溃后卸载 server2 上的陈旧句柄需要很长时间。

Mic*_*ton 5

我的猜测是问题是由在fsid=0您的出口之一中使用引起的。

请记住,fsid当底层文件系统驱动程序不提供自己的唯一 ID 时,它旨在唯一标识设备。特别是,fsid=0具有特殊的含义

对于 NFSv4,有一个独特的文件系统,它是所有导出文件系统的根。这是用fsid=rootfsid=0两者指定的,这意味着完全相同的事情。

由于这显然不是您想要的,因此请始终使用 0 以外的 fsid。