现在
我的设置/etc/fstab
如下:
//192.168.5.167/H /mnt/ssd cifs credentials=/root/.smbreds,noauto,x- systemd.automount 0 0
我希望这样设置:首先应该连接网络,然后应该挂载 fstab mount。
答案1
_netdev
您可以通过在 fstab 行的选项部分中添加以下内容将此文件系统声明为网络设备,如下所示:
//192.168.5.167/H /mnt/ssd cifs credentials=/root/.smbreds,_netdev,noauto,x-systemd.automount 0 0
这将阻止系统尝试挂载该文件系统,直到系统上启用网络为止。
手册页中说明了这一点mount
:
_netdev
文件系统驻留在需要网络访问的设备上(用于防止系统在系统上启用网络之前尝试安装这些文件系统)。
重要的:
- 您似乎尝试使用
x-systemd.automount
但没有成功。正如您在问题中发布的示例所示,您在x-
和之间添加了一个额外的空格systemd.automount
,这将导致错误。如果您想在 fstab 选项中使用 systemd.automount,请像这样使用它x-systemd.automount
,然后运行sudo systemctl daemon-reload
并按照它sudo systemctl restart remote-fs.target
- 我假设您明白,使用
noauto
您在问题中添加的示例中的选项将阻止此文件系统在启动时挂载,并且不会使用mount -a
命令挂载。此文件系统只能在 fstab 行中使用此选项明确挂载。如果这不是您想要的,那么您应该删除该noauto
选项。
答案2
不要与可能有效也可能无效的 systemd 假设和遗留选项作斗争,而是让您的服务和挂载目标依赖于它。
我的 SMB 共享是从 192.168.1.2 安装的,请更改为您情况下正确的值。
# /etc/systemd/system/wait-for-ping.service
[Unit]
Description=Blocks until it successfully pings 192.168.1.2
After=network-online.target
[Service]
ExecStartPre=/usr/bin/bash -c "while ! ping -c1 192.168.1.2; do sleep 1; done"
ExecStart=/usr/bin/bash -c "echo good to go"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
使用以下命令启用该服务:
sudo systemctl daemon-reload
sudo systemctl enable --now wait-for-ping.service
然后按如下方式编辑 fstab 以将其作为最终挂载选项:
x-systemd.after=wait-for-ping.service
再执行一次systemctl daemon-reload
,您就可以验证挂载目标是否设置了正确的选项。我的挂载目标是/mnt/media
,这会创建mnt-media.mount
,因此请执行以下操作:
systemctl cat mnt-media.mount
这应该有一个像这样的标题:
# Automatically generated by systemd-fstab-generator
[Unit]
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
SourcePath=/etc/fstab
After=wait-for-ping.service
# ... rest of file follows ...
重新启动机器,你会发现你的挂载正在等待 ping 成功。
答案3
一个选项是,不要使用 /etc/fstab 中的条目,而是将以下命令添加到 /etc/rc.local:
/sbin/ifquery --all --state 2>/dev/null && /bin/mount -t cifs -o credentials=/root/.smbreds,noauto,x-
rc.local脚本是系统启动时最后运行的脚本。
ifquery 首先检查所有自动配置的网络接口是否已启动(您可以将其更改为 ping 命令以确保您有一个有效的连接),如果为真,则挂载文件系统。