使用Windows11神器WSL打造独一无二的开发环境

2024年只推荐WSL2

相信每个开发人员都有自己一套开发习惯,有常用的开发工具,顺手的各种设定。而选择一个适合自己的操作系统,更是一切的基础。总体来说,可选的操作系统就三大类:Windows, MacOS, Linux,三个系统各有各的优缺点,在我看来Windows大而全,但稍显臃肿;MacOS优雅,兼具美观和高效,但价格昂贵且规矩繁多;Linux主打自由灵活,最接近生产环境,但是用户界面并不友好。

本人三个系统都使用过,在WSL出来之前实在难以抉择,但是2024年了,经过几年的使用,我强烈推荐基于WSL打造自己的开发环境,能兼顾Windows和Linux的优点。

WSL全称Windows Subsystem for Linux,是基于Windows Hyper-V平台的Linux虚拟机系统。Hyper-V是Windows自带的虚拟机平台,类似与大家可能更加熟悉的VMware,不过实话说,没VM好用,但胜在Windows自带且免费。所以说,本质上WSL就是虚拟机,不过是非常轻量的虚拟机,启动只需几秒。

WSL分为WSL1和WSL2:

  • WSL1更加轻量,本质是转译,将Linux系统调用转为Windows系统调用,直接使用Windows本身的文件系统,所以数据操作性能很好。因为是转译的,所以存在Linux兼容性问题。

  • WSL2是完整的Linux虚拟机,和Windows本体(Host)隔离的更好,但也意味着和Host的互操作性较差。古早的版本想要操作Host的文件以及网络会面临诸多问题,不过经过这几年的更新,大部分问题都已经比较好地得到了解决。所以2024年更加推荐使用WSL2。

额外的功能

开启WSL需要同时开启Windows的Hyper-V虚拟机,基于Hyper-V还有两个好用的功能。

  • Windows Sandbox: Windows自带沙盒软件,有什么风险操作例如未知的软件都可以放到里面执行,用完关掉,不留下任何痕迹。

  • WSA(Windows Subsystem for Android): Windows上运行安卓app。

效果展示

如图所示,在Windows上开启WSL2后,我在此之上运行了诸多Linux系统。每个系统用于一种特定的功能,例如Java这个系统安装了Java开发用到的各种环境和软件,Python这个环境安装了CUDA环境。其实就是虚拟机的用法,但是因为WSL2非常轻量,用起来更像是在使用Docker。说起Docker在上面的Ubuntu和Python这两个系统中分别独立安装了Docker。所以整个开发环境分成了三层:

  • Windows 11: 用于运行GUI软件,例如开发工具IDEA, VS Code,Navicat等。

  • WSL2: 用于编译、执行代码,提前配置好运行环境,也可用作测试环境。

  • Docker:跟WSL2作用类似,不过基于Docker丰富的生态,可以更方便的使用各类容器,包括Mysql, Redis等都能直接使用,虽说有性能问题,但是非常便于开发。

此外,因为WSL2本质是虚拟机,可以非常容易地对整个系统进行备份和还原,所以不用担心因为各种骚操作搞崩自己的系统。重装系统后也可以迅速还原整个开发环境,再也不用担心哪些系统崩溃。

打造过程

1. 开启 WSL2

1.1 开启 BIOS 的虚拟化

确保 BIOS 中虚拟化选项开启。这个如果没有开启的话,需要进电脑的 BIOS 设置里开启,因为 intel 和 AMD 平台的不一样,具体可以搜索下。

1.2 启用Windows功能

1.2.1 命令行

以管理员方式打开 PowerShell 并运行:

1
2
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

执行完毕后重启生效。

1.2.2 图形界面

当然你也可以选择图形化界面操作。按下 Win+R 组合键,键入 optionalfeatures。

按下图勾选Windows虚拟机平台和Hyper-V以及Linux子系统。

点击OK后,Windows会自动下载,并提示你重启,重启后即再继续后续操作。

2. 安装Linux

2.1 命令行

以管理员方式打开 PowerShell 并运行:

1
wsl --install -d Ubuntu

2.2 微软商店

打开微软商店,搜索Linux选择你喜欢的安装即可。

3. 配置Linux

推荐直接使用WSL2,以管理员方式打开 PowerShell 并运行将WSL默认版本设置为WSL2:

