Windows Subsystem for Linux (WSL) on Windows 10/11

Linux 的 Windows 子系统(Windows Subsystem for Linux, WSL)使得开发人员无需虚拟机(VirtualBox / VMware)就可以直接在 Windows 上运行各种 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux…)环境,包括大多数命令行工具、程序和应用,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。

WSL,简单点说 >>>> 就是 可以在 Windows 上直接使用各种 Linux 发行版。

👇👇👇 使用 WSL 的优势 👇👇👇 Windows WSL 官方文档传送门

  • 与在虚拟机中使用 Linux 相比,WSL 更加流畅;
  • WSL 可以对 Windows 文件系统下的文件直接进行读写,文件传输更方便;
  • 剪贴板互通,开启 “复制-粘贴”。

WSL Setup

关于 WSL 的安装,由于越来越多的开发人员开始转战 WSL 了,你可以在网络上找到大把的安装教程,但这些教程的主流思路都是 >>> 一上来先让你启用 Windows WSL 和虚拟平台支持,然后让你根据给出的一系列相关指令进行操作 … balabala …

事实上,WSL 安装过程中我们需要关注的一个非常重要的问题是 >>>> Windows 操作系统当前的版本号?!! <<<< WSL 能否成功安装的先决条件。>>>> 分别对于 Windows 更早的版本或较新版本会采用不同的安装方式。

除此之外,对于某些特定场景或例外情况,选择 WSL 1 还是 WSL 2 ?

上述问题的确认,对于 WSL 的安装以及后续的使用具有较为重要的影响。


预安装准备

也就是说,WSL Setup 正式开始之前,你需要检查当前运行的操作系统环境,以及具有一定的 WSL 知识储备。

关于 Windows 版本问题

对于 Windows 10 较新(高)版本或 Windows 11,推荐直接使用 wsl --install 安装适用于 Linux 的 Windows 子系统;但如果运行的是更早版本的 Windows,则可能不支持这种方式,需要采用 WSL 手动安装步骤。

因此,安装前,你需要明确当前 Windows 操作系统的版本号:

版本号查看方法 >>>> 按下【Win + R】键 >> 输入【WINVER】>>【ENTER】 <<<< 即可查看到 Windows 版本号。

这里,你只需要明确了当前 Windows 的版本号即可,当前版本号的 Windows 具体采用哪种 WSL 安装方式见后文正式安装小节。


WSL1 Or WSL2

你还需要详细了解不同的 WSL 版本,包括为什么 WSL 2 现在是默认版本,以及可能需要将已安装的 Linux 发行版切换到早期 WSL 1 体系结构以满足特定场景或例外情况。

事实上,WSL 2 是对 WSL 1 基础体系结构的一次重大改造:

功能 WSL 1 WSL 2
Windows 和 Linux 之间的集成
启动时间短
与传统虚拟机相比,占用的资源量少
可以与当前版本的 VMware 和 VirtualBox 一起运行
托管 VM
完整的 Linux 内核
完全的系统调用兼容性
跨 OS 文件系统的性能
systemd 支持
IPv6 支持

可以看出,WSL 2 架构在几个方面优于 WSL 1,但跨 OS 文件系统的性能除外,对于这种情况,可通过将项目文件存储在与处理项目时运行的工具相同的操作系统上进行处理。

WSL 2 最主要的优势在于 >>>> 使用虚拟化技术在轻量级的虚拟机 (VM) 内运行实际的 Linux 内核(将 Linux 发行版作为托管 VM 内的隔离容器运行),来提高文件系统 IO 性能和支持完整的系统调用兼容性。


详细说明 WSL 2 的优势 >>>>

👇👇👇 WSL 体系结构 👇👇👇

传统的 VM 体验,可能启动速度慢,且消耗大量资源,需要花费时间进行管理和配置。

而 WSL 1/2 中 Windows 和 Linux 之间的无缝集成;启动时间短;资源占用量少;WSL 2 中尽管使用 VM,但无需 VM 配置或管理(幕后托管)。

| ================================================== Split Line =============================================== |

👇👇👇 完整的 Linux 内核 👇👇👇

WSL 2 中使用了完整的 Linux 内核,在虚拟机 (VM) 内运行。

WSL 2 中的 Linux 内核,专门针对 WSL 2 进行了调整,针对大小和性能进行了优化,以便在 Windows 上提供良好的 Linux 体验。

WSL 2 Linux 内核是开源的,由 Windows 更新提供服务,你可以轻松获取最新的内核改进功能(Update)。

| ================================================== Split Line =============================================== |

👇👇👇 提升了文件 IO 性能 👇👇👇

WSL 2,对于文件密集型操作(如 git 克隆、npm 安装、apt 更新、apt 升级等)的速度都明显更快。

实际的速度提升将取决于你运行的应用以及它与文件系统的交互方式。 在对压缩的 tarball 进行解包时,WSL 2 的初始版本的运行速度比 WSL 1 快达 20 倍,在各种项目上使用 git 克隆、npm 安装和 cmake 时,大约快 2-5 倍。

