wsl2
WSL2 高级配置与使用技巧
补充说明
WSL2 相比 WSL1 使用真正的 Linux 内核(基于 Hyper-V 虚拟机),提供完整的系统调用兼容性。本文涵盖 WSL2 的安装迁移、资源配置、网络代理、跨系统互操作、备份还原等高级配置。
前置条件
- Windows 10 版本 1903+ 或 Windows 11
- 已启用虚拟机平台(
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart)- BIOS 中已开启虚拟化(VT-x / AMD-V)
一、WSL1 与 WSL2 切换
查看当前版本:
wsl -l -v
将指定发行版升级到 WSL2:
wsl --set-version debian 2
设置新安装的发行版默认使用 WSL2:
wsl --set-default-version 2
如升级失败,需安装 WSL2 Linux 内核更新包:
# 下载并安装内核更新包
# https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
二、资源限制(内存 / CPU / Swap)
WSL2 默认使用主机全部内存和 CPU。通过 .wslconfig 文件限制资源占用。
配置文件位置
在 %USERPROFILE% 目录下创建 .wslconfig 文件:
# %USERPROFILE%\.wslconfig
[wsl2]
memory=8GB # 限制最大内存使用
processors=4 # 限制 CPU 核心数
swap=2GB # 交换空间大小
swapfile=C:\\Users\\meimo\\AppData\\Local\\Temp\\swap.vhdx
localhostForwarding=true # 启用 localhost 端口转发
使配置生效
wsl --shutdown
wsl
三、网络代理配置
WSL2 使用虚拟交换机,IP 地址与宿主机不同。需配置代理转发。
方案一:Windows 代理转发到 WSL2
在 Windows 上开启代理时(如 Clash),设为允许局域网连接,然后在 WSL2 中配置:
# 在 WSL2 中获取宿主机 IP
host_ip=$(ip route | grep default | awk '{print $3}')
# 临时设置代理
export http_proxy="http://$host_ip:7890"
export https_proxy="http://$host_ip:7890"
export all_proxy="socks5://$host_ip:7890"
写入 ~/.bashrc 永久生效:
# ~/.bashrc 或 ~/.zshrc
host_ip=$(ip route | grep default | awk '{print $3}')
export http_proxy="http://$host_ip:7890"
export https_proxy="http://$host_ip:7890"
export all_proxy="socks5://$host_ip:7890"
export no_proxy="localhost,127.0.0.1,::1"
方案二:WSL2 镜像网络模式(Win11 22H2+)
创建 %USERPROFILE%\.wslconfig:
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=false
autoProxy=true
配置后,WSL2 与宿主机共享同一 IP 地址,代理自动同步:
wsl --shutdown
wsl
四、跨系统互操作
1. 在 WSL2 中调用 Windows 程序
WSL2 可直接运行宿主机上的 .exe 程序:
# 打开 Windows 资源管理器
explorer.exe .
# 使用 Windows 记事本编辑 WSL2 文件
notepad.exe ~/test.txt
# 执行 Windows 命令
cmd.exe /c ipconfig
2. 在 Windows 中调用 WSL2 命令
通过 wsl 命令直接在 Windows 终端中执行 Linux 命令:
# 执行单条命令
wsl ls -la /home
# 传递管道数据
wsl grep "error" < log.txt
# 用 WSL2 的 Python 执行脚本
wsl python3 /home/meimo/script.py
3. 访问 Windows 文件
WSL2 自动挂载 Windows 驱动器到 /mnt/ 目录:
ls /mnt/c/Users/meimo/Desktop
ls /mnt/d/Downloads
注意:通过
/mnt/访问 Windows 文件性能低于 WSL2 原生文件系统(/home、/etc等)。推荐将项目文件放在 WSL2 的 Linux 文件系统中,获得最佳 IO 性能。
4. 从 Windows 访问 WSL2 文件
在 Windows 资源管理器地址栏输入:
\\wsl.localhost\debian\home\meimo
或通过快捷方式:
explorer.exe \\wsl.localhost\debian
五、磁盘与虚拟硬盘管理
1. 查看虚拟硬盘(VHDX)位置
默认路径:
%USERPROFILE%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4g2z8d5g68\LocalState\ext4.vhdx
不同发行版对应的包名不同,可通过以下命令定位:
(Get-AppxPackage -Name "*Debian*").PackageFamilyName
(Get-AppxPackage -Name "*Ubuntu*").PackageFamilyName
2. 压缩虚拟硬盘
WSL2 虚拟硬盘只会增长不会自动收缩。定期压缩可回收磁盘空间:
# 在 WSL2 内部,用零填充空闲空间
sudo dd if=/dev/zero of=/tmp/zero bs=1M status=progress
sudo rm /tmp/zero
# 在 Windows 管理员 PowerShell 中执行
wsl --shutdown
diskpart
在 diskpart 中:
# 选择 WSL2 虚拟硬盘文件
select vdisk file="C:\Users\meimo\AppData\Local\Packages\...\LocalState\ext4.vhdx"
# 压缩
attach vdisk readonly
compact vdisk
detach vdisk
exit
3. 导出与导入(备份 / 迁移)
# 导出发行版为 tar 文件
wsl --export debian D:\backup\debian.tar
# 导入到新位置
wsl --import debian D:\WSL\debian D:\backup\debian.tar --version 2
# 删除旧发行版
wsl --unregister debian
六、自定义 WSL2 内核
1. 查看当前内核版本
uname -a
2. 使用自定义内核
从 Microsoft WSL2-Linux-Kernel 下载源码编译,或在 %USERPROFILE%\.wslconfig 中指定预编译内核:
[wsl2]
kernel=C:\\Users\\meimo\\wsl2-kernel\\vmlinux
七、WSL2 中运行 Docker
WSL2 可直接运行 Docker Engine,无需 Docker Desktop。
安装 Docker Engine
# Debian / Ubuntu
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
启动 Docker
sudo service docker start
# 设置开机自启
sudo update-rc.d docker defaults
验证:
docker run hello-world
八、常见问题
内存占用过高
WSL2 默认可以耗尽宿主机全部内存。配置 .wslconfig 限制 memory 值:
[wsl2]
memory=4GB
网络代理失效
WSL2 IP 不同于宿主机。使用 networkingMode=mirrored 或手动获取 host_ip 配置代理。
时间同步偏差
# 同步 WSL2 时间到宿主机
sudo hwclock -s
跨机复制粘贴不工作
确保安装 wslu 工具并更新:
sudo apt install wslu -y