如果磁盘挂载点导出无法挂载,如何启动 NFS 服务器?

如果磁盘挂载点导出无法挂载,如何启动 NFS 服务器?

考虑以下/etc/exports

/verbatim 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
/sandisk 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)

/verbatim并且/sandisk是外部硬盘的挂载点,定义/etc/fstab如下:

/dev/disk/by-uuid/06b24834-a749-4d93-b0d5-a6da71eaf224 /verbatim ext4 defaults 0 1
/dev/disk/by-uuid/d7dbea69-0332-4d12-b905-b9a116e28422 /sandisk ext4 defaults 0 1

现在,如果任何硬盘无法挂载(例如,当硬盘关闭或拔出时),NFS 服务器将无法启动。我认为日志中的相关条目如下:

Sep 23 09:45:26 lilo systemd[1]: dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.device: Job dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.device/start timed out.
Sep 23 09:45:26 lilo systemd[1]: Timed out waiting for device SAMSUNG_HD204UI 1.
Sep 23 09:45:26 lilo systemd[1]: Dependency failed for File System Check on /dev/disk/by-uuid/06b24834-a749-4d93-b0d5-a6da71eaf224.
Sep 23 09:45:26 lilo systemd[1]: Dependency failed for /verbatim.
Sep 23 09:45:26 lilo systemd[1]: Dependency failed for NFS server and services.
Sep 23 09:45:26 lilo systemd[1]: nfs-server.service: Job nfs-server.service/start failed with result 'dependency'.
Sep 23 09:45:26 lilo systemd[1]: verbatim.mount: Job verbatim.mount/start failed with result 'dependency'.
Sep 23 09:45:26 lilo systemd[1]: systemd-fsck@dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.service: Job systemd-fsck@dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.service/start failed with result 'dependency'.
Sep 23 09:45:26 lilo systemd[1]: dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.device: Job dev-disk-by\x2duuid-06b24834\x2da749\x2d4d93\x2db0d5\x2da6da71eaf224.device/start failed with result 'timeout'.

有什么方法可以配置 NFS 服务器来启动并为其他驱动器(sandisk)提供服务,即使某些驱动器无法安装(逐字)?

答案1

我真的很惊讶当磁盘未安装时 NFS 无法启动。不过这是好事。因为未安装的磁盘只是显示为一个空目录,而导出空目录对 NFS 服务器来说应该不是问题。如果 NFS 可以启动并导出该空目录,那么您也不会处于一个好的位置。

您的 NFS 客户端可能会抱怨他们的文件丢失,或者可能没有丢失,并且他们会开始填满您的根文件系统。

如果您的磁盘恢复并再次挂载,它将被挂载在写入根文件系统的文件之上并隐藏这些文件。这也不是一件好事。


您可以从中删除不可靠和可移动的文件系统/etc/exports

这解决了 NFS 服务器未挂载时无法启动的问题。

一旦 NFS 服务器运行,您就可以使用exportfs使用-i标志(忽略/etc/exports和有关缺失条目的投诉)来控制它。

/verbatim这样,仅当可移动磁盘已连接、已打开电源并已正确安装时,您才可以在正在运行的服务器上开始导出。


实现自动化的方法是创建一个自定义的 systemd 服务,该服务仅在/verbatim文件系统成功挂载后运行:

  1. 使用 ; 查找 /verbatim 的 systemd 挂载名称systemctl list-units -t mount,例如verbatim.mount

  2. 创建一个将运行命令的自定义服务exportfs,例如通过将其创建为/etc/systemd/system/export-verbatim.service
    下面的代码是概念,未经测试。

    [Unit]
    Description=Export /verbatim once mounted
    Requires=verbatim.mount
    After=verbatim.mount
    
    [Service]
    Type=oneshot
    ExecStart=/path/to/exportfs -i -and more -options
    
    [Install]
    WantedBy=verbatim.mount
    
  3. 启用该新服务systemctl enable export-verbatimsystemctl start export-verbatim

答案2

使用mountpointmp/etc/exports

mountpoint=path
mp
此选项使得仅当目录已成功挂载时才可以导出目录。如果没有指定路径(例如 mountpoint 或 mp),则导出点也必须是挂载点。如果不是,则不会导出导出点。这可以确保挂载点下的目录永远不会被意外导出,例如,如果文件系统由于磁盘错误而无法挂载。

如果给出了路径(例如 mountpoint=/path 或 mp=/path)那么指定的路径必须是要导出的导出点的挂载点。

/verbatim 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check,mountpoint)
/sandisk 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check,mountpoint)

另外,考虑使用,auto,nofail以便/etc/fstab在外部磁盘拔出或关闭电源时操作系统启动:

/dev/disk/by-uuid/06b24834-a749-4d93-b0d5-a6da71eaf224 /verbatim ext4 auto,nofail 0 1
/dev/disk/by-uuid/d7dbea69-0332-4d12-b905-b9a116e28422 /sandisk ext4 auto,nofail 0 1

相关内容