每当我必须重新启动 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=1和fsid=2在/etc/exports在服务器 1 上。这当然有效(因为文件已更改)。但今天不得不强制重启,并在(缓慢地)卸载服务器 2 上的陈旧驱动器后,安装 -a和之前一样失败了。因此(和之前一样),我编辑了 server1 上的导出文件,这次,fsid=2和fsid=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。