Win10 老笔记本复活记:WSL 卡死排查、升级 WSL 3.0 与 Docker 踩坑全记录 2026-10-11 程序之旅,记录 暂无评论 8 次阅读 # Win10 老笔记本复活记:WSL 卡死排查、升级 WSL 3.0 与 Docker 踩坑全记录 > 环境:Dell 笔记本 / Windows 10 22H2 (19045) / 一台常年靠休眠续命的开发机 > 时间线:某个周六下午 6 点到晚上 10 点 ## 一、起因:`wsl -l -v` 直接卡死 周傍晚想进 WSL 干活,`wsl -l -v` 敲下去毫无反应,光标卡在那里,`Ctrl+C` 都得等半天。重启终端、重开窗口都没用。 ### 排查过程 先看 WSL 相关服务: ```powershell Get-Service LxssManager # StopPending ← 卡在这 Get-Service vmcompute, hns # Running,正常 ``` 关键发现:**LxssManager 服务停在 StopPending 状态**——正在停止,但永远停不完。再看进程: ```powershell Get-CimInstance Win32_Service -Filter "Name='LxssManager'" # State=StopPending, PID=11908(svchost 宿主) ``` 尝试强杀: ```powershell Stop-Process -Id 11908 -Force # 拒绝访问 taskkill /F /PID 11908 # 拒绝访问 ``` 普通管理员令牌动不了服务宿主 svchost。而 wsl.exe 每次调用都要等 LxssManager 响应,服务卡死 = 所有 WSL 命令全部假死。 **根因复盘**:这台机器习惯用休眠代替关机。休眠唤醒后,LxssManager(inbox 旧版 WSL 的核心服务)没能正常恢复,卡在半死状态。这是 Win10 内置版 WSL 的经典问题,微软已基本停止修复。 ### 解决 重启电脑(唯一解)。重启后顺手做了下面这次升级,一劳永逸。 ## 二、升级到新版 WSL(商店版) Win10 内置的 WSL 是老版本,服务叫 LxssManager;新版 WSL 改用独立的 WSLService,大量卡死问题已修复。 **步骤:** ```powershell # 1. 看当前版本(旧版会报错或提示没有已安装的分发版) wsl --version # 2. 在线升级;如果商店被组策略限制,走 GitHub 直下 wsl --update wsl --update --web-download # 商店不可用时的备选 # 3. 网络不好就手动下 MSI: # https://github.com/microsoft/WSL/releases/latest # 选 Microsoft.WSL_x.x.x.x_x64.msi 双击安装 # 要求 Win10 21H2 (19044) 及以上 # 4. 验证 wsl --version # 应显示 3.x Get-Service WSLService # 新服务已接管 wsl -l -v # 恢复正常 ``` 升级后我这边的结果:WSL 3.0.1.0 / 内核 6.18.40.1-1 / WSLg 1.0.79。旧的 LxssManager 不再承担工作,也不用禁用它(手动启动类型,闲置不占资源,留着当回退保险)。 ## 三、坑 1:Win10 上启动弹"无法加载远程桌面服务 ActiveX 控件" 升级完一启动,弹窗报 `rdclientax.dll` 缺失。这是新版 WSL 默认开启 **WSLg**(Linux 图形应用支持)导致的——它依赖的远程桌面组件 Win10 上没有,Win11 才全。 **解决:关掉 WSLg**(不影响命令行使用): ```powershell Set-Content -Path "$env:USERPROFILE\.wslconfig" -Value "[wsl2]`nguiApplications=false" wsl --shutdown ``` 这个报错本身反而说明新版装成功了——是新功能的副作用,不是故障。真要跑 Linux 图形程序,Win10 上装 VcXsrv 配 DISPLAY 更靠谱。 ## 四、坑 2:apt 报 Unable to locate package 升级完装东西,`apt install fish` 报 `Unable to locate package fish`。 原因:升级/重装后的系统包索引是空的(或没启用 universe 仓库): ```bash sudo apt update # 90% 的情况这就够了 # 还不行就补 universe 源: sudo add-apt-repository universe sudo apt update && sudo apt install fish ``` ## 五、坑 3:Hash Sum mismatch 换国内源 `apt update` 紧接着报 `Hash Sum mismatch`——`archive.ubuntu.com` 国内 CDN 返回的内容和索引对不上,属于经典国内网络问题。 **Ubuntu 24.04 (noble) 注意**:源配置不再是老的 `/etc/apt/sources.list` 单文件,而是新格式 `/etc/apt/sources.list.d/ubuntu.sources`(deb822 格式)。网上老教程改 sources.list 会发现根本不生效。 ```bash # 1. 清掉损坏的索引缓存 sudo rm -rf /var/lib/apt/lists/* # 2. noble 新格式:改 ubuntu.sources sudo sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g; s|http://security.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources # 老版本 Ubuntu 才是改 /etc/apt/sources.list,同样 sed 换域名 sudo apt update ``` ## 六、坑 4:装 Docker,源再拖一次后腿 WSL2 里直接装 Ubuntu 原生 Docker(没用 Docker Desktop): ```bash sudo apt install docker.io # 别用 snap 装,WSL 里 snap 版权限问题多 sudo systemctl enable --now docker # systemd 正常启用 ``` 结果当晚阿里云源抽风,`apt update` 超过 5 分钟跑不完。换成清华源,18 秒收工: ```bash sudo sed -i 's|https://mirrors.aliyun.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources ``` **经验:国内镜像没有永远的快,阿里云、清华、中科大备着轮着用,谁快用谁。** ## 七、坑 5:从 Windows 复制进 WSL 的配置文件,权限全是 666 部署一套自带 MySQL 数据的容器化环境时,把 D 盘的 `my.cnf` 和数据目录复制进 WSL 后,MySQL 容器陷入崩溃循环。 看日志发现关键一行: ``` Warning: World- writable config file '/etc/mysql/my.cnf' is ignored. ``` Windows 文件系统没有 POSIX 权限位,经 `/mnt/d` 复制过来的文件全是 666(全员可写)。MySQL 出于安全考虑**直接拒绝加载**这个配置文件——于是 `lower_case_table_names=1` 没生效,而数据字典初始化时是按 1 建的,服务器却按默认 0 启动,直接崩。 ```bash chmod 644 /path/to/my.cnf # 修复 docker restart mysql容器 ``` **凡是 Windows → WSL 复制过来的配置文件(conf/ini/yml),先 `ls -l` 检查权限,chmod 一下保平安。** ## 八、坑 6:docker-compose v1 遇上 Docker 29,当场去世 环境包里自带一个 Python 版 docker-compose(1.29.2)。跑 `docker-compose up -d` 时: ``` KeyError: 'ContainerConfig' ``` 原因:Docker 25+ 的镜像元数据里删掉了 `ContainerConfig` 字段,Python 版 compose v1 一读就崩。更烦的是它崩之前还把原容器停掉并改名了,留下一个孤儿容器。 **解决**:卸载 v1,改装 compose v2(Go 版,注意是 `docker compose` 子命令形式,中间没横杠): ```bash sudo apt remove docker-compose sudo apt install docker-compose-v2 docker compose up -d # v2 用法 ``` **看到 `ContainerConfig` 报错,不用怀疑自己的 yml,直接换 v2。** ## 九、坑 7:MySQL 8 客户端连不上——认证插件不兼容 容器里的 MySQL 8.0.44 一切正常,但 Windows 侧客户端连接报认证错误。 原因:MySQL 8 默认认证插件是 `caching_sha2_password`,老版本 Navicat/驱动不认识。 ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; ``` ## 十、零碎但救命的小技巧 **1. pkill 会杀掉自己**:`pkill -f install-merak` 时,这条命令自己的 cmdline 里也含 "install-merak",于是把自己也杀了。用括号技巧规避自匹配: ```bash pkill -f "[i]nstall-merak" ``` **2. 长任务别指望前台输出**:WSL 里跑几十分钟的安装脚本,用 setsid 分离会话 + 落日志,再轮询: ```bash setsid bash /path/to/install.sh > /root/install.log 2>&1 < /dev/null & tail -f /root/install.log ``` **3. 跨系统数据要搬家**:数据库数据别直接挂 `/mnt/d` 跑(9p 协议性能差、权限乱),复制到 WSL 内部 ext4 文件系统(`~/xxx`)再用。 **4. WSL 端口 Windows 直接访问**:WSL2 的 localhostForwarding 会自动把 WSL 里监听的端口映射到 Windows 的 localhost,`localhost:3306`、`localhost:80` 直接用,不用查 WSL IP。 ## 十一、总结 一晚上踩的坑按时间线排: | # | 坑 | 一句话解法 | | ---- | ------------------------------ | -------------------------- | | 1 | LxssManager StopPending 卡死 | 重启 + 升级商店版 WSL | | 2 | Win10 弹 rdclientax.dll 错 | `.wslconfig` 关 WSLg | | 3 | Unable to locate package | `apt update` + universe 源 | | 4 | Hash Sum mismatch | 清索引缓存 + 换国内源 | | 5 | 国内源忽快忽慢 | 阿里云/清华/中科大轮换 | | 6 | 配置文件权限 666 被 MySQL 拒载 | chmod 644 | | 7 | compose v1 报 ContainerConfig | 换 docker compose v2 | | 8 | MySQL 8 客户端认证失败 | 改 mysql_native_password | 最终环境:WSL 3.0.1 + Ubuntu 24.04 + Docker 29.1.3 + MySQL 8.0.44 / Redis 8.0.2 / Nginx 1.28.0 三容器,SSH 直连,Windows 侧 localhost 全部直通——一台 Win10 老笔记本就此变身轻量开发服务器。 **防复发三件套**:升级商店版 WSL(治本);休眠前 `wsl --shutdown`;关掉"快速启动"。 打赏: 微信, 支付宝 标签: ai, agent, wsl 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。