使用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 | dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /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 | # wsl --export <要导出的Linux名称> <导出的路径> |
等待一会,Linux就已经备份好了。
4.2 删除已经安装的Ubuntu
直接当成普通APP删除即可。
4.3 导入Linux镜像
1 | # wsl --import <要使用的Linux名称> <安装Linux到哪个路径> <要导入的镜像路径> <版本号(2:代表wsl2)> |
此时安装的路径下面将会看到多了一个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 前提
Pascal 及其后的 GPUs.
Windows 11 系统
安装了最新的 Nvidia CUDA 驱动
7.2 安装步骤
1 | sudo apt-key del 7fa2af80 # 移除旧KEY |
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 | wsl --shutdown # 完全关闭WSL |
详情可以参阅官方文档:.
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 版本,带来了以下特性:
- 支持自动回收内存
- 支持自动释放 WSL2 虚拟硬盘空间
- 支持和 Windows 使用相同的网络(镜像网络)
- 支持 DNS Tunneling
- 支持 Windows 设置的代理
- 支持 Windows 防火墙
- 支持 Multicast
1 | [experimental] |
需要手动开启硬盘空间回收
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的虚拟机配置。如果没有该文件,则新建一个。
开启systemd
1
2[boot]
systemd=true虚拟机中加载windows的文件
1
2
3
4
5[automount]
enabled = true
root = /mnt/ # 要加载到哪个路径(例如C盘被加载到/mnt/c/)
options = "metadata,umask=22,fmask=11" # 解决windows文件权限问题
mountFsTab = false虚拟机中关闭windows的环境变量PATH(容易影响环境变量问题)
1
2
3[interop]
enabled=true
appendWindowsPath=false # 关闭PATH环境变量修改虚拟机默认用户
1
2[user]
default=xxx示例配置文件如下:
1 | [automount] |
9. WSL 常见问题
9.1 某些低位端口无法使用
Hyper-V默认会占用掉低位端口,并且是随机使用的,很可能今天某个低位端口正常,突然有一天端口就无法使用了。
1 | # 系统默认的端口占用范围; |
9.2 Proxifie 软件和 WSL2 的端口冲突
报错如下:
Theattempted operation is not supported for the type of object referenced.
使用命令 netsh winsockrese重置修复
9.3 WSL2 中 VIM 复制到 Windows 的剪切板
在 .vimrc 文件中添加以下内容
1 | " WSL yank support |
9.4 直接与宿主 Windows 系统通信
1 | # 直接放开 `vEthernet (WSL)` 这张网卡的防火墙 |
9.5 压缩磁盘占用
1 | Optimize-VHD -Path E:\Hyper-V\WSL\Ubuntu\ext4.vhdx -Mode full |