WSL2 折腾记录

2475 字
12 分钟
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. 用管理员权限打开命令行工具,输入:
Terminal window
wsl --install
  1. 注意此命令会安装 WSL2 及其默认的 Linux 发行版(Ubuntu),如需更改,可以使用:
Terminal window
wsl --install -d <Distribution Name>
  1. 发行版名称可以输入以下命令查看:
Terminal window
wsl --list --online
  1. 输入形如:

设置 Linux 用户名和密码#

在上一步的安装结束后,WSL2 会自动启动 Linux 并提示你输入用户名和密码。

注意:

  • 创建用户名和密码后,该帐户将是分发版的默认用户,并将在启动时自动登录;
  • 此帐户将被视为 Linux 管理员,能够运行 sudo 管理命令;
  • 如需更改密码,请启动 Linux 并输入 passwd ;
  • 如忘记密码,请打开 PowerShell 并输入 wsl -d <Distribution Name> -u root 进入目标发行版的根目录,再使用 passwd <username> 更新对应用户的密码;更新完毕后,输入 exit 关闭;

迁移安装位置(可选)#

WSL2 默认安装在 C 盘(系统盘),如果你容量不足,可以考虑迁移到非系统盘,步骤如下:

  1. 确保 Linux 发行版本处于关闭状态;
Terminal window
wsl -l -v

输出形如:

  1. 导出系统镜像;
Terminal window
# 以压缩包的形式导出系统镜像
wsl --export Ubuntu-20.04 E:\WSLinux\Ubuntu-20.04.tar

其中,E:\WSLinux 请替换你自己的目标位置;

  1. 注销原有的 Linux 发行版本;
Terminal window
wsl --unregister Ubuntu-20.04

可以通过 wsl -l -v 检查是否成功注销;

  1. 重新导入系统;
Terminal window
wsl --import Ubuntu-20.04 E:\WSLinux\ E:\WSLinux\Ubuntu-20.04.tar --version 2

请将上述命令中的内容替换为你的名称和路径;其中 --version 2 表示使用 WSL2 。

  1. 修改默认用户;

在重启 Linux 后,系统默认使用 root 账户登录,如需切换为你刚刚创建的用户,请在 Linux 中输入:

Terminal window
ubuntu2004.exe config --default-user yokumi

注意:

  • ubuntu-2004.exe 请替换为对应发行版名称,比如如果你的发行版名称是 Ubuntu-22.04,对应的可执行文件名称为 ubuntu-2204.exe ;
  • --default-user 请替换为你自己的用户名。
  • 输入后不会输出反馈信息,重新启动 Linux 后可以验证;

更新和升级软件包#

WSL2 自带的 Linux 发行版的大部分包的版本都较旧,用包管理器升级即可:

Terminal window
sudo apt update && sudo apt upgrade

Docker 远程容器配置#

1. 安装和配置#

  1. 安装 Docker Desktop ;
  2. 调整 Docker Settings :

找到 Settings -> General ,启用 Use the WSL 2 based engine ,如下图:

找到 Resource -> WSL integration ,勾选对应的 Linux 发行版本:

勾选并应用;

  1. 验证 Docker 生效;

重启 Linux 后,输入 docker -v ,以及运行简单的内置 Docker 映像:docker run hello-world ,观察到类似以下输出,说明安装成功,并正常工作:

注意,如遇网络问题,请自行寻找魔法或者 Docker 镜像!

2. 迁移 Docker Desktop 和 Docker Desktop Data#

和迁移 Linux 发行版是一致的,此处不再演示。

Warning

较新版本(应该是 2023+)的 Docker 中,提供了快速迁移的设置 Resource -> Advanced ,如下图:

实测直接选择自定义路径即可,并且重启 Linux 后无其他问题。同时,高版本的 Docker 将数据和服务整合进一个子系统中,运行 wsl -v 只会看到 docker-desktop 。

3. 回收 Docker 环境空间#

Docker 用久了会产生很多镜像文件。直接删除 Image 可能对回收存储空间并无大用,因为 ext4.vhdx 的磁盘空间会根据加载的数据自动增长,但是无法自动回收。需要进行手动回收。

  1. 停止 Linux :
Terminal window
wsl --shutdown
  1. 运行 diskpart 释放空间:
Terminal window
diskpart
# 选择你对应虚拟机文件地址执行释放空间程序
select vdisk file="E:\WSLinux\docker-desktop-data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

