为windows安装Linux子系统(WSL2)
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云,可以忽略
我们使用默认的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盘
那就换用手动安装。下载Linux发行版的Appx安装包。将后缀名 .AppxBundle
改为 .zip
,解压,会得到一系列 .appx
由于电脑一般都是 x64
平台,选中 ...x64.appx
将其后缀名改为 .zip
,继续解压,就能看到 ubuntu.exe
了。这是Ubuntu发行版的安装文件
将 ubuntu.exe
和该目录的所有文件,一起移动要想要安装的目录,例如 D:/Ubuntu
。双击 ubuntu.exe
,会弹出终端窗口,按提示输入Linux系统下的用户名、密码,即可安装成功。用户名和密码不需要与windows一致,可以自定义
在安装成功后,D:/Ubuntu
下会出现 ex4.vhdx
文件,这是WSL2的虚拟磁盘。保留该文件,其他所有文件都可删除
至此,WSL2已经安装完毕
在Powershell中,可列出当前安装的所有发行版
PS C:\Users\william> wsl -l -v --all
NAME STATE VERSION
* Ubuntu Running 2
在Windows terminal的设置-启动中,将默认配置文件改为Ubuntu,即可在打开终端时,默认进入WSL
WSL支持同时安装多个Linux发行版
功能特性
文件互访
在Windows文件浏览器中,增加了Linux标签页,可以看到刚安装的Ubuntu发行版,双击即可进入WSL2的根路径
而在WSL内的 /mnt
路径下,则挂载着Windows的C盘、D盘等
自动配置的X11
Linux使用X11(X window)作为其图形界面的实现基础,而WSL2已经默认配置好X11了。这意味着在WSL启动GUI程序,可以在Windows系统中弹出对应图形窗口
直接运行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占用,网络模式,自动代理等
而 /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环境的访问
此时即可打开WSL内的项目
安装vs code的python扩展后
在 .py
文件内,右下角可切换解释器,会自动列出WSL内,conda环境下的解释器
点击Run python file,vscode会自动在右侧展开终端,运行当前脚本
如果是个绘图脚本,将会额外打开一个窗口展示图像
如果安装了jupyter插件,则可以在右键菜单选择Run in interactive window,在一个类似jupyter的交互窗口中运行脚本
卸载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