1
wsl --set-default-version 2

安装完后会在开始菜单中出现Ubuntu,直接点击打开即可,此时会让你输入用户名和密码。此时请注意,将你常用的Linux设定弄好,因为接下来,这个Linux系统将会作为其他后续所有Linux系统的模板,继承所有的设定。

4. 使用Linux镜像

此时的Linux是安装在C盘的,如果后续继续安装其他系统,也都是继续安装在C盘,这是难以接受的。因此我们需要将已经安装的Linux导出,并卸载掉已经安装的这个Linux。

4.1 导出Linux镜像

以管理员方式打开 PowerShell 并运行

1
2
# wsl --export <要导出的Linux名称> <导出的路径>
wsl --export Ubuntu E:\Hyper-V\Backup\ubuntu.tar

等待一会,Linux就已经备份好了。

4.2 删除已经安装的Ubuntu

直接当成普通APP删除即可。

4.3 导入Linux镜像

1
2
# wsl --import <要使用的Linux名称> <安装Linux到哪个路径> <要导入的镜像路径> <版本号(2:代表wsl2)>
wsl --import Java E:\Hyper-V\WSL\Java E:\Hyper-V\Backup\ubuntu.tar --version 2
d7c056aa-7f9a-4d45-9665-15d2061a434b
d7c056aa-7f9a-4d45-9665-15d2061a434b

此时安装的路径下面将会看到多了一个ext4.vhdx文件,这就是你虚拟机文件,非常方便管理。

4.4 导入多个Linux系统

使用同样的方法,导入名称为Python、NodeJS的多个镜像。然后安装好各自需要的软件,配置好环境。此时可以再次对这些镜像进行备份,以后就不再需要每次重复配置环境啦。

4.5 使用第三方工具完成上面操作

虽然有第三方工具可以实现上述所有操作,但其实本质还是上述那些步骤,没有方便多少,按照上述步骤来更容易理解原理。当然如果确实觉得麻烦,推荐下面这个第三方开源工具使用:

GitHub - bostrot/wsl2-distro-manager: A GUI to quickly manage your WSL2 instances

5. 安装Windows Terminal

推荐使用这个美观好用的终端,直接使用微软商店安装即可,安装完成后,会自动识别到当下存在哪些WSL系统。

6. 安装 Docker

建议创建一个新的WSL系统,例如名字为Docker。其实Docker本来就有Windows版本,Docker Desktop on Windows。不过这个安装侵入性太强,影响当前的Windows系统,我更倾向于在WSL2中当成普通的Linux安装Docker。详细安装步骤直接去官网查看Ubuntu的安装步骤即可。

7. 使用 CUDA

WSL2 中也支持直接调用 Nvidia 的 GPU 使用 CUDA。

7.1 前提

  1. Pascal 及其后的 GPUs.

  2. Windows 11 系统

  3. 安装了最新的 Nvidia CUDA 驱动

7.2 安装步骤

1
2
3
4
5
6
7
sudo apt-key del 7fa2af80 # 移除旧KEY
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

nvidia-smi # 验证安装是否生效

7.3 WSL2 的 Docker 中使用 CUDA

上面操作完成后,直接运行docker就行

1
docker run -it --gpus=all --rm nvidia/cuda:11.4.2-base-ubuntu20.04 nvidia-smi

8. 通过配置文件让WSL2更好用

WSL有两种配置文件,分别是主机上的配置文件和虚拟机的配置文件。但请注意,修改配置文件后需要完全关闭WSL8秒后才会生效。你可以通过命令关闭虚拟机:

1
2
wsl --shutdown # 完全关闭WSL
wsl --terminate <虚拟机名称> # 关闭特定虚拟机

详情可以参阅官方文档:.