实现远程连接#

考虑以下场景:

Host A -----> Host B -----> WSL(at Host B)

1. 配置 WSL 上的 SSH 端口#

WSL2 不需要折腾 WSL 自带的虚拟网卡了。WSL 中 openssh-server 默认的 22 端口会和 Windows 的 OpenSSH 服务冲突,导致 WSL 中的 SSH 服务无法启动。

这里采用更改 WSL 的 SSH 端口的方案。(当然,你更改 Windows 的 SSH 端口并配置防火墙规则也是可以的)

  1. 编辑 WSL 的 SSH 配置文件;
Terminal window
sudo vim /etc/ssh/sshd_config

找到以下几项,去掉前面的注释 # 并修改即可:

Port 2222
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes

作为本地桥接的主机,并不需要很多安全需求,很多 SSH 的安全功能反而会带来麻烦。这里直接允许 ROOT 用户登录。

  1. 开启并设置 SSH 服务开机自启动;
Terminal window
sudo systemctl enable ssh
sudo systemctl start ssh
  1. 本机(Host B)测试连接;

首先通过以下命令获取你的 WSL 的 IP 地址:

Terminal window
ip addr

然后在 Windows 命令行输入:

Terminal window
ssh -p 2222 root@<wsl ipaddr>

如果成功连接,则说明现在本机已经能连接 WSL 的 SSH 服务。

但是这并不意味着远程主机(Host A)也能直接通过该 IP 地址建立连接,仔细观察该 IP 地址即可发现其是私有地址(一般是 172 开头的),显然无法出网。

2. 配置端口转发#

为了能够从远程主机连接到你的 WSL Linux 子系统,你需要确保 WSL 具有公共 IP 地址,需要设置镜像网络或者设置端口转发以将流量路由到 WSL 子系统的局域网 IP 地址。

假设 WSL 的 SSH 服务在 172.28.240.1:2222 ,你可以让 Windows 把端口(默认为 22 )转发过去:

  1. 在 Windows Powershell(管理员)中运行:
Terminal window
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=2222 connectaddress=172.28.240.1
  1. 可以通过以下命令查看当前设置的所有转发规则:
Terminal window
netsh interface portproxy show all
  1. 如需删除,可通过以下命令:
Terminal window
netsh interface portproxy delete v4tov4 listenport=22 listenaddress=0.0.0.0
  1. 在远程主机(Host A)上测试连接:
Terminal window
ssh -p 22 root@<Host B 的公网 IP 地址>

当然,使用局域网 IP 地址也可以(适用于没有公网 IP 地址,比如校园网环境的情况,两台主机在同一局域网下即可)。

注意,如果你没有使用 Windows 的默认端口 22 ,请自行添加防火墙规则!

3. 配置镜像网络(可选)#

WSL2 在 2.0.0 版本引入了以下网络新特性,可以通过配置让 WSL 网络与 Windows 网卡 桥接,而不是 NAT ,这样,WSL 的 IP 会与 Windows 在同一网段,外部设备(如 Host A)可以直接访问 WSL 的服务,非常方便!

  1. 更新 WSL 2 ;

由于新特性还是 pre-release 上的内容,需要通过以下参数获取更新:

Terminal window
wsl --update --pre-release

注意,如仍无法使用,可能是 Windows 的版本问题,可参考启动 WSL 后输出的信息。

  1. 创建配置文件;
Terminal window
notepad C:\Users\<你的用户名>\.wslconfig
  1. 添加以下内容:
[wsl2]
networkingMode=mirrored
  1. 重启 WSL :
Terminal window
wsl --shutdown
  1. 验证功能生效:
ip addr

输出的 IP 地址和你的本机地址一致。

4. 配置 Windows 端口#

如果你在上述操作中,Windows 中设置的转发端口(端口转发方式)或 WSL 中设置的 SSH 服务端口(镜像网络方式,这种方式下,Windows 和 WSL 都使用同一个你设置的端口)不是默认端口 22 ,那么你需要额外进行以下操作:

  1. 使用命令行添加防火墙规则:

在 Windows Powershell(管理员)中执行:

Terminal window
netsh advfirewall firewall add rule name="WSL SSH" dir=in action=allow protocol=TCP localport=<你设置的对应端口>