| ================================================== Split Line =============================================== |

👇👇👇 完全的系统调用兼容性 👇👇👇

Linux 二进制文件使用系统调用来执行访问文件、请求内存、创建进程等功能。

WSL 1 使用的是由 WSL 团队构建的转换层;但 WSL 2 由于包括了自己的 Linux 内核,因此具有完全的(100%)系统调用兼容性。优点包括:

  • 可以在 WSL 内部运行的一组全新应用,例如 Docker 等;
  • 对 Linux 内核的任何更新都立即可供使用。 (无需等待 WSL 团队实现更新并添加更改)。

↓↓↓↓↓↓ 使用 WSL 1 而不是 WSL 2 ↓↓↓↓↓↓

推荐使用 WSL 2,因为它提供更快的性能和 100% 的系统调用兼容性。在某些特定常见或例外情况下,你可能会更倾向于使用 WSL 1:

1
2
3
4
5
6
7
1. 如果你将使用 WSL Linux 分发版来访问必须存储在 Windows 文件系统上的项目文件,WSL 1 可以更快地访问从 Windows 装载的文件;

2. 一个项目要求对相同的文件使用 Windows 和 Linux 工具进行交叉编译(使用 Windows 应用程序来访问 Linux 文件);

3. 你的项目需要访问串行端口或 USB 设备。 但是,现在可通过 USBIPD-WIN 项目为 WSL 2 提供 USB 设备支持。 有关设置步骤,请参阅 [连接 USB 设备](https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb)。

4. 有严格的内存要求: 关闭 WSL 实例前,WSL 2 还不会将内存中缓存的页面释放回 Windows。 如果你有长时间运行的 WSL 会话或访问非常大量的文件,此缓存可能会耗尽 Windows 内存。

开始 WSL 的正式安装:

Begin To Setup

前面我们提到过,分别对于 Windows 更早的版本或较新版本会采用不同的安装方式:

  • 对于 Windows 较新的版本: WSL 便捷安装
  • 对于 Windows 更早的版本: WSL 手动安装

那么,哪个 Windows 版本号是较新版本?哪个是更早的版本?!!

Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 推荐使用便捷安装;如果使用的是更早的版本,推荐使用手动安装步骤。


如果你当前的 Windows 系统版本满足较新,你可以使用便捷安装方式:

WSL 便捷安装

[1] >>> 管理员模式(Run as administrator)下打开 PowerShell 或 Command Prompt(Windows 命令提示符)

[2] >>> PowerShell 或 Command Prompt 下执行(先不要着急执行!!!你可能想更改默认安装的 Linux 发行版版本):

1
$ wsl --install

此命令,将启用运行 WSL,并安装最新版本的 Linux Ubuntu 发行版。安装信息如下:

1
2
3
4
5
6
7
8
9
10
11
$ wsl --install
Installing: Windows Subsystem for Linux
Windows Subsystem for Linux has been installed.
Downloading: WSL Kernel
Installing: WSL Kernel
WSL Kernel has been installed.
Downloading: GUI App Support
Installing: GUI App Support
GUI App Support has been installed.
Downloading: Ubuntu
The requested operation is successful. Changes will not be effective until the System is rebooted.

↓↓↓↓↓↓ 更改默认安装的 Linux 发行版 ↓↓↓↓↓↓

默认安装最新的 Linux Ubuntu 发行版,如果你希望选择其他类型的发行版,可以首先通过如下指令查看可用发行版列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ wsl --list --online # 命令可简写为:wsl -l -o

以下是可安装的有效分发的列表。
使用 '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
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
openSUSE-Leap-15.5 openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4 SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed openSUSE Tumbleweed

| ================================================== Error Info =============================================== |

使用命令 wsl --install Or wsl --list --online 时,你可能产生如下报错:

1
2
3
4
5
6
7
无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址
Error code: Wsl/WININET_E_NAME_NOT_RESOLVED

或者:

无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法与服务器建立连接
Error code: Wsl/WININET_E_CANNOT_CONNECT

这是由于网络运营商 DNS 服务器无法解析 raw.githubusercontent.com 服务器名称或无法连接服务器,解决方法可参考【Relevant Issues】小节下【服务器无法解析或连接】中描述。

| ================================================== Split Line =============================================== |

然后在 wsl --install 命令中引入 -d <Distribution Name> 进行 Linux 发行版的更改,以 Ubuntu 20.04 安装为例:

1
2
3
4
5
6
7
8
$ wsl --install -d Ubuntu-20.04
正在安装: Ubuntu 20.04 LTS
已安装 Ubuntu 20.04 LTS。
正在启动 Ubuntu 20.04 LTS...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers.
...

如果要安装版本的 Linux 发行版不在上面的有效分发的列表,可使用 TAR 文件导入任何 Linux 发行版 <<< Docker。 在某些情况下,与 Arch Linux 一样,也可使用 .appx 文件进行手动安装。 还可以通过 WSL 创建自己的自定义 Linux 发行版,以供使用。

