After= 仅控制启动顺序而非依赖关系,需配合 Wants= 或 Requires= 才能确保 network-online.target 就绪后再挂载;\_netdev 在手动 .mount 单元中无效,应显式声明 Wants=network-online.target 和 After=network-online.target,并启用对应 wait-online 服务。

systemd mount unit 的 After= 为什么没用
因为 After= 只控制启动顺序,不表达依赖关系。即使你写了 After=network-online.target,systemd 仍可能在 network-online.target 尚未就绪时就尝试挂载——尤其当 mount unit 没声明 Wants= 或 Requires= 时,它只是“等一等”,而不是“等到位”。
_netdev 在 systemd mount unit 中是否有效
无效。systemd 的 .mount 单元不识别 _netdev 这个 fstab 标志。它只被传统的 mount -a 或 systemd-fstab-generator 解析(且仅限于自动生成的单元)。手动写的 .mount 单元里写 Options=_netdev 不会触发任何网络等待逻辑。
- 真正起作用的是显式依赖:
Wants=network-online.target+After=network-online.target - 还要加
StartLimitIntervalSec=0防止首次失败后被禁用 - 如果挂载点是 NFSv4 或 CIFS,建议额外加
Restart=on-failure和RestartSec=5
正确写法:带超时和重试的网络感知挂载单元
以挂载远程 NFS 为例,/etc/systemd/system/mnt-data.mount 应包含:
[Unit] Description=Mount remote NFS share Wants=network-online.target After=network-online.target StartLimitIntervalSec=0 [Mount] What=192.168.1.100:/data Where=/mnt/data Type=nfs4 Options=defaults,hard,intr,timeo=14,rsize=1048576,wsize=1048576 [Install] WantedBy=multi-user.target
-
Wants=确保 network-online.target 被拉起(但不强制失败);若要强依赖,改用Requires= -
After=和Wants=必须成对出现,否则顺序无意义 - NFS 推荐用
nfs4类型而非nfs,避免 v3 的 portmap 依赖问题 - 不要省略
Type=,否则 systemd 可能误判为本地文件系统而跳过网络检查
验证是否真等到了网络就绪
运行 systemctl show mnt-data.mount | grep -E "(Wants|After|ActiveState)",确认输出中同时存在 Wants=network-online.target 和 ActiveState=active;再用 journalctl -u mnt-data.mount -u network-online.target --since "1 hour ago" 查看时间戳,确认挂载日志在 Reached target Network is Online 之后出现。
最容易被忽略的是:很多发行版默认不启用 systemd-networkd-wait-online.service,导致 network-online.target 永远不会被触发——必须运行 sudo systemctl enable systemd-networkd-wait-online.service(若用 systemd-networkd),或对应于 NetworkManager 的 NetworkManager-wait-online.service。










