WSL

WSL提供了一个微软开发的Linux兼容内核接口(不包含Linux代码),来自Ubuntu的用户模式二进制文件在其上运行。

该子系统不能运行所有Linux软件,例如那些图形用户界面,以及那些需要未实现的Linux内核服务的软件。不过,这可以用在外部X服务器上运行的图形X Window系统缓解。

此子系统起源于命运多舛的Astoria项目,其目的是允许Android应用运行在[Windows 10](https://baike.baidu.com/item/Windows 10/6877791?fromModule=lemma_inlink) Mobile上。此功能组件从Windows 10 Insider Preview build 14316开始可用。

2022年9月 22日,微软发布了 [Windows 11](https://baike.baidu.com/item/Windows 11/57321047?fromModule=lemma_inlink)/10 的 Linux 子系统新预览版,微软宣布从该版本开始,WSL 已支持 systemd

具体安装过程

启用Linux子系统的功能

首先,需要在Windows Server或Win11(Win10)上,启用WSL功能:

  • 打开PowerShell作为管理员。

  • 执行以下命令启用适用于Linux的Windows子系统特性:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • 重启电脑

下载WSL格式的Ubuntu系统镜像

方式一

Microsoft Store下载并安装Ubuntu 16.04 LTS或更高版本。至此,在微软商店里安装Ubuntu操作系统就全部完成了。

但是由于本人电脑上经常连不上Microsoft Store服务,处于不可用状态,使用方式二进行安装

方式二

从Ubuntu官网下载WSL系统:

Ubuntu官网WSL的下载地址:https://cloud-images.ubuntu.com/wsl/

进入后,找到结果为wsl.rootfs.tar.gz的文件,根据自己的需要选择一个版本并下载下来。

image-20240619150900437

安装Ubuntu WSL镜像

  • 将下载的wsl.rootfs.tar.gz文件,移动到一个文件夹,例如 C:\Ubuntu\ , 下载的文件是以 -wsl.rootfs.tar.gz结尾的

  • 重命名为ubuntu16.04-wsl.tar.gz (版本号可以根据实际情况调整)

  • Powershell命令,在Windows系统里安装Ubuntu操作系统(导入到Linux子系统)

    Powershell命令格式:

    wsl --import <DistroName> <location to Install> <location of wsl.rootfs.tar.gz File>

    比如,安装到C盘的 C:\Ubuntu\ubuntu16.04目录:

    wsl --import Ubuntu16.04 C:\Ubuntu\16.04  C:\Ubuntu\ubuntu16.04-wsl.tar.gz

    安装大概需要半分钟到1分钟,当PowerShell换了新的一行,说明import安装完成了。

  • 安装完成后, 使用wsl -l命令检查最新的子系统:

    wsl -l

    image-20240619151611544

安装完成

需要手动启动Ubuntu子系统,由于没有从Microsoft Store安装此应用程序,因此在“开始”菜单中没有创建应用程序快捷方式。所以,你需要手动启动它;

// 手动启动命令 
wsl -d Ubuntu16.04

如果有安装 **Windows terminal**终端的话, 子系统也会被直接加载到配置里面,打开后可以直接食用:

image-20240619152001403

碰到的问题

刚安装完成的时候,出现了以下问题:

wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。

解决方法

Windows中的C:\Users\<your_username>目录下创建一个.wslconfig文件,然后在文件中写入如下内容:

[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

配置后执行wsl --shutdown关闭WSL,之后再重启子系统,问题解决;