或者通过图形化界面设置:

  1. 图形界面配置:

    1. 打开“控制面板” → 系统与安全 → Windows Defender 防火墙 → 高级设置;
    2. 进入“入站规则”,点击右侧新建规则:
    • 类型:端口
    • 端口号:2222(TCP)
    • 允许连接
    • 应用于所有网络类型(私有、公共、域)
    • 命名:WSL SSH(或自定义的)
  2. 在远程主机上进行测试;

在远程主机(Host A)的终端输入:

Terminal window
telnet <Host B IP> <Your Port>

如果连接成功,就说明防火墙放行了。

接下来,你可以通过:

Terminal window
ssh -p <Your Port> root@<Host B IP>

输入密码后,成功实现远程连接!

设置 WSL 的开机启动和后台运行#

WSL2 的启动时间其实是较慢的。同时,WSL2 还会默认关闭不使用的实例,当你关闭了 WSL 的 Console 后,实例会自动关闭,虽然它的初衷是为了减少计算机资源占用,但是对于会频繁唤醒 WSL 的用户来说,确实会出现启动时间过长的情况。解决方法如下:

  1. WIN + R 输入并运行 shell:startup 打开启动目录;
  2. 新建一个文件名为 wsl-startup.vbs ;
  3. 使用记事本编辑文件,填入以下内容:
Terminal window
set ws = wscript.CreateObject("wscript.shell")
ws.run "wsl -d <你的 Linux 发行版名称>", 0

这样当你系统启动,登录系统后,Windows 会开启 WSL 实例,它会永久等待输入,不会关闭。所以当你下次再使用WSL命令时,就不会遇到需要重新唤醒 WSL 的耗时。

关于 WSL 在后台运行占用资源的问题,事实上你可以通过任务管理器查看,其并不会占用多少内存,不过如果你还担心,你可以继续在配置文件中添加:

Terminal window
notepad C:\Users\<你的用户名>\.wslconfig
[wsl2]
memory=4GB
processors=2

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

WSL2 折腾记录
https://blog.yokumi.cn/posts/wsl2-setup-and-configuration-guide/
作者
Yokumi
发布于
2025-07-12
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
第一台 VPS 折腾小记
开发心得在使用本项目/教程/脚本之前,请务必仔细阅读以下声明。一旦您开始使用、复制或修改相关内容,即视为您已完全接受并同意本免责声明的所有条款。 请谨记:使用技术时请务必遵守您所在国家和地区的法律法规。 使用 IPv6-only VPS 低成本独享家宽,解锁 ChatGPT 不风控
2
2026.5 Live Repo
生活杂谈翻了翻相册才发现上一次已经是去年 9 月的羊文学了,哎gszm坏事做尽。 这回的出行方式是经典京沪高铁二等座,去年锅贴得意之作绿皮 D9 真给我坐麻了,这次果断 G 系列。不过被课表背刺,本来还可以买早一班(),结果就是快 0 点才到虹桥。好像是第一次这么晚到沪国。
3
在 Linux 下编译安装 Dynamips 和 Dynagen 搭建 Cisco 实验环境
开发心得最终还是花了一点时间把计网实践的实验平台搞到 Linux 下实现了,相比于 Windows,同样配置的路由器,Linux 下 CPU 占用可降低 50% 以上,应该也会更加稳定吧。 本文将详细介绍如何在 Linux (Ubuntu/Debian) 系统下(macOS 等也是类似的,一些依赖的安装略有不同罢了)从源码编…
4
Python 套件管理器 uv 使用介绍
开发心得Python 生态得益于大数据时代和大模型时代蓬勃发展,相应的包管理工具也不断涌现,这篇文章简单记录一下个人上手 Astral 团队开发的 uv 的一些基操和使用一段时间后的体验。当然其实官方文档[^1]已经很详细了。 下表转载自 Shoukai Huang 大佬的博客[^2] 整理的横向对比:
5
浅谈大型项目的模块化开发(Based on Python)
开发心得最近在进行大型项目开发时,自行实现的一些公共模块,包括工具库、API 客户端等,都被扔在一个文件夹下,需要时由该项目的控制代码进行调用,不过因为水平之菜,经过测试没什么问题的代码 PR 上去之后经常会出现需要反复修改的情况。而且另一方面,这些公共模块具有一定的可移植性,但只被一个项目使用,没什么性价比,肯定是需要进一…

评论区

文章目录