考虑以下/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
文件系统成功挂载后运行:
使用 ; 查找 /verbatim 的 systemd 挂载名称
systemctl list-units -t mount
,例如verbatim.mount
创建一个将运行命令的自定义服务
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
启用该新服务
systemctl enable export-verbatim
并systemctl start export-verbatim
。
答案2
使用mountpoint
或mp
/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