Win11 部署 WSL2 并连接 VS Code

317次阅读
没有评论

共计 7157 个字符,预计需要花费 18 分钟才能阅读完成。

Win11 部署 WSL2 并连接 VS Code

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 功能

  1. 点击开始菜单(Windows 徽标)搜索:启用或关闭 Windows 功能。
  2. 在弹出的窗口中勾选适用于 Linux 的 Windows 子系统虚拟机平台两项。(参考图1-1)
  3. 重启电脑。
  4. 打开 PowerShell 、终端或命令提示符(cmd),输入 wsl --version 查看是否成功启用该功能;输入 wsl --update 检查更新。
Win11 部署 WSL2 并连接 VS Code

图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所示:

Win11 部署 WSL2 并连接 VS Code

图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 即可进行连接:

Win11 部署 WSL2 并连接 VS Code

图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:

Win11 部署 WSL2 并连接 VS Code

图4-1

这样一来在使用 shell 等命令行时就可以更加方便,仅需 Terminal 这一个应用即可。同时终端的外观设计更加现代化,与 Windows 11 的风格更趋于统一,并且可以实现很多个性化设置。

安装:可以直接从微软商店(Microsoft Store)搜索“终端”或“terminal”进行安装,也可以点击这里下载可执行文件直接进行下载安装(省去了搜索步骤)。

设置:终端可以方便的进行基础设置,如默认终端程序,打开时的默认 shell 等等。用户还可以直接编辑 JSON 文件进行设置,理论上备份JSON文件就相当于备份了整套配置,装新系统或是换机时可以直接迁移。终端还可以进行个性美化,设置配色方案、背景、字体等内容,甚至还有复古的光亮文本和扫描线条特效(酷但费眼),如图4-2:

Win11 部署 WSL2 并连接 VS Code

图4-2.1

Win11 部署 WSL2 并连接 VS Code

图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,则可以进行以下操作:

  1. 确保 WSL 的版本为最新,使用wsl --update检查更新并升级。
  2. 更新完成后输入wsl进入子系统。
  3. 使用命令cd /etc切换到根目录下的配置文件目录(也可以理解为设置目录)。
  4. 使用命令ls列出当前目录下的文件和文件夹。
  5. 查看是否有”wsl.conf”配置文件,如果没有可以直接新建”wsl.conf”。
  6. 使用自己喜欢的编辑器进行编辑,这里使用vim:sudo vim /etc/wsl.conf,在其中加入以下内容:
[boot]
systemd=true
  1. 保存刚刚编辑的内容后退出到 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>为要导入的归档文件的完整路径和名称
正文完
 0
评论(没有评论)