Windows Subsystem for Linux(WSL)是微软官方出品、已经植入Windows内核的系统组件,也是在Windows上使用Linux的最佳实践

WSL比装Linux双系统、VMware等虚拟机平台占用的资源更少,对硬件的利用效率更高,与Windows的互访也更顺畅

WSL有两个差异很大的版本,WSL1用翻译层将Linux系统调用转换为Windows系统调用,WSL2则引入了真实的Linux内核。更具体的比较可参考这里

本文我们一起来安装WSL2,感受WSL2便捷的特性,设置WSL2的网络模式,并搭建vscode的python开发环境

开启WSL2功能

首先进入主板BIOS,开启CPU虚拟化。进入BIOS的方法请根据主板厂商或电脑品牌自行查找

CPU虚拟化一般在CPU高级设置目录下,具体名称随主板厂商有所区别,例如可能是

Virtualization Technology for x86 (VT-x)
Intel Virtualization Technology (IVT)
Secure Virtual Machine (SVM)
SVM mode
Virtu Technology

开启CPU虚拟化后,记得保存设置,重启电脑

进入Windows系统后,打开Microsoft store,安装Windows terminal,方便输入命令。如果你使用了系统代理,实测必须关闭才可顺利进入Microsoft store,模式选择“直连”都不可以。

下载后,以管理员身份运行终端。此时新建选项卡有三个终端选项:Powershell,是Windows系统最新的命令行应用;命令提示符,也就是CMD,是Windows上一代命令行应用;Azure Cloud Shell,用于连接微软Azure云,可以忽略

image.png|500

我们使用默认的Powershell,在系统层面开启WSL组件,输入

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

然后开启虚拟机平台功能,这是WSL2所必须的

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

以上操作会提示

部署映像服务和管理工具
版本: 10.0.22621.2792

映像版本: 10.0.22631.3593

启用一个或多个功能
[==========================100.0%==========================]
操作成功完成。

重启电脑,应用刚才的设置

重启后,下载WSL2内核更新包,安装之

继续以管理员身份运行终端,把WSL的默认版本设为WSL2

wsl --set-default-version 2

安装Linux发行版

最简单的方式是在Microsoft store中下载安装,缺点是默认安装到C盘

image.png|575

那就换用手动安装。下载Linux发行版的Appx安装包。将后缀名 .AppxBundle改为 .zip,解压,会得到一系列 .appx

image.png|500

由于电脑一般都是 x64平台,选中 ...x64.appx将其后缀名改为 .zip,继续解压,就能看到 ubuntu.exe了。这是Ubuntu发行版的安装文件

image.png|500

ubuntu.exe和该目录的所有文件,一起移动要想要安装的目录,例如 D:/Ubuntu。双击 ubuntu.exe,会弹出终端窗口,按提示输入Linux系统下的用户名、密码,即可安装成功。用户名和密码不需要与windows一致,可以自定义

在安装成功后,D:/Ubuntu下会出现 ex4.vhdx文件,这是WSL2的虚拟磁盘。保留该文件,其他所有文件都可删除

image.png|550

至此,WSL2已经安装完毕

在Powershell中,可列出当前安装的所有发行版

PS C:\Users\william> wsl  -l -v --all
  NAME      STATE           VERSION
* Ubuntu    Running         2

在Windows terminal的设置-启动中,将默认配置文件改为Ubuntu,即可在打开终端时,默认进入WSL

image.png|875

WSL支持同时安装多个Linux发行版

功能特性

文件互访

在Windows文件浏览器中,增加了Linux标签页,可以看到刚安装的Ubuntu发行版,双击即可进入WSL2的根路径

image.png|450

而在WSL内的 /mnt路径下,则挂载着Windows的C盘、D盘等

自动配置的X11

Linux使用X11(X window)作为其图形界面的实现基础,而WSL2已经默认配置好X11了。这意味着在WSL启动GUI程序,可以在Windows系统中弹出对应图形窗口

image.png

直接运行Windows程序