注意:如果你由于网络等原因,仍然无法使用 wsl --install -d 安装 Linux 发行版,可使用下一小节【WSL 手动安装】方法进行安装。
| ================================================== Split Line =============================================== |

[3] >>> 等待首次启动 Linux 发行版时的解压缩

首次从开始菜单启动新安装的 Linux 发行版(Ubuntu 20.04)时,将打开一个控制台窗口,要求你等待将文件解压缩并存储到计算机上(未来的所有启动时间应不到一秒)。

[4] >>> 创建用户帐户和密码

启动后,需要为新安装的 Linux 发行版创建用户帐户和密码:

1
2
3
4
5
6
7
Enter new UNIX username: orange
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details. ]

你已经可以正常体验安装好的 WSL Linux 发行版(Ubuntu 20.04)了~~~

| ================================================== Split Line =============================================== |

至此,WSL 的快捷安装已经完成~~~ 你可以选择跳转至后文【WSL Linux 启动测试】小节中,继续后续内容的学习。


如果你运行的是旧版(不支持 wsl install),或只是不想使用 wsl install 命令并希望获得分步指引,可以选择:

WSL 手动安装

详细的 WSL 手动安装步骤:

| ================================================== Split Line =============================================== |

[1] >>> 启用 “适用于 Linux 的 Windows 子系统(WSL)”

Windows 上需要先启用 “适用于 Linux 的 Windows 子系统(WSL)” 可选功能,然后才能在 Windows 上安装 Linux 分发。

你可以通过 GUI >>>【控制面板】>>>【程序】>>>【程序和功能】>>> 在【启用或关闭 Windows 功能】中,勾选 “适用于 Linux 的 Windows 子系统”,进行开启。

或者(等价),可以通过以管理员身份打开 PowerShell,然后输入以下命令进行开启:

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

但如果只想安装 WSL 1,现在可以重新启动计算机。然后直接跳转至行步骤 [6],安装你选择的 Liunx 发行版。

注意:需要开启 “适用于 Liunx 的 Windows 子系统” 的设置,才重新启动计算机。如果已开启,则不需要。

若要更新到 WSL 2,请等待重新启动计算机,然后继续执行下一步。

| ================================================== Split Line =============================================== |

[2] >>> 检查运行 WSL 2 的要求

若要更新到 WSL 2,需要运行 Windows 10:

  • 对于 x64 系统:版本 1903 或更高版本,内部版本为 18362.1049 或更高版本;
  • 对于 ARM64 系统:版本 2004 或更高版本,内部版本为 19041 或更高版本。

或 Windows 11。

若要检查 Windows 版本及内部版本号是否满足 WSL 2 运行要求,可参见上文【预安装准备】中【关于 Windows 版本问题】小节中版本号查看方法。

如果 Windows 版本不满住 WSL 2 运行要求,可以选择更新 Windows 版本!!!

| ================================================== Split Line =============================================== |

[3] >>> 启用虚拟机功能

安装 WSL 2 之前,Windows 必须启用 “虚拟机平台” 可选功能,以支持 WSL 2 所需的虚拟化功能(VM)。

同样的,你可以通过 GUI >>>【控制面板】>>>【程序】>>>【程序和功能】>>> 在【启用或关闭 Windows 功能】中,勾选 “虚拟机平台”,进行开启。

或者(等价),可以通过以管理员身份打开 PowerShell,然后输入以下命令进行开启:

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

重新启动计算机,以使得配置的虚拟机功能生效

| ================================================== Split Line =============================================== |

[4] >>> 下载、安装 Linux 内核更新包。

Linux 内核更新包会安装最新版本的 WSL 2 Linux 内核(若要运行 Microsoft Store 中的 WSL 并更频繁地推送更新,请使用 wsl.exe --installwsl.exe --update):

[4.1] >>> 下载最新内核包

你可以通过在 PowerShell | CMD 中 输入 systeminfo 命令查看系统是 ARM64 Or X64:

1
系统类型:         x64-based PC

[4.2] >>> 安装最新内核包

运行上一步中下载的更新包(双击以运行 - 系统将提示你提供提升的权限,选择 “是” 以批准此安装)。

| ================================================== Split Line =============================================== |

[5] >>> 将 WSL 2 设置为默认版本

打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:

1
$ wsl --set-default-version 2

如果希望将新的 Linux 安装设置为 WSL 1,请跳过此步骤!!!

| ================================================== Split Line =============================================== |

[6] >>> 安装所选的 Linux 分发

打开 Microsoft Store(如果你当前环境无法使用 Microsoft Store,可通过【手动下载安装 Linux 发行版】小节完成 Linux 分发的安装),并选择你偏好的 Linux 分发版,并进行安装。

如果要安装版本的 Linux 发行版不在 Microsoft Store 中,可使用 TAR 文件导入任何 Linux 发行版 <<< Docker。 在某些情况下,与 Arch Linux 一样,也可使用 .appx 文件进行手动安装。 还可以通过 WSL 创建自己的自定义 Linux 发行版,以供使用。

