一、问题概述
- 现象 :Ubuntu 16.10 系统启动时,
networking.service耗时超 5 分钟,导致整体开机流程严重延迟。 - 定位工具 :通过
systemd-analyze blame命令确认,networking.service是启动过程中的主要耗时服务。
二、核心原因
- 接口配置模式冲突 :
/etc/network/interfaces中接口配置为auto(开机强制启动该接口),若接口未物理连接(如网线未插)或无法就绪,系统会等待超时(默认5分钟)。 - 默认超时时间过长 :
networking.service默认TimeoutStartSec=5min,即使无实际网络需求,也会等待超时后才继续启动流程。 - 特定接口阻塞 :未配置或非关键的网络接口(如未设置的无线接口)导致
systemd-networkd-wait-online.service等待所有接口就绪,引发阻塞。
三、解决方案(按有效性优先级排序)
方案1:修改接口配置(推荐,最高用户验证率)
- 操作步骤 :
- 编辑网络配置文件:
sudo nano /etc/network/interfaces - 将接口配置中的
auto改为allow-hotplug(例:auto eth0→allow-hotplug eth0) - 保存退出,无需重启即可生效(下次启动自动应用)。
- 编辑网络配置文件:
- 原理 :
allow-hotplug仅在接口物理连接时启动,避免无连接时的超时等待。 - 效果 :多个用户反馈,
networking.service耗时从 5 分钟降至 1~41 秒,适用于 Ubuntu 16.10/18.04/20.04/22.04 等版本。
方案2:缩短服务超时时间(快速 workaround)
- 操作步骤 :
-
编辑
networking.service配置:sudo systemctl edit networking.service -
在打开的文件中添加以下内容(确保在
[Service]段下):ini[Service] TimeoutStartSec=10sec -
保存退出,执行
sudo systemctl daemon-reload生效。
-
- 原理:将默认 5 分钟超时缩短为 10 秒,强制终止无响应的等待流程。
- 注意 :避免直接编辑
/lib/systemd/system/networking.service,否则系统更新会覆盖修改。
方案3:优化 systemd-networkd-wait-online.service(针对特定接口阻塞)
- 适用场景:因未配置的无线接口等非关键接口导致阻塞。
- 操作步骤 :
- 编辑服务配置文件:
sudo nano /lib/systemd/system/systemd-networkd-wait-online.service - 修改
ExecStart行,添加以下参数之一:- 缩短超时:
ExecStart=/lib/systemd/systemd-networkd-wait-online --timeout=10(超时设为10秒) - 忽略特定接口:
ExecStart=/lib/systemd/systemd-networkd-wait-online --ignore=接口名(例:--ignore=int_wlan0)
- 缩短超时:
- 保存退出,执行
sudo systemctl daemon-reload生效。
- 编辑服务配置文件:
- 原理:要么缩短等待超时,要么忽略非关键接口,避免阻塞启动流程。
四、验证方法
- 查看启动总耗时:
systemd-analyze time - 定位耗时服务:
systemd-analyze blame(确认networking.service耗时是否降低) - 观察启动流程:重启系统,验证是否无明显延迟。
五、关键结论
- 最优解为 方案1 (
auto改allow-hotplug),从根源解决接口等待问题,兼容性强。 - 方案2 适合快速临时解决,方案3 针对特定接口阻塞场景。
- 该问题在 Ubuntu 16.10 及后续多个版本中存在,解决方案可跨版本复用。