Advanced settings configuration in WSL | Microsoft Learn](https://learn.microsoft.com/en-us/windows/wsl/wsl-config)[Advanced settings configuration in WSL | Microsoft Learn](https://learn.microsoft.com/en-us/windows/wsl/wsl-config)

8.1 主机配置文件(不推荐改动)

你可以通过.wslconfig 文件更改WSL的全局选项,这个文件在用户文件夹的根目录下(即 C:\Users\<YourUserName>\.wslconfig)。

如果没有该文件,则新建一个,示例如下:
[wsl2]
# 自定义 Linux 内核的绝对路径
kernel=
# 给 WSL 2 虚拟机分配的内存大小
memory=
# 为 WSL 2 虚拟机分配的处理器核心数量
processors=
# 为 WSL 2 虚拟机分配的交换空间,0 表示没有交换空间
swap=
# 自定义交换虚拟磁盘 vhd 的绝对路径
swapFile=
# 是否允许将 WSL 2 的端口转发到主机(默认为 true)
localhostForwarding=
# <path> 必须是带反斜杠的绝对路径,例如 C:\\Users\\kernel
# <size> 必须在后面加上单位,例如 8 GB 或 512 MB

Win 11 23H2 史诗级更新

WSL2 到 2.0 版本,带来了以下特性:

  1. 支持自动回收内存
  2. 支持自动释放 WSL2 虚拟硬盘空间
  3. 支持和 Windows 使用相同的网络(镜像网络)
  4. 支持 DNS Tunneling
  5. 支持 Windows 设置的代理
  6. 支持 Windows 防火墙
  7. 支持 Multicast
1
2
3
4
5
6
7
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
sparseVhd=true

需要手动开启硬盘空间回收

1
wsl --manage Ubuntu --set-sparse true

另外,使用 VSCode - WSL 插件的,建议去 VSCode 设置里把自动端口转发关掉(Remote: Auto Forward Ports),避免冲突,因为 WSL2 更新之后新的网络已经是和你的 Windows 使用相同网络了,不再需要端口转发了。

最后,如果你在 WSL 里使用 docker,那需要将 autoMemoryReclaim 配置为 dropcache 或者 disabled,然后在 /etc/docker/daemon.json 里添加一句 "iptables": false ,否则你可能无法正常使用 docker。

8.2 虚拟机配置文件(推荐配置)

可以登录虚拟机,通过/etc/wsl.conf更改WSL的虚拟机配置。如果没有该文件,则新建一个。

  1. 开启systemd

    1
    2
    [boot]
    systemd=true
  2. 虚拟机中加载windows的文件

    1
    2
    3
    4
    5
    [automount]
    enabled = true
    root = /mnt/ # 要加载到哪个路径(例如C盘被加载到/mnt/c/)
    options = "metadata,umask=22,fmask=11" # 解决windows文件权限问题
    mountFsTab = false
  3. 虚拟机中关闭windows的环境变量PATH(容易影响环境变量问题)

    1
    2
    3
    [interop]
    enabled=true
    appendWindowsPath=false # 关闭PATH环境变量
  4. 修改虚拟机默认用户

    1
    2
    [user]
    default=xxx

    示例配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
mountFsTab = false

[interop]
enabled=true
appendWindowsPath=false

[user]
default=xxx

9. WSL 常见问题

9.1 某些低位端口无法使用

Hyper-V默认会占用掉低位端口,并且是随机使用的,很可能今天某个低位端口正常,突然有一天端口就无法使用了。

1
2
3
4
5
6
7
8
9
10
# 系统默认的端口占用范围;
❯ netsh int ipv4 show dynamicport tcp

Protocol tcp Dynamic Port Range
---------------------------------
Start Port : 1024
Number of Ports : 64511

# 开启hyper-v也会占用部分端口
netsh interface ipv4 show excludedportrange protocol=tcp

9.2 Proxifie 软件和 WSL2 的端口冲突

报错如下:

Theattempted operation is not supported for the type of object referenced.

使用命令 netsh winsockrese重置修复

9.3 WSL2 中 VIM 复制到 Windows 的剪切板

在 .vimrc 文件中添加以下内容

1
2
3
4
5
6
7
8
" WSL yank support
let s:clip = '/mnt/c/Windows/System32/clip.exe' " change this path according to your mount point
if executable(s:clip)
augroup WSLYank
autocmd!
autocmd TextYankPost * if v:event.operator ==# 'y' | call system(s:clip, @0) | endif
augroup END
endif

9.4 直接与宿主 Windows 系统通信

1
2
# 直接放开 `vEthernet (WSL)` 这张网卡的防火墙
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

9.5 压缩磁盘占用

1
Optimize-VHD -Path E:\Hyper-V\WSL\Ubuntu\ext4.vhdx -Mode full