开机顺序里的网络就绪
systemd 的 network.target 只表示网络管理服务已经启动,并不代表接口已经拿到地址;真正表示『地址可用』的是 network-online.target。依赖网络的挂载(NFS)与业务服务如果在开机早期启动,就会因为网卡还没起来而失败——典型现象是重启后服务报连不上远端,手动重启服务立刻恢复正常。
基本信息
| 就绪目标 | network-online.target |
|---|---|
| 等待服务 | NetworkManager-wait-online 或 systemd-networkd-wait-online |
| 服务侧写法 | [Unit] 段加 Wants=network-online.target 与 After=network-online.target |
| 查看状态 | systemctl status NetworkManager-wait-online、is-active network-online.target |
| 超时控制 | NetworkManager 侧 NM_ONLINE_TIMEOUT 环境变量 |
| 权限要求 | root 或 sudo |
典型使用场景
- NFS 或远程存储的挂载项在开机时失败
- 业务服务启动时依赖数据库或注册中心地址,偶发启动失败
- 带外监控上报类服务需要在网络就绪后再启动
- 排查『重启后第一次失败、手工重启就正常』这类问题
- 虚拟机与多网卡环境确认等待逻辑是否符合预期
检查与启用
检查与启用
systemctl status NetworkManager-wait-online --no-pager # 看等待服务是否在跑
systemctl is-enabled NetworkManager-wait-online # 是否开机自启
systemctl is-active network-online.target # 目标是否已达成
systemctl enable --now NetworkManager-wait-online.service # 启用并立即生效
systemctl list-jobs | grep -i online # 开机动不动卡住时看是否有作业在等
journalctl -b -u NetworkManager --no-pager | tail -20 # 看网络就绪过程中的报错服务单元写法
服务单元写法
[Unit]
Description=App depends on network
Wants=network-online.target # 拉入等待服务,保证目标会被等待
After=network-online.target # 在网络就绪之后再启动
[Service]
Type=simple
ExecStart=/opt/app/bin/start.sh
Restart=on-failure # 仍建议保留重启策略,兜住极端情况
[Install]
WantedBy=multi-user.target目标与语义对照
| 目标 | 含义 | 是否满足依赖网络 |
|---|---|---|
| network.target | 网络管理服务已启动 | 不满足:接口可能还没地址 |
| network-online.target | 网络已被认为可用 | 满足:推荐写法 |
| sysinit.target | 早期系统初始化完成 | 与本场景无关 |
| multi-user.target | 多用户文本模式可用 | 顺序上通常晚于网络,但非保证 |
| wait-online 服务 | 具体实现等待逻辑 | 未启用时 online.target 会立即达成 |
| NM_ONLINE_TIMEOUT | 等待超时秒数 | 设置不当会造成长时间等待 |
开启 wait-online 会拖慢开机:DHCP 慢或链路协商慢时等待时间成倍增加,只给确实需要网络的单元加依赖,不要全局统一强依赖。
多网卡或多连接环境下等待逻辑会关注所有连接是否就绪:某张网线未插时开机可能一直等到超时,应按需调整超时或使用连接级配置。