首次从开始菜单启动新安装的 Linux 发行版(Ubuntu 20.04)时,将打开一个控制台窗口,要求你等待将文件解压缩并存储到计算机上(未来的所有启动时间应不到一秒)。

启动后,需要为新安装的 Linux 发行版创建用户帐户和密码:

1
2
3
4
5
6
7
Enter new UNIX username: orange
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details. ]

祝贺你!!!现已成功安装并设置了与 Windows 操作系统完全集成的 Linux 分发~~~


WSL Linux 启动测试

安装成功之后,你需要完成 WSL Linux 发行版运行测试:

[1] >>> GUI 启动

Windows 开始菜单中 >>> 搜索【Ubuntu】,找到 “Ubuntu 20.04 LTS” 应用 >>>【打开】

此时,会打开一个 Windows 命令符终端,显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

System information as of Tue Feb 20 16:00:23 CST 2024

System load: 0.24 Processes: 77
Usage of /: 0.1% of 1006.85GB Users logged in: 0
Memory usage: 6% IPv4 address for eth0: 172.26.98.86
Swap usage: 0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/root/.hushlogin file.
root@LAPTOP-SNOSCKOB:~#

| ================================================== Split Line =============================================== |

[2] >>> PowerShell | CMD 启动

你可以通过 PowerShell 或 CMD 运行特定的 Linux 发行版:

1
2
3
4
5
6
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

$ wsl --distribution Ubuntu-20.04
root@LAPTOP-SNOSCKOB:/mnt/c/Users/Xxxxx#

可以发现,默认 WSL Linux 登录用户是 root

需要注意的是:使用 exit 退出 WSL Linux 后,Linux 发行版仍然在后台运行!!!


更改登录时的默认用户

我们知道,默认情况下 WSL Linux 登录用户是 root

更改用于发行版默认登录时的默认用户(用户必须已经存在于发行版中才能成为默认用户),以 Ubuntu-20.04(Ubuntu2004):

1
2
3
4
5
6
7
8
9
10
11
12
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

# <DistributionName> config --default-user <Username>
$ Ubuntu2004 config --default-user orange

$ wsl --distribution Ubuntu-20.04
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

orange@LAPTOP-SNOSCKOB:/mnt/c/Users/Xxxxx$

检查正在运行的 WSL

WSL 的基本命令(Power Shell | CMD 中执行):

[1] >>> WSL Help

查看 WSL 中可用的选项和命令列表:

1
$ wsl --help

[2] >>> 检查 WSL 版本信息

检查有关 WSL 及其组件的版本信息:

1
2
3
4
5
6
7
8
$ wsl --version
WSL 版本: 2.0.9.0
内核版本: 5.15.133.1-1
WSLg 版本: 1.0.59
MSRDC 版本: 1.2.4677
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22631.3007

[3] >>> 检查 WSL 状态

查看有关 WSL 配置的常规信息(例如默认发行版类型、默认发行版和内核版本):

1
2
3
$ wsl --status
默认分发: Ubuntu-20.04
默认版本: 2

[4] >>> 更新 WSL

将 WSL 版本内核更新到最新:

1
$ wsl --update

你可以设置 “从 GitHub 而不是 Microsoft Store 下载最新更新” >>> --web-download 选项。

[5] >>> 列出已安装的 Linux 发行版

通过在 PowerShell 或 Windows 命令提示符中输入以下命令,来列出所有已安装的 Linux 发行版,以及每个发行版的运行情况以及其 WSL 版本:

1
2
3
$ wsl --list --verbose # 命令可简写为:wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

| ================================================== Split Line =============================================== |

[6] >>> PowerShell | CMD 运行特定的 Linux 发行版

若要通过特定用户运行特定 Linux 发行版,可使用如下命令:

1
2
3
4
# wsl --distribution <Distribution Name> --user <User Name>

$ wsl -d Ubuntu-20.04 --user root
root@LAPTOP-SNOSCKOB:/mnt/c/Users/Xxxxx#

其中,<Distribution Name> 为待运行的 Linux 发行版名称;<User Name> 为登录的用户。

[7] >>> PowerShell | CMD 运行默认的 Linux 发行版

1
2
3
4
5
6
7
8
$ wsl
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

orange@LAPTOP-SNOSCKOB:/mnt/c/Users/Xxxxx$

# 以指定用户身份运行 WSL,请将 <Username> 替换为 WSL 发行版中存在的用户名:
$ wsl --user <Username>

[8] >>> 设置 WSL 默认的 Linux 发行版

设置后,WSL 命令(wsl)将用于运行的默认 Linux 发行版:

1
$ wsl --set-default <Distribution Name>

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
Debian Stopped 2

$ wsl --set-default Debian
操作成功完成。

$ wsl -l -v
NAME STATE VERSION
* Debian Stopped 2
Ubuntu-20.04 Stopped 2

