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 分钟 ------ 就是它,继续往下抄作业。

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

根因:一个在 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-onlinesnapdModemManagerplymouth 这些在 WSL 里通常都没用。
  5. mask / disable 处理,保留回滚路径
    多余且被依赖拉起的服务用 mask,普通自启用 disable,都随时可逆。

总结

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

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

相关推荐
JJJennie7773 小时前
MAI Gateway技术揭秘:大模型网关能做什么?从原理到落地
linux·服务器·网络·ai网关
风哥2号5 小时前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
wuminyu8 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
新时代牛马9 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
猿与禅9 小时前
Linux(Ubuntu)入门到实战:系统管理、常用命令与权限体系完整指南
linux·ubuntu·apt·进程管理·系统运维·用户权限·vi/vim
前端世界9 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮9 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
H_oRIZoN_14 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
GeW16 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux