作为一名日常在 Windows 与 Linux 之间频繁切换的开发人员,WSL(Windows Subsystem for Linux)几乎成了我的标配工具。这篇文章梳理了 WSL 使用过程中最常遇到的几个问题及其解决方案,希望能帮你避开一些我踩过的坑。
一、安装 WSL:一条命令搞定
最省心的方式就是在管理员 PowerShell 中直接执行:
wsl --install
这条命令会默认安装 WSL 2 并附带 Ubuntu 发行版。如果需要安装其他发行版,可以先查看可用列表:
wsl --list --online
然后指定安装:
wsl --install -d <DistributionName>
常用安装选项说明
| 选项 | 说明 |
|---|---|
--distribution | 指定要安装的 Linux 发行版名称 |
--no-launch | 安装完成后不自动启动该发行版 |
--web-download | 从网络下载安装包,而非 Microsoft Store |
--location | 自定义安装目录(适合系统盘空间紧张的同学) |
适用于未安装 WSL 环境的选项
| 选项 | 说明 |
|---|---|
--inbox | 通过 Windows 组件安装,后续更新走 Windows Update,而非 Store 推送 |
--enable-wsl1 | 同时启用 WSL 1 支持(适用于需要兼容旧环境的场景) |
--no-distribution | 仅安装 WSL 内核,不附带任何发行版 |
特别提醒:如果系统版本在 Windows 10 1903 以下,使用
--install时建议加上-d参数显式指定发行版,否则可能因默认行为差异导致安装失败。
二、重置 root 密码:忘记密码的救急方案
WSL 默认以普通用户身份登录,但如果需要对系统进行深度配置,免不了用到 root 权限。若忘记了 root 密码,可按以下步骤重置:
Step 1:以管理员身份打开 PowerShell
Step 2:查看当前已安装的发行版
wsl -l -v
确认你要操作的发行版名称(如 Debian、Ubuntu 等)。
Step 3:以 root 身份进入该发行版
wsl -d Ubuntu -u root
Step 4:修改 root 密码
进入 Linux shell 后,执行:
passwd root
系统会提示输入新密码。注意:输入时屏幕没有任何回显,这是 Linux 的默认安全策略,正常输入后回车即可,再确认一次即可生效。
Step 5:退出并验证
exit
之后就可以用新密码执行 su - 或在 sudo 场景下进行身份验证了。
三、更换软件源:让 apt 飞起来
默认源在国内的下载速度确实不太理想。这里推荐一个我个人一直在用的自动化脚本,支持一键更换国内镜像源:
# GNU/Linux 更换系统软件源
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
# Docker 安装与换源(一步到位)
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
# 仅更换 Docker 镜像加速器
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --only-registry
该脚本会自动检测系统发行版并匹配最优镜像站,支持交互式选择,比手动编辑 /etc/apt/sources.list 省心得多。更多用法可参考 linuxmirrors.cn(备用域名:edgeone.linuxmirrors.cn)。
四、局域网访问:将 WSL 桥接到物理网络
默认的 NAT 网络模式下,WSL 与宿主机在同一个网段,但外界无法直接访问 WSL 内部的服务(比如 Web 应用、数据库等)。要解决这个问题,最稳妥的方式是将 WSL 的网络模式改为 桥接模式。
4.1 查看当前网络环境
# 查看现有虚拟交换机
Get-VMSwitch
# 查看当前处于活动状态的物理网卡(Wi-Fi 或以太网)
Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
4.2 创建外部虚拟交换机
以管理员身份运行 PowerShell,执行以下命令(将 "Wi-Fi" 替换为你的实际网卡名称):
New-VMSwitch -Name "WSLBridge" -NetAdapterName "Wi-Fi" -AllowManagementOS $true
如果你更习惯 GUI 操作,也可以打开 Hyper-V 管理器 → 操作 → 虚拟交换机管理,通过界面新建一个“外部”虚拟交换机。
4.3 修改 WSL 配置文件
打开用户目录下的 %USERPROFILE%\.wslconfig 文件(若不存在则新建),添加以下配置:
[wsl2]
networkingMode=bridged
vmSwitch=WSLBridge # 必须与上一步创建的交换机名称一致
dhcp=true
4.4 重启 WSL 使配置生效
wsl --shutdown
wsl -d Ubuntu
重启后,WSL 会通过 DHCP 从局域网路由器获取独立的 IP 地址,其他设备即可通过该 IP 直接访问 WSL 中运行的服务。如果希望固定 IP,可以将 dhcp 改为 false,并在 WSL 内部手动配置静态 IP。
五、配置 SSH 服务:实现远程访问
完成桥接网络配置后,就可以在 WSL 中部署 SSH 服务,实现从局域网其他设备远程登录。
5.1 安装 SSH 服务端
sudo apt update
sudo apt install openssh-server -y
5.2 启动服务并设置开机自启
# 启动服务
sudo service ssh start
# 查看状态,确认是 active (running)
sudo service ssh status
# 设置每次 WSL 启动时自动运行(可选但推荐)
sudo systemctl enable ssh
注意:WSL 中
systemctl可能不完全兼容,如果提示报错,可以用sudo service ssh enable,或者将启动命令添加到~/.bashrc中。
5.3 修改 SSH 配置文件
使用 vi 或 nano 编辑配置文件:
sudo vi /etc/ssh/sshd_config
确保以下几个关键配置项正确:
Port 2222 # 避免与 Windows 或其他服务的 22 端口冲突
PasswordAuthentication yes # 启用密码登录(若使用密钥认证则可设为 no)
ListenAddress 0.0.0.0 # 监听所有网络接口,允许外部访问
PermitRootLogin yes # 允许 root 登录
修改完成后保存退出,然后重启服务使配置生效:
sudo service ssh restart
5.4 放行 Windows 防火墙
这是局域网访问最容易卡住的一步。需要为刚才设置的端口(如 2222)创建一条入站规则。以管理员身份打开 PowerShell,执行:
New-NetFirewallRule -DisplayName "WSL SSH" -Direction Inbound -LocalPort 2222 -Action Allow -Protocol TCP
5.5 验证 SSH 连接
先在 WSL 本机测试,确认服务已正常启动:
ssh localhost -p 2222
或从 Windows 端测试:
ssh <你的WSL用户名>@127.0.0.1 -p 2222
测试通过后,就可以从局域网内的其他设备通过 WSL 的 IP 地址进行远程访问了。
六、常见网络故障排查
在配置过程中,你可能会遇到网络不通的情况,尤其是 apt update 时出现 Temporary failure resolving 错误。这通常是因为 DNS 解析失败,WSL 无法将 archive.ubuntu.com 解析为 IP 地址。以下是快速修复方法:
6.1 手动指定 DNS
# 重新写入 DNS 配置
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 114.114.114.114" >> /etc/resolv.conf'
# 锁定文件防止被覆盖
sudo chattr +i /etc/resolv.conf
# 重新尝试更新
sudo apt update
6.2 彻底解决 DNS 同步问题
编辑 %USERPROFILE%\.wslconfig,确保包含以下配置:
[wsl2]
networkingMode=bridged
vmSwitch=WSLBridge
dhcp=true
# 关键:让 WSL 自动从 Windows 同步 DNS
dnsTunneling=true
firewall=true
autoProxy=true
保存后重启 WSL:
wsl --shutdown
重新进入 WSL 后检查 DNS 配置是否恢复正常:
cat /etc/resolv.conf
ping -c 3 archive.ubuntu.com
6.3 如果手动指定 DNS 重启后失效
# 取消锁定,重新配置后再锁定
sudo chattr -i /etc/resolv.conf
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 114.114.114.114" >> /etc/resolv.conf'
sudo chattr +i /etc/resolv.conf
6.4 其他常见原因及解决方案
| 可能原因 | 解决方案 |
|---|---|
| 企业内网限制 | 将 DNS 改为公司内部 DNS 地址(可通过 Windows 的 ipconfig /all 查看) |
| IPv6 优先导致超时 | 在 /etc/gai.conf 中取消注释 precedence ::ffff:0:0/96 100 以优先使用 IPv4 |
| 防火墙拦截 DNS 请求 | 检查 Windows 防火墙是否放行了 UDP 53 端口 |
最后聊两句
以上是我在使用 WSL 过程中高频用到的一些配置与故障处理方案。WSL 的迭代速度很快,从最初的 WSL 1 到现在的 WSL 2,性能和兼容性已经有了质的飞跃,甚至在许多场景下足以替代传统的虚拟机方案。
如果你的使用场景更复杂,比如需要嵌套虚拟化、GPU 加速或 systemd 支持,建议关注微软官方文档的更新。也欢迎在评论区交流你遇到的其他 WSL 问题。:)
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2026/08/12 07:37