# WSL 默认的 Linux 发行版已变更为:Debian
$ wsl
orange@LAPTOP-SNOSCKOB:/mnt/c/Users/Xxxxx$ $ cat /etc/issue
Debian GNU/Linux 12 \n \l

[9] >>> 关闭 WSL

立即终止所有正在运行的发行版和 WSL 2 轻量级实用工具虚拟机:

1
$ wsl --shutdown

在需要重启 WSL 2 虚拟机环境的情形下,例如:更改内存使用限制,或更改 .wslconfig 文件,可能必须使用此命令。

[10] >>> 仅关闭特定 WSL Linux 发行版

若要终止指定的发行版或阻止其运行:

1
2
# 命令可简化为:wsl -t <Distribution Name>
$ wsl --terminate <Distribution Name>

示例:

1
2
3
4
5
6
7
8
9
10
11
12
$ wsl -l -v
NAME STATE VERSION
* Debian Running 2
Ubuntu-20.04 Stopped 2

$ wsl -t Debian
操作成功完成。

$ wsl -l -v
NAME STATE VERSION
* Debian Stopped 2
Ubuntu-20.04 Stopped 2

| ================================================== Split Line =============================================== |

[11] >>> 设置默认的 WSL 版本

若想要设置 WSL 1 或 WSL 2 的默认版本,请将 替换为数字 1 或 2(表示新 Linux 发行版安装默认使用的 WSL 版本。)。

1
2
3
4
$ wsl --set-default-version <Version>

# 示例:
$ wsl --set-default-version 2

WSL 2 仅在 Windows 11 或 Windows 10 版本 1903、内部版本 18362 或更高版本中可用!!!

[12] >>> 切换指定 Linux 发行版中的 WSL 版本

1
$ wsl --set-version <distribution name> <versionNumber>

需要注意的是 >>> 在 WSL 1 和 WSL 2 之间切换可能非常耗时,并且可能会由于两种体系结构之间的差异而导致失败。 对于包含大型项目的分发,建议在尝试转换之前备份文件。


Linux 发行版迁移

默认情况下,WSL Linux 发行版会被安装到 C 盘,随着文件系统,可能会把你的 C 盘爆掉。

这一小节,我们来看如何将 WSL Linux 发行版迁移至其它空闲盘,以 F 盘为例:

[1] >>> 查看要迁移的 Linux 发行版信息

1
2
3
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2

[2] >>> 停止正在运行的将要迁移的 Linux 发行版

1
2
3
4
5
6
$ wsl --terminate Ubuntu-20.04
操作成功完成。

$ wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

[3] >>> 导出需要迁移的 Linux 发行版

1
2
3
$ wsl --export Ubuntu-20.04 F:/WinSubSystem/export.tar
正在导出,这可能需要几分钟时间。...
操作成功完成。

[4] >>> 卸载原有的 Linux 发行版

1
2
3
4
5
6
7
8
9
10
11
12
$ wsl --unregister Ubuntu-20.04
正在注销。
操作成功完成。

$ wsl -l -v
适用于 Linux 的 Windows 子系统没有已安装的分发。

使用‘wsl.exe --list --online’列出可用的分发
和 ‘wsl.exe --install <Distro>’进行安装。

也可以通过访问 Microsoft Store 安装分发:
https://aka.ms/wslstore

[5] >>> 将打包好的 Linux 发行版导入空闲目录

1
2
3
4
5
6
7
8
$ wsl --import Ubuntu-20.04 F:/WinSubSystem/Ubuntu F:/WinSubSystem/export.tar --version 2
正在导入,这可能需要几分钟时间。
操作成功完成。

# 发现以及迁移成功:
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

注销或卸载 Linux 发行版

我们知道,可以通过 Microsoft Store 安装 Linux 发行版,但无法通过 Store 将其卸载。

现列举两种卸载方式:

GUI

通过 Windows 系统的应用与功能卸载,步骤如下:

按出【Windows 开始菜单】>>> 打开【设置】>>> 点击【应用】>>> 从【安装应用列表】搜索 “Ubuntu” 关键字 >>> 查找到后进行【卸载】操作。


Unregister

注销并卸载指定的 WSL 发行版:

1
$ wsl --unregister <DistributionName>

详细步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看要卸载的 Linux 发行版信息
$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
Debian Stopped 2

# 卸载目标 WSL Linux 子系统:
$ wsl --unregister Debian

$ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2

警告:取消注册后,与该分发版关联的所有数据、设置和软件将永久丢失!!!


手动下载安装 Linux 发行版

如果 Microsoft Store 应用不可用,例如:

  • 正在运行不支持 Microsoft Store 的 Windows Server 或长期服务 (LTSC) 桌面操作系统 SKU
  • 你的公司网络策略和/或管理员不允许在你的环境中使用 Microsoft Store

同时,网站访问受限,通过命令 wsl --install -d Ubuntu 也无法下载安装 Ubuntu。

↓↓↓↓↓↓ 在这些情况下,虽然 WSL 本身可用,你可能需要 ↓↓↓↓↓↓

