WSL: Linux on Windows Explained

摘要

WSL: Linux on Windows Explained

文档:https://learn.microsoft.com/en-us/windows/wsl/

极速搭建开发环境: 直接在 Windows 上运行 Python、C++、Rust、Go、Node.js 等 Linux 版本的开发工具链,避免环境配置带来的繁琐。

使用强大的 Shell 工具: 可以在 Windows 下原生使用 grepsedawk 等文本处理神手,以及高效的 zshfish

容器化开发: 与 Docker Desktop 深度集成,利用 WSL 2 的 Linux 内核运行 Docker 容器,性能远超传统的 Hyper-V 模式。

跨系统文件互操作: 你可以在 Linux 终端里编辑 Windows 磁盘上的代码文件,也可以在 Windows 资源管理器里像访问 U 盘一样访问 Linux 的文件系统。

运行 Linux 图形应用: 现在的 WSL 2 支持原生 Linux GUI 程序(如编辑器、浏览器甚至是简单的游戏)。

基础使用

安装

安装wsl

安装分发

1
2
3
4
# 列出可用的分发
wsl.exe --list --online
# 安装
wsl --install Ubuntu-22.04

列出已安装

1
wsl -l

启动。这个系统名称不能缩写(但是大小写不敏感)

1
wsl.exe -d Ubuntu-22.04

退出

exit

切换默认用户

1
2
# 格式:<系统分发版命令> config --default-user <你的用户名>
ubuntu config --default-user mintind

删除分发

1
wsl --unregister Ubuntu-22.04

导出+导入(路径迁移)

建议操作顺序:

1
2
3
导出: wsl --export Ubuntu D:\backup.tar
注销: wsl --unregister Ubuntu
重新导入: wsl --import MyWorkEnv D:\WSL\MyWorkEnv D:\backup.tar

查看所有已安装系统的路径

1
Get-ChildItem -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" | ForEach-Object { Get-ItemProperty -Path $_.PSPath } | Select-Object DistributionName, BasePath

这里系统名称可以指定,用什么名以后就叫什么名了,注意一下。另外这个系统名称不能和已有的重复

1
2
3
4
5
# 格式:wsl --export <系统名称> <备份文件路径>
wsl --export Ubuntu D:\WSL_Backup\ubuntu_export.tar

# 格式:wsl --import <新系统名称> <安装的目标路径> <备份文件路径> --version 2
wsl --import Ubuntu-22.04 D:\Default\Documents\wsl\Ubuntu-22.04 D:\Default\Documents\wsl\backup\ubuntu_export.tar

配置

网络

dns

1
sudo vim /etc/resolv.conf

改成

1
2
nameserver 8.8.8.8
nameserver 1.1.1.1

wsl默认会在每次 WSL 启动(或网络变化)时重新生成 /etc/resolv.conf,所以重启后会丢失。持久化:

重启后(因为这个文件是符号链接,设置了不自动生成后就会移除)编辑/etc/wsl.conf,添加:

1
2
[network]
generateResolvConf = false

告诉 WSL:不要再自动生成 /etc/resolv.conf

访问本机代理

代理软件需要设置允许LAN/局域网连接,或者把监听地址从127.0.0.1改为0.0.0.0

先查询主机ip

1
ip route | grep default

临时方案:

代理的ip设成主机ip,端口是你的代理软件的端口

1
2
export http_proxy=http://172.17.192.1:7890
export https_proxy=http://172.17.192.1:7890

这个方案是暂时的,后面再做持久化现在不管了。不行VSCode需要网我又回来了

永久方案:

编辑~/.bashrc,添加:

1
2
3
4
5
# ===== proxy for WSL =====
export hostip=$(ip route | awk '/default/ {print $3}')
export http_proxy=http://$hostip:7890
export https_proxy=http://$hostip:7890
export ALL_PROXY=socks5://$hostip:78970

然后

1
source ~/.bashrc

但是据说因为ip可能会变这个也不稳定但是先这样吧

测试wsl中是否能访问代理

1
nc -zv 172.17.192.1 7890

如果wsl还是没法访问代理,可能是防火墙原因。可以给代理软件加个放行规则

1
2
3
4
5
New-NetFirewallRule -DisplayName "Allow Clash 7890" `
-Direction Inbound `
-Action Allow `
-Protocol TCP `
-LocalPort 7890

文件系统访问

wsl访问本地

在wsl中本机的文献系统会被挂载到/mnt目录下,可以直接访问

本地访问wsl

1
\\wsl.localhost\<DistroName>\home\<user>\...

路径转换命令(在wsl中执行):

1
wslpath -w ~/dir

会输出在本地访问wsl的路径

Windows Terminal

添加了分发之后terminal中会自动添加对应的系统(但是可能反应略慢)

也可以自己定义配置。下拉设置选择添加新的配置文件,命令行类似于

1
C:\Windows\system32\wsl.exe --distribution-id {29eeb622-1951-4f80-951c-3a78abac5649}

应该也可以用 wsl -d ubuntu-22.04这种

VSCode插件

安装扩展WSL

在wsl终端中进入工作目录,运行命令

1
code .

会自动下载VSCode server,完成后就会将目录通过wsl添加到VSCode中

其他

Docker daemon代理

在 WSL 中运行 Docker,需要为 Docker daemon 配置代理。

创建 Docker daemon 的配置目录/etc/systemd/system/docker.service.d

写入配置

1
2
3
4
5
6
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.1:7890"
Environment="HTTPS_PROXY=http://127.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.local"
EOF

重载systemd,重启docker

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置

1
sudo systemctl show --property=Environment docker

重置用户密码

可以从Windows直接进wsl的root:

1
wsl -d Ubuntu(发行版名称) -u root

进去之后就是root权限,可以使用passwd更改用户密码

1
passwd user