为了让 mount -a 执行,我必须“捏造” /etc/exports 中的更改,这是什么问题?

为了让 mount -a 执行,我必须“捏造” /etc/exports 中的更改,这是什么问题?

每当我必须重新启动 server1 时,我可以在 server2 上重新安装 NFS 的唯一方法是更改/etc/exportsserver1 上的文件。否则,安装 -a命令只是挂在server2上。

典型场景:

服务器 1 重新启动。在服务器 1 上,我有两行代码/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".

在服务器2上,我有这个在 /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

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

"mount -a"

该命令挂起。我将其终止后,自由度显示 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)

我变了fsid=1 至 =2.我再次发出导出文件系统-r命令,然后安装 -a命令在server2 上运行。

也许我不明白文件系统标识确实如此,但显然一定有比每次随机编辑 fsid 号码更好的方法来“重新挂载” NFS?

编辑:如果我没有文件系统标识包含在 server1 上的导出文件中,它给了我

"Warning: /mnt/ramdisk/dir1 requires fsid= for NFS export" 

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

编辑2: 我删除了fsid=0因为它很“特殊”,所以把它们改成了fsid=1fsid=2/etc/exports在服务器 1 上。这当然有效(因为文件已更改)。但今天不得不强制重启,并在(缓慢地)卸载服务器 2 上的陈旧驱动器后,安装 -a和之前一样失败了。因此(和之前一样),我编辑了 server1 上的导出文件,这次,fsid=2fsid=3导出文件系统-r,瞧!安装 -a在服务器 2 上再次运行。回到原点。

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

答案1

我猜测该问题是由于fsid=0您在某一个导出语句中使用了而导致的。

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

对于 NFSv4,有一个独特的文件系统,它是所有导出文件系统的根。它用fsid=root或来指定fsid=0,两者含义完全相同。

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

相关内容