微软提供了手动下载安装的方法:|>>> Manual installation steps for older versions of WSL <<<|,可使用文中给出的以下链接来下载并手动安装 Linux 发行版:

Ubuntu
Ubuntu 22.04 LTS
Ubuntu 20.04
Ubuntu 20.04 ARM
Ubuntu 18.04
Ubuntu 18.04 ARM
Ubuntu 16.04
Debian GNU/Linux
Kali Linux
SUSE Linux Enterprise Server 12
SUSE Linux Enterprise Server 15 SP2
SUSE Linux Enterprise Server 15 SP3
openSUSE Tumbleweed
openSUSE Leap 15.3
openSUSE Leap 15.2
Oracle Linux 8.5
Oracle Linux 7.9
Fedora Remix for WSL

| ================================================== Split Line =============================================== |

[1] >>> Download

你可以直接通过上述链接将 <distro>.appx 下载到你指定的文件夹中。

或者,你也可以使用 PowerShell(Ubuntu 20.04 为例)下载:

1
Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing

其中 wslubuntu2004 为需要下载安装的 distribution 名称,对应 Ubuntu-20.04(查看上面的链接)。你也可以根据需要下载其他 distribution( 例如 ubuntu-22.04 为 wslubuntu2204)。

[2] >>> Setup

下载了发行版后,导航到包含下载内容的文件夹,并在该目录中运行以下命令:

1
Add-AppxPackage .\app_name.appx

其中 app-name 是 Linux 发行版 .appx 文件的名称,这里为 ubuntu2004。


WSL Quick Guide

WSL 开发环境配置及使用:

更换 Apt-get 软件源 (换源)

换源操作请参考 |>>> Ubuntu Server: Quick Configuration Guide <<<| 中【更换 Apt-get 软件源 (换源)】中描述。

换源后,你需要更新软件源,并且升级系统中应用(可选):

👇👇👇 更新和升级包 👇👇👇

1
2
$ sudo apt-get update
$ sudo apt-get upgrade

Windows 不会自动更新或升级 Linux 分发版。 大多数 Linux 用户往往倾向于自行控制此任务。


终端选择

终端有很多,CMD、Cmder、PowerShell(Windows Terminal)等等,这里推荐使用是 Windows 自带的 Windows Terminal(PowerShell)。

每当安装新的 WSL Linux 发行版时,都会在 Windows Terminal 中为其创建一个新实例,该实例可根据你的偏好进行自定义。建议将 WSL 与 Windows Terminal 配合使用,尤其是在计划使用多个命令行时。

关于 Windows Terminal && WSL Linux Shell 更多高级的使用和配置,请参见博文 |>>> 打造高效 Terminal 工作流 CMD/Shell: Oh My Zsh + Tmux + Vim <<<|,可以帮助你打造更高效、优美的 Terminal 使用环境。


文件存储和性能

你可以通过在 Windows 文件资源管理器的地址栏中输入 \\wsl$ 或者 Linux,以查看 WSL 所有可用的 Linux 发行版及其根文件系统:

同样,你可以在 Linux Shell 中,使用以下命令直接打开当前目录的 Windows 文件资源管理器:

1
explorer.exe .

请确保在命令的末尾添加句点!!!以打开当前目录。

需要注意的是,对于 Linux 而言,Windows 文件系统位于如下:

1
2
$ ls /mnt/
c/ d/ e/ f/

Linux 发行版将 Windows 文件系统视为已装载的驱动器。

| ================================================== Split Line =============================================== |

👇👇👇 跨文件系统的文件存储和性能 👇👇👇

推荐 >>> 尽量不要跨操作系统使用文件,除非有这么做的特定原因,这可能会显著降低性能。

也就是说,尽量将 “项目文件” 与 “计划使用项目文件的工具” 存储在相同的操作系统上!!!想获得最快的性能速度:

  • 使用 Linux 工具在 Linux 命令行(Ubuntu、OpenSUSE 等)中处理文件,请将这些文件存储在 WSL 文件系统中;
  • 如果 Windows 工具在 Windows 命令行(PowerShell、命令提示符)中工作,请将文件存储在 Windows 文件系统中。

例如,Ubuntu 中默认自带有 Git 工具,而你的 Windows 中也安装有一个 Git,在 Ubuntu Shell 中使用 git status 来查看一个位于 Windows 文件系统中的一个 Git 项目:

1
2
3
4
5
6
7
8
9
10
11
12
# Ubuntu Git:
$ git --version
git version 2.25.1

# Windows Git:
$ git.exe --version
git version 2.29.2.windows.1

# 测试 git status:
$ cd ../git_project
$ git status
$ git.exe status

Win && Linux 命令的互操作性

借助 WSL,Windows 和 Linux 工具和命令可互换使用:

  • 从 Linux 命令行(即 Ubuntu)运行 Windows 工具(即 notepad.exe);
  • 从 Windows 命令行(即 PowerShell)运行 Linux 工具(即 grep);
  • 在 Windows 与 Windows 之间共享环境变量(混合命令)。

