WSL启动慢问题分析与修复

WSL 启动要等 2 分钟?八成是这个服务,一条命令修复

环境:Windows 11 + WSL2(Ubuntu-22.04,systemd 已启用)。修复前冷启动 ~2min14s,修复后 ~1s。

TL;DR:直接抄作业

bash 复制代码
wsl -u root systemctl mask systemd-networkd-wait-online.service
wsl --shutdown   # 下次启动生效

就这两步。原理和排查过程往下看。

先确认你是不是同类问题

症状自查,满足任意两条基本就是:

  • 打开 WSL / Windows Terminal 后要"转圈"1~2 分钟才出命令提示符
  • /etc/wsl.conf 里有 systemd=true
  • 启动慢的是冷启动 (开机后第一次、或 wsl --shutdown 之后),而不是每个新终端窗口都慢

一条命令确诊:

bash 复制代码
systemd-analyze blame | head -5

如果 systemd-networkd-wait-online.service 排第一、耗时约 2 分钟 ------ 就是它,继续往下抄作业。

如果排第一的是别的东西(比如 snapd、plymouth、某个数据库服务),本文的排查方法同样适用,只是屏蔽对象换一下。

根因:一个在 WSL 里永远等不到的服务

systemd-networkd-wait-online.service 在正常 Linux 上的职责是网络就绪守门员:它阻塞等待所有网卡配置到"在线"状态,再放行 Nginx、数据库这类依赖网络的服务启动,避免它们在无网状态下起来就报错。

问题在于:WSL 的网卡(eth0)是 Windows 侧虚拟机管理器配好的,根本不经过 systemd-networkd 。这个守门员永远等不到"网络就绪"的信号,只能干等满默认的 2 分钟超时才放行。

所以每次冷启动,你都白等一个啥也没干的服务超时。它占了全部启动时间的 99%:

复制代码
2min 220ms  systemd-networkd-wait-online.service   ← 就是它
  1.093s    snap.lxd.activate.service
    971ms    snapd.seeded.service
    872ms    snapd.service
    ...

在 WSL 里网络由 WSL 自己管理,这个服务纯属多余,屏蔽(mask)没有任何副作用。

修复与验证

bash 复制代码
# 屏蔽(比 disable 彻底,连依赖拉起都挡住)
wsl -u root systemctl mask systemd-networkd-wait-online.service

# 冷启动一次
wsl --shutdown
wsl systemd-analyze

预期输出类似 Startup finished in 1.2s (userspace) ------ 完事。

回滚方式(万一以后需要):

bash 复制代码
sudo systemctl unmask systemd-networkd-wait-online.service

附赠:再省 2 秒(可选)

snapd 三件套(snapd.service / snapd.socket / snap.lxd.activate.service)合计约 2 秒。WSL 里一般用 apt 装软件,snap 基本闲置。先确认没在用:

bash 复制代码
snap list   # 列表里只有 core20 / lxd / snapd 等系统自带包 = 没在用

确认后禁用:

bash 复制代码
wsl -u root systemctl disable snapd.service snapd.socket snap.lxd.activate.service

# 以后想用 snap 时恢复:
# sudo systemctl enable snapd.service snapd.socket snap.lxd.activate.service

排查过程复盘(通用方法论)

这次问题 5 分钟定位,靠的是固定套路,换任何"启动慢"都适用:

  1. wsl -l -v + 检查 .wslconfig / /etc/wsl.conf
    先排除资源配置问题(内存、CPU、systemd 开关),确认慢在哪一侧。
  2. systemd-analyze
    看 userspace 耗时。如果是 2 分钟级别,说明是 Linux 侧 systemd 服务在拖,不是 Windows/VM 的问题。
  3. systemd-analyze blame + systemd-analyze critical-chain
    按耗时排序直接锁定元凶,critical-chain 确认它在关键路径上。
  4. 评估该服务在 WSL 中是否必要
    networkd-wait-online、snapd、ModemManager、plymouth 这些在 WSL 里通常都没用。
  5. mask / disable 处理,保留回滚路径
    多余且被依赖拉起的服务用 mask,普通自启用 disable,都随时可逆。

总结

修复前 修复后
冷启动 ~2min 14s ~1s
systemd-networkd-wait-online 干等 2 分钟超时 已屏蔽
snapd 三件套 ~2s 已禁用

一句话:WSL 里 systemd 的"等网络"服务等不到信号、干耗 2 分钟超时,mask 掉它。

相关推荐
坤坤子吖6 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump6 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风7 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
少司府8 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
无足鸟ICT8 小时前
【RHCA+】IO调度算法
linux·服务器
wacsii9 小时前
【Linux进程(四)】命令行参数与环境变量
linux·服务器
无奈笑天下9 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
科研邪修法10 小时前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络
Felven10 小时前
中科驭数100G网卡RDMA性能测试
linux·rdma·中科驭数·100g网卡
雪落漂泊13 小时前
Liunux进程(七):程序控制篇(中)
linux·运维·windows