WSL2 折腾记录
写在前面
WSL2(Windows Subsystem for Linux version 2)是微软推出的一项功能,它允许你在 Windows 10 和 Windows 11 上运行一个真正的 Linux 内核,并使用几乎完整的 Linux 用户空间工具和程序,而无需安装虚拟机或双系统。相较于一代,WSL 2 在文件系统、IO 性能比 WSL1 有很大提升。如果你不想装虚拟机,或者不想花时间折腾双系统,那么 WSL2 将会是你的不二之选。
安装 WSL2 以及 Linux 发行版本
下面的操作默认你的系统是 Windows 10 or Windows 11 。如低于此版本请参考微软官方文档或查阅其他网络资料。
- 用管理员权限打开命令行工具,输入:
1 |
|
- 注意此命令会安装 WSL2 及其默认的 Linux 发行版(Ubuntu),如需更改,可以使用:
1 |
|
- 发行版名称可以输入以下命令查看:
1 |
|
- 输入形如:
设置 Linux 用户名和密码
在上一步的安装结束后,WSL2 会自动启动 Linux 并提示你输入用户名和密码。
注意:
- 创建用户名和密码后,该帐户将是分发版的默认用户,并将在启动时自动登录;
- 此帐户将被视为 Linux 管理员,能够运行
sudo
管理命令; - 如需更改密码,请启动 Linux 并输入
passwd
; - 如忘记密码,请打开 PowerShell 并输入
wsl -d <Distribution Name> -u root
进入目标发行版的根目录,再使用passwd <username>
更新对应用户的密码;更新完毕后,输入exit
关闭;
迁移安装位置(可选)
WSL2 默认安装在 C 盘(系统盘),如果你容量不足,可以考虑迁移到非系统盘,步骤如下:
- 确保 Linux 发行版本处于关闭状态;
1 |
|
输出形如:
- 导出系统镜像;
1 |
|
其中,E:\WSLinux
请替换你自己的目标位置;
- 注销原有的 Linux 发行版本;
1 |
|
可以通过 wsl -l -v
检查是否成功注销;
- 重新导入系统;
1 |
|
请将上述命令中的内容替换为你的名称和路径;其中 --version 2
表示使用 WSL2 。
- 修改默认用户;
在重启 Linux 后,系统默认使用 root 账户登录,如需切换为你刚刚创建的用户,请在 Linux 中输入:
1 |
|
注意:
ubuntu-2004.exe
请替换为对应发行版名称,比如如果你的发行版名称是 Ubuntu-22.04,对应的可执行文件名称为ubuntu-2204.exe
;--default-user
请替换为你自己的用户名。- 输入后不会输出反馈信息,重新启动 Linux 后可以验证;
更新和升级软件包
WSL2 自带的 Linux 发行版的大部分包的版本都较旧,用包管理器升级即可:
1 |
|
Docker 远程容器配置
1. 安装和配置
- 安装 Docker Desktop ;
- 调整 Docker Settings :
找到 Settings -> General ,启用 Use the WSL 2 based engine
,如下图:
找到 Resource -> WSL integration ,勾选对应的 Linux 发行版本:
勾选并应用;
- 验证 Docker 生效;
重启 Linux 后,输入 docker -v
,以及运行简单的内置 Docker 映像:docker run hello-world
,观察到类似以下输出,说明安装成功,并正常工作:
注意,如遇网络问题,请自行寻找魔法或者 Docker 镜像!
2. 迁移 Docker Desktop 和 Docker Desktop Data
和迁移 Linux 发行版是一致的,此处不再演示。
较新版本(应该是 2023+)的 Docker 中,提供了快速迁移的设置 Resource -> Advanced ,如下图:
实测直接选择自定义路径即可,并且重启 Linux 后无其他问题。同时,高版本的 Docker 将数据和服务整合进一个子系统中,运行 wsl -v
只会看到 docker-desktop
。
3. 回收 Docker 环境空间
Docker 用久了会产生很多镜像文件。直接删除 Image 可能对回收存储空间并无大用,因为 ext4.vhdx
的磁盘空间会根据加载的数据自动增长,但是无法自动回收。需要进行手动回收。
- 停止 Linux :
1 |
|
- 运行 diskpart 释放空间:
1 |
|
实现远程连接
考虑以下场景:
1 |
|
1. 配置 WSL 上的 SSH 端口
WSL2 不需要折腾 WSL 自带的虚拟网卡了。WSL 中 openssh-server
默认的 22 端口会和 Windows 的 OpenSSH 服务冲突,导致 WSL 中的 SSH 服务无法启动。
这里采用更改 WSL 的 SSH 端口的方案。(当然,你更改 Windows 的 SSH 端口并配置防火墙规则也是可以的)
- 编辑 WSL 的 SSH 配置文件;
1 |
|
找到以下几项,去掉前面的注释 #
并修改即可:
1 |
|
作为本地桥接的主机,并不需要很多安全需求,很多 SSH 的安全功能反而会带来麻烦。这里直接允许 ROOT 用户登录。
- 开启并设置 SSH 服务开机自启动;
1 |
|
- 本机(Host B)测试连接;
首先通过以下命令获取你的 WSL 的 IP 地址:
1 |
|
然后在 Windows 命令行输入:
1 |
|
如果成功连接,则说明现在本机已经能连接 WSL 的 SSH 服务。
但是这并不意味着远程主机(Host A)也能直接通过该 IP 地址建立连接,仔细观察该 IP 地址即可发现其是私有地址(一般是 172 开头的),显然无法出网。
2. 配置端口转发
为了能够从远程主机连接到你的 WSL Linux 子系统,你需要确保 WSL 具有公共 IP 地址,需要设置镜像网络或者设置端口转发以将流量路由到 WSL 子系统的局域网 IP 地址。
假设 WSL 的 SSH 服务在 172.28.240.1:2222
,你可以让 Windows 把端口(默认为 22 )转发过去:
- 在 Windows Powershell(管理员)中运行:
1 |
|
- 可以通过以下命令查看当前设置的所有转发规则:
1 |
|
- 如需删除,可通过以下命令:
1 |
|
- 在远程主机(Host A)上测试连接:
1 |
|
当然,使用局域网 IP 地址也可以(适用于没有公网 IP 地址,比如校园网环境的情况,两台主机在同一局域网下即可)。
注意,如果你没有使用 Windows 的默认端口 22 ,请自行添加防火墙规则!
3. 配置镜像网络(可选)
WSL2 在 2.0.0 版本引入了以下网络新特性,可以通过配置让 WSL 网络与 Windows 网卡 桥接,而不是 NAT ,这样,WSL 的 IP 会与 Windows 在同一网段,外部设备(如 Host A)可以直接访问 WSL 的服务,非常方便!
- 更新 WSL 2 ;
由于新特性还是 pre-release 上的内容,需要通过以下参数获取更新:
1 |
|
注意,如仍无法使用,可能是 Windows 的版本问题,可参考启动 WSL 后输出的信息。
- 创建配置文件;
1 |
|
- 添加以下内容:
1 |
|
- 重启 WSL :
1 |
|
- 验证功能生效:
1 |
|
输出的 IP 地址和你的本机地址一致。
4. 配置 Windows 端口
如果你在上述操作中,Windows 中设置的转发端口(端口转发方式)或 WSL 中设置的 SSH 服务端口(镜像网络方式,这种方式下,Windows 和 WSL 都使用同一个你设置的端口)不是默认端口 22 ,那么你需要额外进行以下操作:
- 使用命令行添加防火墙规则:
在 Windows Powershell(管理员)中执行:
1 |
|
或者通过图形化界面设置:
-
图形界面配置:
- 打开“控制面板” → 系统与安全 → Windows Defender 防火墙 → 高级设置;
- 进入“入站规则”,点击右侧新建规则:
- 类型:端口
- 端口号:2222(TCP)
- 允许连接
- 应用于所有网络类型(私有、公共、域)
- 命名:WSL SSH(或自定义的)
-
在远程主机上进行测试;
在远程主机(Host A)的终端输入:
1 |
|
如果连接成功,就说明防火墙放行了。
接下来,你可以通过:
1 |
|
输入密码后,成功实现远程连接!
设置 WSL 的开机启动和后台运行
WSL2 的启动时间其实是较慢的。同时,WSL2 还会默认关闭不使用的实例,当你关闭了 WSL 的 Console 后,实例会自动关闭,虽然它的初衷是为了减少计算机资源占用,但是对于会频繁唤醒 WSL 的用户来说,确实会出现启动时间过长的情况。解决方法如下:
- WIN + R 输入并运行
shell:startup
打开启动目录; - 新建一个文件名为
wsl-startup.vbs
; - 使用记事本编辑文件,填入以下内容:
1 |
|
这样当你系统启动,登录系统后,Windows 会开启 WSL 实例,它会永久等待输入,不会关闭。所以当你下次再使用WSL命令时,就不会遇到需要重新唤醒 WSL 的耗时。
关于 WSL 在后台运行占用资源的问题,事实上你可以通过任务管理器查看,其并不会占用多少内存,不过如果你还担心,你可以继续在配置文件中添加:
1 |
|
1 |
|