如何在Windows 11 WSL2中启用Systemd并解决ping不通及DNS解析问题?

摘要:前言 今天使用 WSL2 (Ubuntu 22.04.1 LTS) 的时候,遇到了ping不通的问题,提示:ping: connect: Network is unreachable 以及执行 sudo apt update 命令出现错误:
前言 今天使用 WSL2 (Ubuntu 22.04.1 LTS) 的时候,遇到了ping不通的问题,提示:ping: connect: Network is unreachable 以及执行 sudo apt update 命令出现错误:Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease Temporary failure resolving 'archive.ubuntu.com' 向 ChatGPT 提问和折腾,最终 ChatGPT 还是没能帮我解决问题。 只好上谷歌搜索引擎找答案,最终解决。 首先检查是否是 WSL2 自从 Windows 11 开始,Windows Subsystem for Linux 默认就是 WSL2, 如果不确定是不是WSL2,可以执行以下命令查看: C:\Users\Administrator> wsl -v WSL 版本: 2.0.14.0 内核版本: 5.15.133.1-1 WSLg 版本: 1.0.59 MSRDC 版本: 1.2.4677 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp Windows 版本: 10.0.22631.2861 执行以下命令,查看适用于 Linux 的 Windows 子系统分发版本: C:\Users\Administrator> wsl -l -v NAME STATE VERSION * Ubuntu-22.04 Stopped 2 docker-desktop-data Stopped 2 如果VERSION显示不是2,可以使用如下命令升级为 WSL2: 设置WSL默认版本为2 C:\Users\Administrator> wsl --set-default-version 2 更新WSL C:\Users\Administrator> wsl --update 设置子系统分发版本 执行命令:wsl --set-version <分发版名称> <版本号> C:\Users\Administrator> wsl --set-version Ubuntu-22.04 2 这一步比较耗时,执行完成后通过命令 wsl -l -v 来查询升级是否成功。 启用 Systemd 一开始我以为升级到 WSL2 之后,wsl.conf 就没有作用了,其实依然还是有用的。 不管是 WSL1 还是 WSL2,都是通过 wsl.conf 文件来启用 Systemd。 进入WSL后,执行命令 vim /etc/wsl.conf 编辑 wsl.conf 文件,如果文件不存在,则新建 wsl.conf 文件, 如果 wsl.conf 文件里有其它内容,除非你清楚每一行配置的含义,否则建议全部清空。然后输入 i 启用编辑模式,并且添加以下行: [boot] systemd=true 然后按 Esc 键,最后输入 :wq 保存和退出。 在WSL之外的另一个窗口,执行以下命令,重启 WSL 实例以使这些更改生效。 C:\Users\Administrator> wsl --shutdown 重新进入 WSL 后,再执行以下命令: systemctl restart systemd-networkd systemctl enable systemd-networkd systemctl restart systemd-resolved.service systemctl enable systemd-resolved.service 更多 wsl.conf 配置项参考:https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#configuration-settings-for-wslconf 修复ping不通和DNS无法解析等的问题 从 WSL2 开始,新增了 .wslconfig 配置文件,默认没有生成这个文件,需要手工创建到 %UserProfile% 目录下。 例如 C:\Users\<UserName>\.wslconfig。 编辑 .wslconfig 文件,添加以下行: [wsl2] networkingMode=bridged # 桥接模式 vmSwitch=PublicNetwork # 你想使用的虚拟交换机 ipv6=true # 启用 IPv6 如果没有 ipv6,可以设置为false,或将该配置项移除掉。 如果不知道 vmSwitch 的值应该如何填,以管理员身份运行 powershell,并且执行以下命令: ❯ Get-VMSwitch Name SwitchType NetAdapterInterfaceDescription ---- ---------- ------------------------------ Default Switch Internal WSL (Hyper-V firewall) Internal PublicNetwork External Realtek Gaming 2.5GbE Family Controller 如果仅需要列出使用了 外部网络 的虚拟交换机,可以增加命令参数:-SwitchType External ❯ Get-VMSwitch -SwitchType External Name SwitchType NetAdapterInterfaceDescription ---- ---------- ------------------------------ PublicNetwork External Realtek Gaming 2.5GbE Family Controller 保存后,执行以下命令,重启 WSL 实例以使这些更改生效。 C:\Users\Administrator> wsl --shutdown 更多 .wslconfig 配置项参考:https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#main-wsl-settings 本文先后参考了以下文章: https://zhuanlan.zhihu.com/p/593263088 https://www.cnblogs.com/lic0914/p/17003251.html https://learn.microsoft.com/en-us/windows/wsl/wsl-config#wslconfig https://beebom.com/how-enable-systemd-wsl-windows-11/ https://www.cnblogs.com/stulzq/p/13926936.html