Win-CMD Run Linux

Windows 命令提示符 (CMD) 或 PowerShell 中使用 wsl <command> 来运行 Linux 命令。例如:

1
2
C:\temp> wsl ls -la
<- contents of C:\temp ->

以这种方式调用 Linux 命令:

  • 使用当前 CMD 或 PowerShell 提示符中所位于的同一工作目录
  • 以 WSL 默认用户的身份运行
  • 拥有与调用方进程和终端相同的 Windows 管理权限

wsl 后面的 Linux 命令的处理方式与 WSL 中运行的任何命令的处理方式类似。 可以执行 sudo、管道处理和文件重定向等操作。


混合 Win && Linux

给出几个使用 CMD && PowerShell 混合 Linux 和 Windows 命令的示例(PowerShell 中混合)。

若要使用 Linux 命令 ls -la 列出文件,并使用 PowerShell 命令 findstr 来筛选包含 “git” 的文件:

1
$ wsl ls -la | findstr "git"

等价于,使用 PowerShell 命令 dir 列出文件,并使用 Linux 命令 grep 来筛选包含 “git” 的的文件:

1
$ dir | wsl grep git

Linux Shell Run Win

WSL 可以使用 [tool-name].exe 直接从 WSL 命令行运行 Windows 工具。

例如:

1
$ cmd.exe

以这种方式调用 Windows 应用程序:

  • 按 WSL 命令提示保留工作目录(大部分情况下是这样 – 下面所述的情况除外)
  • 以活动 Windows 用户的身份运行,拥有与 WSL 进程相同的权限
  • 显示在 Windows 任务管理器中,就如同直接从 CMD 提示符执行的一样

在 WSL 中运行的 Windows 可执行文件的处理方式类似于本机 Linux 可执行文件 - 管道处理、重定向,甚至后台处理都可按预期方式工作。

给出几个样例:

使用 Linux 命令 ls -la 列出直接文件及其创建详细信息,并使用 Windows PowerShell 工具 findstr.exe 来筛选结果:

1
ls -la | findstr.exe .profile

通过输入以下命令列出 Windows 文件系统 C:\ 目录的内容:

1
cmd.exe /C dir

通过 notepad.exe 打开 C:\temp\foo.txt

1
notepad.exe "C:\temp\foo.txt"

IDE 选择和设置

推荐使用支持 WSL 进行远程开发和调试功能的 IDE >>>> Visual Studio Code。

关于 WSL + Visual Studio Code 的开发环境搭建,推荐参考 >>>>【玩转 VSCode 之配置远程开发环境】中【WSL Connection】小节的描述。


Git 版本管理

你可以在 WSL Linux 上使用 Git 进行版本管理。

WSL 上使用 Git 和 VM 上 Linux 发行版上使用 Git 是相同的,推荐参考 Git 博文系列 >>>>【Git 使用指南】。


数据库

开始使用 MySQL、PostgreSQL、MongoDB、Redis、Microsoft SQL Server 或 SQLite。

按照此分步指南 >>>> 开始使用 WSL 上的数据库 <<<< 并将项目连接到 WSL 环境中的数据库。


设置 GPU 加速

按照此分步指南 >>>> 在 WSL 中设置 GPU 加速的机器学习训练 <<<< 利用计算机的 GPU(图形处理单元)来加速性能繁重的工作负载。


Other Linux-Distro Installations

前面我们提到过:

如果要安装版本的 Linux 发行版不在有效的分发的列表,可使用 TAR 文件导入任何 Linux 发行版 <<< 借助 Docker 容器。

这里,我们提供另一种替代性的方法 >>>> 使用从 Github 制作的 Linux 发行版镜像,直接进行安装。

| ================================================== Split Line =============================================== |

👇👇👇 以 CentOS 系统的安装为例 👇👇👇

CentWSL Github 镜像库地址,其它更多 Linux 发行版镜像下载地址,参看【这里】。

从上述链接中,下载期望的 Linux 发行版镜像压缩文件(例如 CentOS7.zip)、解压、选择目录存放,解压后有两个文件:

1
2
CentOS7.exe
rootfs.tar.gz

双击 .exe 文件,等待显示安装完成,此时会在当前解压目录中生成一个 ext4.vhdx 的文件(安装的系统,无法直接访问),安装过程如下所示:

1
2
3
4
Using: F:\WinSubSystem\CentOS7\rootfs.tar.gz
Installing...
Installation complete
Press enter to continue...

安装之后,你可以通过在资源管理器中查找 Linux 或者 \\wsl$ 或者\\wsl.localhost 来查看安装好的 CentOS7 系统的根目录。

最后,你可以通过 PowerShell 或 CMD 运行特定的 Linux 发行版:

1
2
3
4
5
6
7
wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
CentOS7 Stopped 2
Debian Stopped 2
PS C:\Users\Xxxxx> wsl --distribution CentOS7
[root@LAPTOP-SNOSCKOB Xxxxx]#

