我尝试在系统启动后挂载 CIFS 设备(使用systemd
),但系统尝试在建立网络之前挂载系统,因此失败。
登录系统后,我可以使用sudo mount -a
.
我如何告诉我的 Arch(手臂)等待网络可用?
答案1
添加_netdev
到安装选项/etc/fstab
可能就足够了。
引用本地和网络文件系统的安装单元通过其文件系统类型规范来区分。在某些情况下,这还不够(例如基于网络块设备的挂载,例如 iSCSI),在这种情况下,_netdev 可能会添加到单元的挂载选项字符串中,这会强制 systemd 将挂载单元视为网络挂载。
此外还systemd
支持挂载条目和其他单元之间的显式顺序依赖关系:x-systemd.after=network-online.target
如果 _netdev 不够,添加到挂载选项可能会起作用。
看systemd 安装单元文档更多细节。
答案2
添加_netdev
到/etc/fstab
有问题的条目。从“mount(8)”的手册页中:
_netdev 文件系统驻留在需要网络访问的设备上(用于防止系统在系统上启用网络之前尝试挂载这些文件系统)。
答案3
有点 hacky,但所有 _netdev 和 x-systemd 选项都没有帮助,因为 WINS/DNS 仍未运行。
我开始使用 root crontab 条目:
@reboot /usr/bin/mount -a
这是在启动过程后期运行的。
因此,即使 systemd 首先挂载 fstab 中定义的 CIFS 挂载失败,稍后mount -a
再次运行 a 并且这次挂载成功。
答案4
不要与可能有效或无效的 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 成功。