文章目录
- 1. 概述
- 1.1 什么是适用于 [Linux](https://so.csdn.net/so/search?q=Linux&spm=1001.2101.3001.7020) 的 Windows 子系统
- 1.2 什么是 WSL 2?
- 1.3 WSL 2 中的新增功能
- 1.4 比较 WSL 2 和 WSL 1
- 2. 快速入门
1. 概述
1.1 什么是适用于 Linux 的 Windows 子系统
适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生虚拟机开销。
您可以:
- 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
- 运行常用的命令行软件工具(例如 grep、sed、awk)或其他 ELF-64 二进制文件。
- 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序,包括:
- 工具:vim、emacs、tmux *语言:NodeJS、Javascript、Python、Ruby、C/ C++、C# 与 F#、Rust、Go 等 *服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。
- 使用自己的 GNU/Linux 分发包管理器安装其他软件。
- 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
- 在 Windows 上调用 GNU/Linux 应用程序。
1.2 什么是 WSL 2?
WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。
这一新的体系结构改变了这些 Linux 二进制文件与Windows 和计算机硬件进行交互的方式,但仍然提供与 WSL 1(当前广泛可用的版本)中相同的用户体验。
单个 Linux 分发版可以在 WSL 1 或 WSL 2 体系结构中运行。 每个分发版可随时升级或降级,并且你可以并行运行 WSL 1 和 WSL 2 分发版。 WSL 2 使用全新的体系结构,该体系结构受益于运行真正的 Linux 内核。
1.3 WSL 2 中的新增功能
SL 2 是 WSL 中体系结构的新版本,它更改了 Linux 分发版与 Windows 进行交互的方式。 WSL 2 的主要目标是提高文件系统性能并增加完全的系统调用兼容性。 每个 Linux 分发版都可以作为 WSL 1 或 WSL 2 运行,并可随时在它们之间进行切换。 WSL 2 是对基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。
只有 Windows 10 版本 2004 的内部版本 19041 或更高版本中才提供 WSL 2。
1.4 比较 WSL 2 和 WSL 1
适用于 Linux 的 Windows 子系统更新到新版本的主要目标是,提高文件系统性能并支持完全的系统调用兼容性。
WSL 2 使用最新、最强大的虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核。 但是,WSL 2 不是传统的 VM 体验。 了解有关 WSL 2 体系结构的详细信息。
1.4.1 比较功能
功能 | WSL 1 | WSL 2 |
---|---|---|
Windows 和 Linux 之间的集成 | ✅ | ✅ |
启动时间短 | ✅ | ✅ |
占用的资源量少 | ✅ | ✅ |
托管 VM | ❌ | ✅ |
完整的 Linux 内核 | ❌ | ✅ |
完全的系统调用兼容性 | ❌ | ✅ |
可以与当前版本的 VM Ware 和 VirtualBox 一起运行 | ✅ | ❌ |
跨 OS 文件系统的性能 | ✅ | ❌ |
已在使用 WSL 1 并且想要升级到 WSL 2? 请按照说明更新到 WSL 2!
只有 Windows 10 版本 2004 的内部版本 19041 或更高版本中才提供 WSL 2。 通过按 Windows 徽标键 + R,检查你的 Windows 版本,然后键入 winver,选择“确定”。 (或者在 Windows 命令提示符下输入 ver 命令)。 你可能需要更新到最新的 Windows 版本。 对于低于 19041 的版本,WSL 根本不受支持。
备注:WSL 2 可与以前版本的 VM Ware 和 VirtualBox 6.x 配合使用。
1.4.2 使用 Linux 文件系统以提高性能
为了进行优化以实现最快的性能速度,请确保将项目文件存储在 Linux 文件系统(而非 Windows 文件系统)中。
例如,在存储 WSL 项目文件时:
- 使用 Linux 文件系统根目录:\wsl$\Ubuntu-18.04\home\Project
- 而不使用 Windows 文件系统根目录:C:\Users\Project
通过 WSL 分发版(如 Ubuntu)使用的项目文件必须位于 Linux 根文件系统中,才能利用更快的文件系统访问速度。
可以使用 Windows 应用和工具(如文件资源管理器)访问 Linux 根文件系统。 尝试打开 Linux 分发版(如 Ubuntu),通过输入以下命令确保你位于 Linux 主目录中:cd ~。 然后通过输入 explorer.exe .(不要忘记尾部的句点),在文件资源管理器中打开 Linux 文件系统。
1.4.3 例外情况(使用 WSL 1 而不是 WSL 2)
我们建议使用 WSL 2,因为它提供更快的性能和100% 的系统调用兼容性。 但是,在某些特定情况下,你可能会更倾向于使用 WSL 1。 在以下情况下,请考虑使用 WSL 1:
- 你的项目文件必须存储在 Windows 文件系统中。
- 如果你将使用 WSL Linux 分发版来访问 Windows 文件系统上的项目文件,并且这些文件无法存储在 Linux 文件系统上,那么,通过使用 WSL 1,你将跨 OS 文件系统实现更快的性能。
- 一个项目要求对相同的文件使用 Windows 和 Linux 工具进行交叉编译。
- 在 WSL 1 中,跨 Windows 和 Linux 操作系统的文件性能比 WSL 2 中更快,因此如果要使用 Windows 应用程序来访问 Linux 文件,则目前通过 WSL 1 可实现更快的性能。
备注:请考虑尝试 VS Code 远程 WSL 扩展,以便使你不仅能够使用 Linux 命令行工具将项目文件存储在 Linux
文件系统上,而且还可以使用 Windows 上的 VS Code 在 Internet
浏览器中创作、编辑、调试或运行项目,而不会造成任何与跨 Linux 和 Windows 文件系统工作相关联的性能下降。
了解详细信息。
1.4.4 WSL 2 体系结构
传统的 VM 体验可能启动速度慢,是独立的,消耗大量资源,需要你花费时间进行管理。 WSL 2 没有这些属性。
WSL 2 有 WSL 1 的优点,包括 Windows 和 Linux 之间的无缝集成,启动时间短,资源占用量少,并且无需 VM 配置或管理。 虽然 WSL 2 确实使用 VM,但 VM 是在幕后管理和运行的,因此你将具有与 WSL 1 相同的用户体验。
1.4.5 完整的 Linux 内核
WSL 2 中的 Linux 内核是 Microsoft 根据最新的稳定版分支(基于 kernel.org 上提供的源代码)构建的。此内核已专门针对 WSL 2 进行了调整,针对大小和性能进行了优化,以便在 Windows 上提供良好的 Linux 体验。 内核将由 Windows 更新提供服务,这意味着你将获得最新的安全修补程序和内核改进功能,而无需自行管理它。
WSL 2 Linux 内核是开源的。 如果你想要了解详细信息,请查看由构建该内核的团队撰写的博客文章随 Windows 一起提供 Linux 内核。
1.4.6 提升了文件 IO 性能
在使用 WSL 2 的情况下,文件密集型操作(如 git 克隆、npm 安装、apt 更新、apt 升级等)的速度都明显更快。
实际的速度提升将取决于你运行的应用以及它与文件系统的交互方式。 在对压缩的 tarball 进行解包时,WSL 2 的初始版本的运行速度比 WSL 1 快达 20 倍,在各种项目上使用 git 克隆、npm 安装和 cmake 时,大约快 2-5 倍。
1.4.7 完全的系统调用兼容性
Linux 二进制文件使用系统调用来执行访问文件、请求内存、创建进程等功能。 虽然 WSL 1 使用的是由 WSL 团队构建的转换层,但 WSL 2 包括了自己的 Linux 内核,具有完全的系统调用兼容性。 优点包括:
- 可以在 WSL 内部运行的一组全新应用,例如 Docker 等。
- 对 Linux 内核的任何更新都立即可供使用。 (无需等待 WSL 团队实现更新并添加更改)。
1.4.8 WSL 2 在启动时使用的内存量更少
WSL 2 在实际 Linux 内核上使用轻量级实用工具 VM,内存占用量很小。 该实用工具将在启动时分配虚拟地址支持的内存。 它已经过配置,在启动时使用的内存占比小于 WSL 1 所需的内存占比。
1.4.9 访问网络应用程序
1.4.9.1 从 Windows (localhost) 访问 Linux 网络应用
如果要在 Linux 分发版中构建网络应用(例如,在 NodeJS 或 SQL server 上运行的应用),可以使用 localhost 从 Windows 应用(如 Edge 或 Chrome Internet 浏览器)访问它(就像往常一样)。
但是,如果运行的是较旧版本的 Windows(版本 18945 或更低版本),则需要获取 Linux 主机 VM 的 IP 地址(或更新到最新的 Windows 版本)。
若要查找为 Linux 分发版提供支持的虚拟机的 IP 地址,请执行以下操作:
- 在 WSL 分发版(即 Ubuntu)中运行以下命令:ip addr
- 查找并复制 eth0 接口的 inet 值下的地址。
- 如果已安装 grep 工具,请通过使用以下命令筛选输出来更轻松地查找此地址:ip addr | grep eth0
- 使用此 IP 地址连接到 Linux 服务器。
下图显示了一个示例,该示例使用 Edge 浏览器连接到 Node.js 服务器。
1.4.9.2 从 Linux(主机 IP)访问 Windows 网络应用
如果要从 Linux 分发版(即 Ubuntu)访问 Windows 上运行的网络应用(例如,在 NodeJS 或 SQL 服务器上运行的应用),则需要使用主机的 IP 地址。 虽然这不是一种常见方案,但你可以执行以下步骤来使其可行。
- 通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:
cat /etc/resolv.conf
。 - 复制以下词语后面的 IP 地址:
nameserver
。 - 使用复制的 IP 地址连接到任何 Windows 服务器。
下图显示了一个示例,该示例说明如何通过 curl 连接到在 Windows 中运行的 Node.js 服务器。
1.4.9.3 其他网络注意事项
1.4.9.3.1 通过远程 IP 地址进行连接
当使用远程 IP 地址连接到应用程序时,它们将被视为来自局域网 (LAN) 的连接。 这意味着你需要确保你的应用程序可以接受 LAN 连接。
例如,你可能需要将应用程序绑定到 0.0.0.0
而非 127.0.0.1
。 以使用 Flask 的 Python 应用为例,可以通过以下命令执行此操作:app.run(host='0.0.0.0')
。 进行这些更改时请注意安全性,因为这将允许来自你的 LAN 的连接。
1.4.9.3.2 从局域网 (LAN) 访问 WSL 2 分发版
当使用 WSL 1 分发版时,如果计算机设置为可供 LAN 访问,那么在 WSL 中运行的应用程序也可供在 LAN 中访问。
这不是 WSL 2 中的默认情况。 WSL 2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,你需要执行与常规虚拟机相同的步骤。 (我们正在寻找改善此体验的方法。)
1.4.9.3.3 IPv6 访问
WSL2 分发版目前无法访问纯 IPv6 地址。 我们正在致力于添加此功能。
1.4.10 扩展 WSL 2 虚拟硬件磁盘的大小
WSL 2 使用虚拟硬件磁盘 (VHD) 来存储 Linux 文件。 如果达到其最大大小,则可能需要对其进行扩展。
WSL 2 VHD 使用 ext4 文件系统。 此 VHD 会自动调整大小以满足你的存储需求,并且其最大大小为 256GB。 如果你的分发版大小增长到大于 256GB,则会显示错误,指出磁盘空间不足。 可以通过扩展 VHD 大小来纠正此错误。
若要将最大 VHD 大小扩展到超过 256GB,请执行以下操作:
- 使用 wsl --shutdown 命令终止所有 WSL 实例
- 查找你的分发版安装包名称(“PackageFamilyName”)
使用 PowerShell(其中,“distro”是分发版名称)输入以下命令:
Get-AppxPackage -Name "*<distro>*" | Select PackageFamilyName
- 找到 WSL 2 安装使用的 VHD 文件
fullpath
,这将是你的pathToVHD
:
%LOCALAPPDATA%\Packages\LocalState.vhdx - 通过完成以下命令调整 WSL 2 VHD 的大小:
以管理员权限打开 Windows 命令提示,然后输入:
diskpart
Select vdisk file=“”
expand vdisk maximum=“” - 启动 WSL 分发版(例如 Ubuntu)。
- 通过从 Linux 分发版命令行运行以下命令,让 WSL 知道它可以扩展其文件系统的大小:
sudo mount -t devtmpfs none /dev
mount | grep ext4
复制此项的名称,该名称类似于:/dev/sdXX(X 表示任何其他字符)
sudo resize2fs /dev/sdXX
使用前面复制的值。 可能还需要安装 resize2fs:apt install resize2fs
备注:通常情况下,不要使用 Windows 工具或编辑器来修改、移动或访问 AppData 文件夹中与 WSL 相关的文件。这样做可能会导致 Linux 分发版损坏。
2. 快速入门
2.1 适用于 Linux 的 Windows 子系统安装指南 (Windows 10)
2.1.1 安装适用于 Linux 的 Windows 子系统
必须先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发版。
以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
若要仅安装 WSL 1,现在应重启计算机并继续安装所选的 Linux 分发版,否则请等待重启并继续更新到 WSL 2。 阅读有关比较 WSL 2 和 WSL 1 的详细信息。
2.1.2 更新到 WSL 2
若要更新到 WSL 2,必须满足以下条件:
- 运行 Windows 10(已更新到版本 2004 的内部版本 19041 或更高版本)。
- 通过按 Windows 徽标键 + R,检查你的 Windows 版本,然后键入 winver,选择“确定”。(或者在 Windows 命令提示符下输入 ver 命令)。 如果内部版本低于 19041,请更新到最新的 Windows 版本。
2.1.3 启用“虚拟机平台”可选组件
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。
以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新启动计算机,以完成 WSL 安装并更新到 WSL 2。
2.1.4 将 WSL 2 设置为默认版本
安装新的 Linux 分发版时,请在 Powershell 中运行以下命令,以将 WSL 2 设置为默认版本:
wsl --set-default-version 2
备注:从 WSL 1 更新到 WSL 2 可能需要几分钟才能完成,具体取决于目标分发版的大小。
2.1.5 安装所选的 Linux 分发版
- 打开 Microsoft Store,并选择你偏好的 Linux 分发版。
2. 单击以下链接会打开每个分发版的 Microsoft Store 页面:
- Ubuntu 16.04 LTS
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
- openSUSE Leap 15.1
- SUSE Linux Enterprise Server 12 SP5
- SUSE Linux Enterprise Server 15 SP1
- Kali Linux
- Debian GNU/Linux
- Fedora Remix for WSL
- Pengwin
- Pengwin Enterprise
- Alpine WSL
- 在分发版的页面中,选择“获取”。
2.1.6 设置新分发版
首次启动新安装的 Linux 分发版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。 未来的所有启动时间应不到一秒。
然后,需要为新的 Linux 分发版创建用户帐户和密码。
2.1.7 将分发版版本设置为 WSL 1 或 WSL 2
可以打开 PowerShell 命令行并输入以下命令(仅在 Windows 内部版本 19041 或更高版本中可用),来检查分配给每个已安装的 Linux 分发版的 WSL 版本:wsl -l -v
wsl --list --verbose
若要将分发版设置为受某一 WSL 版本支持,请运行:
wsl --set-version <distribution name> <versionNumber>
请确保将 <distribution name>
替换为你的分发版的实际名称,并将 <versionNumber>
替换为数字“1”或“2”。 可以随时更改回 WSL 1,方法是运行与上面相同的命令,但将“2”替换为“1”。
此外,如果要使 WSL 2 成为你的默认体系结构,可以通过此命令执行该操作:
wsl --set-default-version 2
这会将安装的任何新分发版的版本设置为 WSL 2。
2.1.8 排查安装问题
下面是相关的错误和建议的修复措施。 有关其他常见错误及其解决方法,请参阅 WSL 故障排除页。
- 安装失败并出现错误 0x80070003
- 适用于 Linux 的 Windows 子系统只能在系统驱动器(通常是 C: 驱动器)中运行。 请确保分发版存储在系统驱动器上:
- 打开“设置”->“存储”->“更多存储设置:
- WslRegisterDistribution 失败并出现错误 0x8007019e
- 未启用“适用于 Linux 的 Windows 子系统”可选组件:
- 打开“控制面板” -> “程序和功能” -> “打开或关闭 Windows 功能”->选中“适用于 Linux 的 Windows 子系统”,或使用本文开头所述的PowerShell cmdlet。
- 安装失败,出现错误 0x80070003 或错误 0x80370102
- 请确保在计算机的 BIOS 内已启用虚拟化。 有关如何执行此操作的说明因计算机而异,并且很可能在 CPU 相关选项下。
- 尝试升级时出错:
Invalid command line option: wsl --set-version Ubuntu 2
- 请确保已启用适用于 Linux 的 Windows 子系统,并且你使用的是 Windows 内部版本 19041 或更高版本。 若要启用 WSL,请在 Powershell 提示符下以具有管理员权限的身份运行此命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
。
- 请确保已启用适用于 Linux 的 Windows 子系统,并且你使用的是 Windows 内部版本 19041 或更高版本。 若要启用 WSL,请在 Powershell 提示符下以具有管理员权限的身份运行此命令:
- 由于虚拟磁盘系统的某个限制,无法完成所请求的操作。虚拟硬盘文件必须是解压缩的且未加密的,并且不能是稀疏的。
- 请检查 WSL Github 主题 #4103,其中跟踪了此问题以提供更新的信息。
- 无法将词语“wsl”识别为 cmdlet、函数、脚本文件或可运行程序的名称。
- 请确保已安装“适用于 Linux 的 Windows 子系统”可选组件。 此外,如果你使用的是 Arm64 设备,并从 PowerShell 运行此命令,则会收到此错误。 请改为从 PowerShell Core 或从命令提示符运行
wsl.exe
。
- 请确保已安装“适用于 Linux 的 Windows 子系统”可选组件。 此外,如果你使用的是 Arm64 设备,并从 PowerShell 运行此命令,则会收到此错误。 请改为从 PowerShell Core 或从命令提示符运行
2.2 Windows Server 安装指南
适用于 Linux 的 Windows 子系统可供在 Windows Server 2019(版本 1709)和更高版本上安装。 本指南将指导你完成在计算机上启用 WSL 的步骤。
2.2.1 启用适用于 Linux 的 Windows 子系统
必须启用“适用于 Linux 的 Windows 子系统”可选功能并重启,然后才能在 Windows 上运行 Linux 发行版。
以管理员身份打开 PowerShell 并运行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
如果你正在寻求 100% 的系统调用兼容性和更快的 IO 性能,请阅读下文以安装 WSL 2!
只有 Windows 10 版本 2004 的内部版本 19041 或更高版本中才提供 WSL 2。
如果要继续安装 WSL 1,请在系统提示时重新启动计算机,并访问此处此处安装
2.2.2 启用“虚拟机平台”可选组件
确保安装了“虚拟机平台”可选组件。 可以通过在 PowerShell 中运行以下命令来执行该操作:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
2.2.3 下载 Linux 分发版
按照这些说明下载你最喜爱的 Linux 发行版。
2.2.4 提取并安装 Linux 分发版
下载 Linux 分发版后,若要提取其内容并进行手动安装,请执行以下步骤:
- 使用 PowerShell 提取 .appx 包的内容:
Rename-Item .\Ubuntu.appx .\Ubuntu.zip
Expand-Archive .\Ubuntu.zip .\Ubuntu
- 在目标文件夹中运行分发版启动器应用程序。 启动器通常命名为
<distro>.exe
(例如,ubuntu.exe
)。
注意:安装失败并出现错误 0x8007007e:如果收到此错误,则表明系统不支持 WSL。 请确保运行的是 Windows 版本 16215或更高版本。 检查内部版本。 另外,请进行检查以确认 WSL 已启用,并且在启用此功能后重新启动了计算机。
- 使用 PowerShell 将你的分发版路径添加到 Windows 环境路径(在本例中为
C:\Users\Administrator\Ubuntu
):
$userenv = [System.Environment]::GetEnvironmentVariable("Path", "User")
[System.Environment]::SetEnvironmentVariable("PATH", $userenv + ";C:\Users\Administrator\Ubuntu", "User")
现在,可以通过键入 <distro>.exe
从任何路径启动你的分发版。 例如: ubuntu.exe
。
安装了分发版后,必须先初始化新的分发版实例,然后才能使用它。
2.3 为新的 Linux 分发版创建用户帐户和密码
启用 WSL 并从 Microsoft Store 中安装 Linux 分发版后,在打开新安装的 Linux 分发版时将会要求你完成的第一步是创建帐户,包括用户名和密码。
- 此用户名和密码特定于 Linux 分发版,与 Windows 用户名无关。
- 创建此用户名和密码后,该帐户将是分发版的默认用户,并将在启动时自动登录。
- 此帐户将被视为 Linux 管理员,能够运行 sudo (Super User Do) 管理命令。
- 在适用于 Linux 的 Windows 子系统上运行的每个 Linux 分发版都有其自身的 Linux 用户帐户和密码。 每当添加分发版、重新安装或重置时,都必须配置一个 Linux 用户帐户。
2.3.1 更新和升级包
大多数分发版随附了一个空的的包目录或最简单的包目录。 我们强烈建议定期更新包目录并使用分发版的首选包管理器升级已安装的包。 对于 Debian/Ubuntu,请使用 apt:
sudo apt update && sudo apt upgrade
Windows 不会自动更新或升级 Linux 分发版。 大多数 Linux 用户往往倾向于自行控制此任务。
2.3.2 重置 Linux 密码
若要更改密码,请打开 Linux 分发版(例如 Ubuntu)并输入以下命令:passwd
系统会要求你输入当前密码,然后要求输入新密码,之后再确认新密码。
2.3.3 忘记密码
如果忘记了 Linux 分发版的密码:
- 请打开 PowerShell,并使用以下命令进入默认 WSL 分发版的根目录:
wsl -u root
如果需要在非默认分发版中更新忘记的密码,请使用命令:
wsl -d Debian -u root
,并将Debian
替换为目标分发版的名称。
-
在 PowerShell 内的根级别打开 WSL 分发版后,可以使用此命令更新密码:
passwd
-
系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用以下命令在 PowerShell 内关闭 WSL:
exit
备注:如果运行的是早期版本的 Windows 操作系统,例如 1703(创意者更新)或 1709 (Fall Creators Update),请参阅此用户帐户更新文档的存档版本。