WSL 2 高级场景实战
WSL 2 的进阶使用场景,涵盖 NAT 与镜像网络模式配置、VPN/代理适配、Linux GUI 应用运行、GPU 加速机器学习、USB 设备连接,以及自定义 Linux 发行版导入。
网络架构与配置
两种网络模式
WSL 2 提供两种网络架构:
| NAT 模式(默认) | 镜像模式 | |
|---|---|---|
| 适用版本 | 所有 WSL 2 | Windows 11 22H2+ |
| IP 地址 | WSL 有独立 IP,与 Windows 不同 | WSL 和 Windows 共享网络接口 |
| localhost 访问 | 需要 IP 查询 | 直接使用 127.0.0.1 |
| IPv6 | 不支持 | 支持 |
| VPN 兼容性 | 部分兼容 | 更好 |
| LAN 直连 | 需端口转发 | 直接可访问 |
| 配置方式 | 默认 | .wslconfig 中设置 |
NAT 模式
NAT 模式下 WSL 2 使用独立的虚拟化以太网适配器,拥有自己的 IP 地址。
从 Windows 访问 Linux 服务:
# 获取 WSL 发行版 IP
wsl hostname -I
# 输出示例:172.30.98.229
然后在 Windows 浏览器访问 http://<WSL_IP>:<端口>,或直接使用 localhost(WSL 会自动转发)。
从 Linux 访问 Windows 服务:
# 获取 Windows 主机 IP
ip route show | grep -i default | awk '{ print $3}'
# 输出示例:172.30.96.1
然后在 WSL 中使用该 IP 连接 Windows 上的服务。
从局域网访问 WSL 服务(端口转发):
WSL 2 默认不接受来自 LAN 的直接连接。需要通过 netsh 做端口转发:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=$(wsl hostname -I)
查看所有端口转发规则:
netsh interface portproxy show all
删除规则:
netsh interface portproxy delete v4tov4 listenport=4000 listenaddress=0.0.0.0
镜像模式
镜像模式将 Windows 网络接口「镜像」到 Linux,WSL 和 Windows 共享网络栈。
启用方式,在 %USERPROFILE%\.wslconfig 中添加:
[wsl2]
networkingMode = mirrored
镜像模式的优势:
- WSL 和 Windows 之间使用
127.0.0.1直接互通,无需查询 IP - 支持 IPv6
- VPN 兼容性更好
- 支持多播
- LAN 设备可以直接访问 WSL 中的服务
防火墙配置(管理员 PowerShell):
# 允许所有入站连接(开发环境用)
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
# 或只开放特定端口
New-NetFirewallHyperVRule -Name "MyWebServer" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
DNS 隧道
Windows 11 22H2+ 默认启用 DNS 隧道,通过 WSL 内的虚拟化功能响应 DNS 请求,而非通过网络数据包。这改善了 VPN 等复杂网络环境下的 DNS 解析。
[wsl2]
dnsTunneling = true
自动代理
启用后 WSL 自动使用 Windows 的 HTTP 代理配置:
[wsl2]
autoProxy = true
VPN 与代理配置
WSL 2 使用独立虚拟网卡,网络行为与 Windows 侧不完全一致。根据实际网络环境选择适配方案。
方案一:镜像模式 + 自动代理(推荐)
Windows 11 22H2+ 用户首选。在 .wslconfig 中启用镜像模式和自动代理后,WSL 会自动继承 Windows 侧的网络和代理配置,无需额外设置:
[wsl2]
networkingMode = mirrored
autoProxy = true
方案二:NAT 模式下手动配置代理
如果使用默认 NAT 模式(Win10 或未配置镜像模式),需要在 WSL 内手动设置代理。将以下内容添加到 ~/.bashrc:
# 获取 Windows 主机 IP
export hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
# 设置代理(端口号根据实际代理工具调整)
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
此方案的原理是:NAT 模式下 Windows 是 WSL 的网关(通过 resolv.conf 中的 nameserver 获取 IP),代理流量通过网关转发到 Windows 侧的代理软件。
方案三:DNS 隧道改善 VPN 解析
如果使用 VPN 后 WSL 内域名解析异常,启用 DNS 隧道可以解决:
[wsl2]
dnsTunneling = true
运行 Linux GUI 应用
WSLg 能力
WSL 2 通过 WSLg 支持直接在 Windows 桌面上运行 Linux GUI 应用(X11 和 Wayland),具有以下特性:
- 从 Windows「开始」菜单启动 Linux 应用
- 将 Linux 应用固定到任务栏
- 使用
Alt+Tab在 Linux 和 Windows 应用间切换 - 跨系统剪贴板(剪切 + 粘贴)
系统要求
安装 GUI 应用
先更新软件包:
sudo apt update
GIMP(图像编辑器):
sudo apt install gimp -y
gimp
Nautilus(文件管理器,类似 Windows 资源管理器):
sudo apt install nautilus -y
nautilus
VLC(多媒体播放器):
sudo apt install vlc -y
vlc
GNOME 文本编辑器(Ubuntu 22.10+ 默认编辑器):
sudo apt install gnome-text-editor -y
gnome-text-editor ~/.bashrc
旧版 Ubuntu 使用 gedit:
sudo apt install gedit -y
Google Chrome:
cd /tmp
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -f ./google-chrome-stable_current_amd64.deb
google-chrome
Microsoft Edge(Linux 版):
# 安装方法见 https://www.microsoft.com/edge/download/insider?platform=linux
microsoft-edge
X11 工具集(计算器、时钟等):
sudo apt install x11-apps -y
xcalc
xclock
xeyes
故障排除
如果 GUI 应用无法启动,参考 WSLg 故障诊断指南。
GPU 加速机器学习
WSL 2 支持两种 GPU 加速方案:NVIDIA CUDA 和 DirectML。
方案一:NVIDIA CUDA + Docker
适用条件: 拥有 NVIDIA 显卡。
步骤:
-
在 Windows 侧安装 NVIDIA 最新驱动
-
在 WSL 中安装 Docker:
curl https://get.docker.com | sh
sudo service docker start
- 安装 NVIDIA Container Toolkit:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker-keyring.gpg
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-docker-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
- 运行 TensorFlow 容器并验证 GPU:
docker run --gpus all -it --shm-size=1g nvcr.io/nvidia/tensorflow:20.03-tf2-py3
# 在容器内运行预训练模型
cd nvidia-examples/cnn/
python resnet.py --batch_size=64
方案二:DirectML(TensorFlow / PyTorch)
适用条件: AMD、Intel 或 NVIDIA 显卡均可。
步骤:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
conda create --name directml python=3.7 -y
conda activate directml
- 安装框架:
# TensorFlow-DirectML
pip install tensorflow-directml
# 或 PyTorch-DirectML
sudo apt install libblas3 libomp5 liblapack3
pip install torch-directml
- 验证(Python 交互模式):
import tensorflow as tf
print(tf.__version__)
多 GPU 选择
如果机器有多个 GPU,通过环境变量选择:
export MESA_D3D12_DEFAULT_ADAPTER_NAME="<设备管理器中的名称>"
使用字符串匹配,例如设置为 "NVIDIA" 会匹配以 NVIDIA 开头的第一个 GPU。
USB 设备连接
WSL 2 不原生支持 USB 设备,需要通过 usbipd-win 开源项目桥接。
前提条件
- Windows 11(内部版本 22000+),Windows 10 也支持但需额外步骤
- x64 或 ARM64 处理器(x86 不支持)
- WSL 已更新到最新版本
- Linux 内核版本 >= 5.10.60.1(通过
uname -a检查,通过wsl --update更新)
安装 usbipd-win
方式一:winget
winget install --interactive --exact dorssel.usbipd-win
方式二:手动安装
从 usbipd-win Releases 下载 .msi 安装器。
安装后会产生:
usbipd服务(可通过 Windows 服务管理器查看状态)usbipd命令行工具- 防火墙规则(允许本地子网连接)
连接 USB 设备
-
确保 WSL 终端已打开(保持 WSL 2 VM 运行)
-
以管理员身份打开 PowerShell,列出所有 USB 设备:
usbipd list
- 找到目标设备的 BUSID(如
4-4),绑定设备:
usbipd bind --busid 4-4
- 将设备附加到 WSL:
usbipd attach --wsl --busid 4-4
- 在 WSL 中验证:
lsusb
断开设备
物理断开 USB,或在 PowerShell 中执行:
usbipd detach --busid 4-4
自定义 Linux 发行版导入
Microsoft Store 外的 Linux 发行版(如 CentOS、Alpine、Gentoo 等)可以通过 tar 文件导入到 WSL 2。
获取 tar 文件
方式一:从官方下载
例如 Alpine Linux 在下载页面提供「Mini Root Filesystem」的 tar 文件。
方式二:从 Docker 容器导出
以 CentOS 为例:
# 在已有的 WSL 发行版中操作(确保 Docker 正在运行)
docker run -t --name wsl_export centos ls /
docker export wsl_export > /mnt/c/temp/centos.tar
docker rm wsl_export
导入到 WSL
# 创建存储目录
mkdir E:\wslDistroStorage\CentOS
# 导入
wsl --import CentOS E:\wslDistroStorage\CentOS C:\temp\centos.tar
# 验证
wsl -l -v
# 启动
wsl -d CentOS
设置默认用户
默认以 root 用户启动。在发行版内创建用户:
# 以 CentOS 为例
yum update -y && yum install passwd sudo -y
myUsername=yourname
adduser -G wheel $myUsername
echo -e "[user]\ndefault=$myUsername" >> /etc/wsl.conf
passwd $myUsername
重启使生效:
wsl --terminate CentOS
wsl -d CentOS
构建自定义发行版
如果需要将自定义发行版打包为 UWP 应用(行为与 Store 发行版完全一致),可以按照微软官方的 构建自定义发行版指南 进行操作。