共计 7157 个字符,预计需要花费 18 分钟才能阅读完成。
Win11 部署 WSL2 并连接 VS Code
一、对比虚拟机和WSL
WSL:Windows Subsystem for Linux,适用于Linux的Windows子系统,可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。点击查看官方文档
WSL 和虚拟机都是在Windows上运行 Linux 环境的技术,但两者之间有很多不同。
WSL 直接运行在 Windows 内核上,使用基于 Hyper-V 技术的轻量化虚拟机运行完整的 Linux 内核,并且与 Windows 主机深度集成。
而诸如 VMware、VirtualBox 和 Hyper-V 等完整的虚拟机,则是使用了完整的虚拟化技术和硬件模拟,在其中运行的是完整的与宿主机完全隔离的系统。
在性能方面,WSL 由于其诸多轻量化的特点,理论上性能开销要比虚拟机小的多。在我的个人实际体验中(误差大,仅供参考),运行 WSL 的内存占用要比运行 VMware 和 VirtualBox 的内存占用少 1~2G 左右。
虚拟机的优点在于支持广泛的系统而不仅仅局限于 Linux,并且隔离性很强,在虚拟机的系统里可以随便折腾,一键备份快照,一键立即恢复。系统也更加完整,从内核到用户空间,以及对硬件的模拟等,都涵盖其中。相对应的缺点就是系统安装更为复杂,需要完整的系统安装步骤,而且性能开销较大,对宿主机的虚拟化支持要求更高,需要手动配置的项目也更多。
WSL 的优点就在于轻量化与集成度,性能开销比虚拟机更低,安装系统更加方便,一条命令就可以快捷安装全部所需内容,并且自动挂载 Windows 主机的各个盘符,在一定程度上实现交叉访问。缺点就是支持的 Linux 发行版数量有限,系统的完整性与隔离性不如虚拟机。
虚拟机更适合体验和测试完整的系统,而如果是为了在 Linux 环境中开发项目,并不需要完全完整的 Linux 系统,则 WSL 明显是更优选择。
二、部署 WSL2
1.启用 WSL 功能
- 点击开始菜单(Windows 徽标)搜索:启用或关闭 Windows 功能。
- 在弹出的窗口中勾选适用于 Linux 的 Windows 子系统和虚拟机平台两项。(参考图1-1)
- 重启电脑。
- 打开 PowerShell 、终端或命令提示符(cmd),输入
wsl --version
查看是否成功启用该功能;输入wsl --update
检查更新。
图1-1
2.为 WSL 安装 Linux 发行版
2.1 快速安装
以下操作在命令行中进行
为 WSL 安装 Linux 发行版,可以使用如下命令来安装默认发行版 Ubuntu 的全部所需内容:
wsl --install
如果想安装其他的 Linux 发行版或者想自己指定安装版本,则可以使用如下命令查看当前支持的 Linux 发行版列表:
wsl --list --online
返回结果示例如下:
以下是可安装的有效分发的列表。
使用 'wsl.exe --install <Distro>' 安装。
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
Ubuntu-24.04 Ubuntu 24.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
openSUSE-Leap-15.6 openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed openSUSE Tumbleweed
如返回结果所提示,确定好自己想安装的版本之后可以使用如下命令安装:
wsl --install <name> #将<name>替换成 NAME 列的指定发行版名称
以上操作会将 Linux 发行版安装到默认目录,一般是在C:\Users<username>
下。
2.2 手动安装到指定目录
如果不想安装到C盘默认目录,则可以手动下载 Linux 发行版,并安装到指定目录。
下载完成后打开下载目录,你会得到一个后缀为.AppxBundle
的文件,手动将后缀名改为.zip
并解压。
解压完成后你会得到.appx
.xml
等多个文件,找到名称中带有架构名称的.appx
文件,一般是xxxxx_xxxx.x.x.x_x64.appx
xxxxx_xxxx.x.x.x_ARM64.appx
这两个,选择与系统架构相对应的一个,再次将后缀.appx
改成.zip
并解压。
解压完成后,将压缩包中的全部文件移动至你想安装到的目录,双击运行以下载的 Linux 发行版名称为文件名的.exe
可执行文件即可安装至当前目录。
完成安装后在安装目录下会出现一个ext4.vhdx
文件,此文件为子系统的虚拟硬盘。
2.3 查看和设置 WSL 版本
安装完成后,使用如下命令即可查看已经安装的发行版名称和使用的 WSL 版本:
wsl -l -v
返回结果示例如下:
NAME STATE VERSION
* Ubuntu Stopped 2
VERSION 列对应的是 WSL 版本。
若想设置版本,则可以执行如下命令:
#将指定发行版的 WSL 版本设置为 WSL2
wsl --set-version <name> 2 #将<name>替换为你想要设置的发行版名称
#将指定发行版的 WSL 版本设置为 WSL1
wsl --set-version <name> 1 #将<name>替换为你想要设置的发行版名称
三、连接到 VS Code
1.安装 VS Code 以及所需扩展
VS Code,全称是 Visual Studio Code,一款颇受好评的强大编辑器,微软的良心之作。VS Code 在轻量化的基础上有内容丰富的大量扩展,包括针对不同语言的扩展,编辑扩展,可以进行个性化定制的主题和图标包扩展等等,完善的功能与丰富的个性化定制兼得。
点击进入官网下载安装,安装过程中一定要选中“添加到 PATH”选项
安装好 VS Code 后,需要安装用于连接 WSL 的扩展。可以运行 VS Code,在扩展市场直接搜索“WSL”进行安装,如图3-1所示:
图3-1
若还需要进行其他远程开发,可以直接安装远程开发扩展包,其中包括了 WSL 扩展和其他远程开发可能需要的扩展。
2.使用 VS Code 打开 WSL 中的项目
安装好 VS Code 后,可以用 VS Code 直接打开 WSL 中的项目。一般有使用 WSL 命令行打开和在 VS Code 中使用扩展打开两种方式。
2.1 使用 WSL 的命令行打开
以下操作在命令行中进行
首先使用如下命令运行 WSL:
WSL #打开 WSL,进入到子系统中
然后需要更新一下 Linux 发行版的软件包,因为某些 WSL Linux 发行版缺少启动 VS Code 服务器所需的库。命令如下:
#Debian、Ubuntu 的包管理指令,其他发行版系统需要使用对应的包管理指令
sudo apt update
更新完成后,输入如下指令:
code . # code 和.之间有空格
输入该指令并确认后,等待下载完成,会自动打开一个新的 VS Code 界面,并且已经链接到了 WSL,可以打开 WSL 中的文件并进行编辑。
2.2 直接使用 VS Code 打开
直接使用 VS Code 中的扩展也可以连接到 WSL,不过需要 WSL 处于运行状态。
如图3-2所示,点击 VS Code 界面左下角的远程连接标志,再弹出的内容栏中选择 WSL 即可进行连接:
图3-2
注意:关于扩展的问题(内容来自 VS Code 官网)
WSL 扩展将 VS Code 拆分为“客户端-服务器”体系结构,使客户端(用户界面)在 Windows 计算机上运行,而使服务器(你的代码、Git、插件等)在你的 WSL 发行版中“远程”运行。
运行 WSL 扩展时,选择“扩展”选项卡将显示本地计算机和 WSL 发行版之间拆分的扩展列表。
安装本地扩展(如主题)只需安装一次。
某些扩展(例如 Python 扩展或处理 linting 或调试等操作的任何扩展)必须单独安装在每个 WSL 发行版上。 如果在本地安装了一个未安装在 WSL 发行版上的扩展,则 VS Code 将显示一个警告图标 ⚠ 以及一个绿色的“在 WSL 中安装”按钮。
四、一些可选内容和设置项
1.安装 Windows 终端以及 PowerShell 7
1.1 关于终端
Windows 终端是一个新式主机应用程序,它面向你喜爱的命令行 shell,如命令提示符、PowerShell 和 bash(通过适用于 Linux 的 Windows 子系统 (WSL))。 它的主要功能包括多个选项卡、窗格、Unicode 和 UTF-8 字符支持、GPU 加速文本呈现引擎,你还可用它来创建你自己的主题并自定义文本、颜色、背景和快捷方式。点击查看官方文档
终端——Windows Terminal,不等同于 PowerShell 或 cmd ,它更像是一个外壳,可以集中管理和使用多个不同 shell ,如图4-1:
图4-1
这样一来在使用 shell 等命令行时就可以更加方便,仅需 Terminal 这一个应用即可。同时终端的外观设计更加现代化,与 Windows 11 的风格更趋于统一,并且可以实现很多个性化设置。
安装:可以直接从微软商店(Microsoft Store)搜索“终端”或“terminal”进行安装,也可以点击这里下载可执行文件直接进行下载安装(省去了搜索步骤)。
设置:终端可以方便的进行基础设置,如默认终端程序,打开时的默认 shell 等等。用户还可以直接编辑 JSON 文件进行设置,理论上备份JSON文件就相当于备份了整套配置,装新系统或是换机时可以直接迁移。终端还可以进行个性美化,设置配色方案、背景、字体等内容,甚至还有复古的光亮文本和扫描线条特效(酷但费眼),如图4-2:
图4-2.1
图4-2.2
1.2 关于 PowerShell 7
PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成,可以在 Windows、Linux 和 macOS 上运行。
Windows PowerShell 和 PowerShell 是两个独立的产品:
- Windows PowerShell 是 Windows 中随附的 PowerShell 版本。 此版本的 PowerShell 使用仅在 Windows 上运行的完整 .NET Framework。 最新版本为 Windows PowerShell 5.1。 Microsoft 不再为 Windows PowerShell 的更新提供新功能。 对 Windows PowerShell 的支持与你正在使用的 Windows 版本相关联。
- PowerShell 基于新版本的 .NET 而不是 .NET Framework 生成,在 Windows、Linux 和 macOS 上运行。 对 PowerShell 的支持取决于它所基于的 .NET 版本。点击查看官方文档
其实 PowerShell 7的官方名称就叫PowerShell,而之前系统自带的旧版叫做 Windows Powershell 。如此区分的原因有可能是因为新版 PowerShell 实现了跨平台。
Windows PowerShell 现在官方已经停止维护,PowerShell 的7.4版本目前是 LTS 版本。整体使用感受下来新 PowerShell 的性能要更好一些,并且还有更加现代化的脚本开发和任务自动化等功能特性。更具体的内容请参考官方文档。
2.WSL的网络和代理问题
新版的 WSL(我目前的版本是2.3.26.0)提供了可视化设置界面:WSL Settings,可以更方便的进行设置。
WSL 默认使用的是 NAT 网络地址转换模式,WSL 和主机会拥有不同的IP,WSL 也可以正常访问网络。
另一种官方推荐尝试的是 Mirrored 镜像模式网络。这种全新的网络体系结构会将 Windows 上的网络接口直接镜像到 Linux 上,扩展了功能并提高了兼容性。镜像模式下 WSL 的IP地址是和主机 Windows 一样的。
在 Mirrored 镜像模式下。还可以开启另一项功能:Auto Proxy.
这项功能只会在 Mirrored 模式下生效,在 NAT 模式下进入 WSL 时会有一条未生效提示。在 Mirrored 模式下开启此功能后,WSL 会直接使用 Windows 对应项的配置信息,更加方便。
如果开启 Mirrored 模式后进入 WSL 时还会有报错,可以尝试修改 Hyper-V 防火墙。
在 Windows 端以管理员身份启动 PowerShell,输入以下指令进行修改:
Set-NetFirewallHyperVVMSetting -Name ‘{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}’ -DefaultInboundAction Allow
这条指令将会使 Hyper-V 防火墙允许所有默认情况下的入站网络流量。
3.为 WSL 启用 SystemD
3.1 SystemD 是什么
根据 systemd.io可得知:SystemD 是 Linux 系统的基本构建基块套件,它提供一个系统和服务管理器,该管理器作为 PID 1 运行并启动系统的其余部分。
SystemD 是许多 Linux 发行版所使用的默认 init 系统和服务管理器。根据官方文档的内容,如果在安装发行版系统时是使用wsl --install
默认值进行的,则该发行版系统会使用 SystemD 作为默认 init 系统和服务管理器。而如果使用的是手动安装方式,则可能仍是 SystemV 作为 init 系统的默认值。
在 SystemD 作为 init 系统的情况下,我们所熟知的关机重启指令如reboot
shutdown -h now
等都是可以正常使用和执行的,但在 SystemV 作为 init 系统的情况下会出现问题。
关于查询当前的初始化系统:目前似乎并没有直接命令查询当前的初始化系统是什么,但我们可以使用其他查询进程的指令来查看,例如进程树命令:
pstree -p #添加 -p 选项会显示进程的 PID
此命令会以树状结构显示当前系统中的进程,并直观地展现出进程之间的父子关系。
输出示例如下:
systemd(1)─┬─agetty(287)
├─agetty(292)
├─cron(231)
├─dbus-daemon(233)
├─init-systemd(Ub(2)─┬─SessionLeader(729)───Relay(732)(730)─┬─zsh(732)───pstree(1318)
│ │ ├─zsh(779)
│ │ ├─zsh(781)
│ │ └─zsh(783)───gitstatusd-linu(788)─┬─{gitstatusd-l+
│ │ ├─{gitstatusd-l+
│ │ ├─{gitstatusd-l+
│ │ ├─...
│ ├─init(7)───{init}(8)
│ ├─login(407)───zsh(527)
│ └─{init-systemd(Ub}(9)
├─networkd-dispat(239)
├─packagekitd(1229)─┬─{packagekitd}(1230)
│ └─{packagekitd}(1231)
├─polkitd(1233)─┬─{polkitd}(1234)
│ └─{polkitd}(1236)
├─...
在如上示例中,SystemD 是所有进程的根节点,它的进程 PID 为 1,也就是说当前的 init 系统就是 SystemD.
3.2 如何启用 SystemD
以下操作在PowerShell中进行
如果当前的初始化系统不是 SystemD,并且你希望切换为 SystemD,则可以进行以下操作:
- 确保 WSL 的版本为最新,使用
wsl --update
检查更新并升级。 - 更新完成后输入
wsl
进入子系统。 - 使用命令
cd /etc
切换到根目录下的配置文件目录(也可以理解为设置目录)。 - 使用命令
ls
列出当前目录下的文件和文件夹。 - 查看是否有”wsl.conf”配置文件,如果没有可以直接新建”wsl.conf”。
- 使用自己喜欢的编辑器进行编辑,这里使用vim:
sudo vim /etc/wsl.conf
,在其中加入以下内容:
[boot]
systemd=true
- 保存刚刚编辑的内容后退出到 PowerShell 中(Windows 主机中),关闭并重启 wsl 实例,输入
wsl --shutdown
关闭(此命令会关闭所有wsl实例),再次输入wsl
进入子系统。此时可以输入pstree -p
查看系统进程树。
4.备份和迁移 WSL
WSL 的发行版系统在安装完成后,所有的内容都会储存在虚拟硬盘中,后缀名为.vhdx
,资源管理器中的文件类型显示为“硬盘映像文件”。如果发行版系统在安装完后可以正常启动和运行,那么可以清理对应的安装文件以节省空间。
理论上,直接备份硬盘映像文件.vhdx
也可以完整备份系统,但是在导入或恢复时会遇到一些问题,如路径问题、识别问题、权限问题等等,建议在 PowerShell 使用官方命令进行导入和导出操作以避免这些问题。
#导出/备份
wsl --export <name> <fullpath> #<name>为要导出的发行版系统名称
#<fullpath>为导出后的归档文件的完整路径和名称,建议使用后缀".tar"
#导入/恢复
wsl --import <name> <installlocation> <fullpath> #<name>为要导入的发行版名称
#<installlocation>是导入的发行版系统的目标安装目录
#<fullpath>为要导入的归档文件的完整路径和名称