WSL 实用指南:从安装到网络配置全解析

/ 默认分类 / 没有评论 / 8浏览

作为一名日常在 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 配置文件

使用 vinano 编辑配置文件:

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 问题。:)