WSL中可以直接运行一些Windows下的程序,例如powershell、文件浏览器、任务管理器

powershell.exe
explorer.exe
tasklist.exe

如果你在Windows安装了VS code,也可在WSL下直接启动

code .

配置文件

windows下 %USERPROFILE%/.wslconfig是整个WSL2系统组件的配置,WSL2下 /etc/wsl.conf是当前发行版的配置。两者可以配置的选项并不一样,具体参考这里

在文件浏览器输入 %USERPROFILE%即可导航到用户目录,手动创建 .wslconfig,在内部可配置内存、CPU占用,网络模式,自动代理等

image.png

/etc/wsl.conf,可配置systemd支持,驱动器装载路径,启动附加命令等

修改配置文件后,需要在powershell中关闭WSL2系统组件,等待8秒以上再重新进入WSL

wsl --shutdown

开启systemd

默认情况下,WSL未开启systemd,无法使用 systemctl等命令

william@DESKTOP-M1SON1F:~$ sudo systemctl
[sudo] password for william:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

进入linux系统中,修改WSL2配置文件 /etc/wsl.conf,添加

[boot]
systemd=true

在powershell中更新WSL2,然后关闭WSL2

wsl --update
wsl --shutdown

重启WSL2后,systemctl就可以使用了

网络模式

默认NAT模式

WSL2的默认网络模式是NAT(Network Address Translation)。NAT模式下,WSL与windows组成一个小局域网。WSL内开启的服务如HTTP等,windows内可通过 localhost:port访问,这很方便。但WSL内,不能这样访问windows开启的服务(如代理服务器)

powershell中使用 ipconfig, 在WSL的以太网配置下,可以看到windows暴露的ip是 172.23.112.1。于是,访问windows的服务就得通过 172.23.112.1:port

以太网适配器 vEthernet (WSL (Hyper-V firewall)):

   连接特定的 DNS 后缀 . . . . . . . :
   IPv4 地址 . . . . . . . . . . . . : 172.23.112.1
   子网掩码  . . . . . . . . . . . . : 255.255.240.0
   默认网关. . . . . . . . . . . . . :

然而,windows暴露给WSL的ip并非固定不变。解决方式之一,是在WSL的 .bashrc里直接获取windows的ip

export windows_host=`ip route | grep default | awk '{print $3}'`

镜像模式

在windows11 22H2版本之后,WSL2支持镜像模式。在 %USERPROFILE%/.wslconfig中,填写

[wsl2]
networkingMode=mirrored 

重启WSL后,在WSL中 ifconfig显示ip

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.128.xxx.xxx  netmask 255.255.240.0  broadcast 10.128.255.255

对照powershell下显示的windows ip,会发现WSL和windows的ip保持一致了

以太网适配器 以太网:
   IPv4 地址 . . . . . . . . . . . . : 10.128.xxx.xxx

如果windows使用系统代理,你会发现WSL也自动设置了一样的代理

$ echo $HTTP_PROXY
http://127.0.0.1:7890

在镜像模式下,WSL和windows都可以 localhost互访

vscode使用WSL环境开发

安装插件组合Remote Development,其中名为WSL的插件提供对WSL环境的访问

image.png

此时即可打开WSL内的项目

image.png

安装vs code的python扩展后

image.png|950

.py文件内,右下角可切换解释器,会自动列出WSL内,conda环境下的解释器

image.png|725

点击Run python file,vscode会自动在右侧展开终端,运行当前脚本

image.png

如果是个绘图脚本,将会额外打开一个窗口展示图像

image.png|900

如果安装了jupyter插件,则可以在右键菜单选择Run in interactive window,在一个类似jupyter的交互窗口中运行脚本

image.png|900

卸载WSL2

如果是手动安装的WSL2发行版,powershell内使用 wsl --unregister即可卸载特定的WSL发行版。执行后 ex4.vhdx会被删除

PS C:\Users\william> wsl  -l -v --all
  NAME      STATE           VERSION
* Ubuntu    Running         2

PS C:\Users\william> wsl --unregister Ubuntu