可以发现,默认 WSL Linux 登录用户是 root。

这里由于我们还未创建普通用户,你可以添加一个用户供日常使用,或者供他人使用。

同时可以参照上文【更改登录时的默认用户】进行用户登录设置。但你需要在解压目录中执行如下:

1
2
3
PS F:\WinSubSystem\CentOS7> .\CentOS7.exe config --default-user orange
PS F:\WinSubSystem\CentOS7> wsl -d CentOS7
[orange@LAPTOP-SNOSCKOB CentOS7]$

由于是 CentOS7 的最小安装,一些常用的命令工具无法使用,可以使用 yum 包管理器进行安装:

  • 更新系统中已有的软件包 yum -y update
  • 安装 GCC/G++、Wget 等 yum -y install gcc gcc-c++ make wget
  • 安装 SSH 相关 yum -y install openssh-clients openssh-server
  • 安装 Vim 编辑器 yum -y install vim
  • 安装压缩、解压缩工具 yum -y install tar
  • 安装网络工具 yum -y install net-tools

| ================================================== Split Line =============================================== |

至此 Linux 发行版 CentOS 的安装就完成了,其它发行版本过程类似~~~


Relevant Issues

这里总结了 WSL 安装使用过程中可能产生的问题,以及相关的解决方法:

| ================================================== Split Line =============================================== |

WSL2 终端卡顿滞后的优化

WSL2 内置 Shell 卡顿的罪魁祸首 >>>> WSL2 默认将 Windows 的环境变量(path)添加到了 WSL 环境变量中了。如下:

1
2
$ echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/f/NodeJs/:/mnt/f/Java/jdk1.8.0_271/bin:/mnt/f/Apache Maven/apache-maven-3.6.3/bin:/mnt/f/Apache Tomcat/apache-tomcat-9.0.40/bin:/mnt/f/MinWG64/mingw64/bin:/mnt/f/Python/Python36:/mnt/f/Python/Python36/Scripts:/mnt/f/Anaconda3:/mnt/f/Anaconda3/Scripts:/mnt/f/Anaconda3/Library/bin:/mnt/f/Anaconda3/Library/mingw-w64:/mnt/f/DataBases/mysql-5.7.29-winx64/bin:/mnt/f/Git/Git/cmd:/snap/bin

在 Linux Shell 中遍历环境变量的时候会遍历到 Windows 的系统环境变量,因为 WSL2 跨系统访问 Windows 的性能较低,就导致终端遍历的速度很慢,出现滞后。

这种滞后,一般出现在加装了高亮提示插件的 ZSH 上,因为高亮提示插件会不停的遍历环境变量。

↓↓↓↓↓↓ 解决思路 ↓↓↓↓↓↓

核心思路 >>>> 禁用 WSL2 访问 Windows 的环境变量,手动添加需要的 Windows 环境变量。

[1] >>> 警用 WSL2 访问 Windows 环境变量

编辑 /etc/wsl.conf 这个配置文件(如果没有该配置文件,请手动创建),在里面添加如下内容:

1
2
[interop]
appendWindowsPath=false

不允许访问 Windows 的环境变量当然会对我们愉快的使用 WSL2 有影响,所以我们可以再选择性的添加一些环境变量就可以了

[2] >>> 选择性添加 Windows 环境变量

编辑 /etc/profile 文件,在末尾追加如下内容:

1
2
3
export PATH="$PATH:/mnt/c/Windows"
export PATH="$PATH:/mnt/c/Windows/system32"
export PATH="$PATH:/mnt/f/NodeJs/"

[3] >>> 重启 WSL2

1
2
3
4
5
# 关闭 WSL
$ wsl --shutdown

# 启动默认 WSL 发行版
$ wsl

这样就既可以流畅使用 WSL2,又可以保留 WSL2 对 Windows 程序的调用。


服务器无法解析或连接

使用命令 wsl --install Or wsl --list --online 时,你可能产生如下报错:

1
2
无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址
Error code: Wsl/WININET_E_NAME_NOT_RESOLVED

这是由于网络运营商 DNS 服务器无法解析 raw.githubusercontent.com 服务器名称,或者网站访问被限制。

↓↓↓↓↓↓ 解决思路 ↓↓↓↓↓↓

这里提供几种解决方法:

👇👇👇 科学上网 👇👇👇

最简单、快捷,究极的方法,你可以通过开启科学上网工具来解析或访问 raw.githubusercontent.com 服务器。

👇👇👇 配置 DNS 解析服务器 Or 添加 Hosts 域名映射 👇👇👇

具体解决方法请参见 |>>> 一文解析服务器域名无法解析 && 连接超时 && 访问受限问题 <<<| 下【域名无法解析】中的描述。

👇👇👇 手动安装 👇👇👇

具体解决方法请参见前面【WSL Setup】小节中【手动下载安装 Linux 发行版】安装步骤说明。


Author

Waldeinsamkeit

Posted on

2022-10-01

Updated on

2024-03-05

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.