概况
什么是适用于 Linux 的 Windows 子系统(WSL)?
适用于 Linux 的 Windows 子系统(WSL)是 Windows作系统的一项功能,可用于运行 Linux 文件系统,以及直接在 Windows 上的 Linux 命令行工具和 GUI 应用,以及传统的 Windows 桌面和应用。
有关更多详细信息,请参阅 “关于”页 。
谁是 WSL?
这主要是面向开发人员的工具,尤其是 Web 开发人员、那些处理开源项目或部署到 Linux 服务器环境的工具。 WSL 适用于喜欢使用 Bash、常用 Linux 工具(等)和 Linux 优先框架(sedawkRuby、Python 等)的任何人,但也喜欢使用 Windows 生产力工具。
可以使用 WSL 做什么?
使用 WSL,可以使用所选分发版(Ubuntu、Debian、OpenSUSE、Kali、Alpine 等)在 Bash shell 中运行 Linux。 使用 Bash,可以运行命令行 Linux 工具和应用。 例如,键入 lsb_release -a 并按 Enter;你将看到当前正在运行的 Linux 发行版的详细信息:
还可以从 Linux Bash shell 内部访问本地计算机的文件系统 - 可以在文件夹下找到装载的 /mnt 本地驱动器。 例如,驱动器 C: 装载在 /mnt/c:
是否可以描述包含 WSL 的典型开发工作流?
WSL 面向开发人员受众,目的是用作内部开发循环的一部分。 假设 Sam 正在创建 CI/CD 管道(持续集成和持续交付),并希望先在本地计算机(笔记本电脑)上对其进行测试,然后再将其部署到云。 Sam 可以启用 WSL (& WSL 2 以提高速度和性能),然后在本地(在笔记本电脑上)使用真正的 Linux Ubuntu 实例,以及他们喜欢的任何 Bash 命令和工具。 在本地验证开发管道后,Sam 可以将该 CI/CD 管道推送到云(即 Azure),方法是将其推送到 Docker 容器,并将容器推送到在生产就绪的 Ubuntu VM 上运行的云实例。
什么是 Bash?
Bash 是基于文本的常用 shell 和命令语言。 它是 Ubuntu 和其他 Linux 发行版中包含的默认 shell。 用户将命令键入 shell 以执行脚本和/或运行命令和工具来完成许多任务。
这是如何运作的?
请查看 Windows 命令行博客上的本文: 深入了解 WSL 如何允许 Windows 访问有关基础技术的 Linux 文件 。
为什么在 VM 中使用 WSL 而不是 Linux?
WSL 所需的资源(CPU、内存和存储)比完整虚拟机少。 WSL 还允许你与 Windows 命令行、桌面和应用商店应用一起运行 Linux 命令行工具和应用,以及从 Linux 内部访问 Windows 文件。 这使你可以在同一组文件上使用 Windows 应用和 Linux 命令行工具(如果需要)。
为什么使用 Ruby on Linux 而不是 Windows?
假设运行它们的环境类似于 Linux,则生成了一些跨平台工具。 例如,某些工具假定它们能够访问很长的文件路径或存在特定文件/文件夹。 这通常会导致 Windows 上的行为与 Linux 不同。
许多语言(如 Ruby 和 Node.js)通常移植到 Windows 上并运行出色。 但是,并非所有 Ruby Gem 或 node/NPM 库所有者都移植其库以支持 Windows,并且许多库具有特定于 Linux 的依赖项。 这通常会导致使用此类工具和库生成的系统,并且有时在 Windows 上出现运行时错误或不需要的行为。
这只是一些问题,导致许多人要求Microsoft改进 Windows 的命令行工具,以及是什么促使我们与 Canonical 合作,使本机 Bash 和 Linux 命令行工具能够在 Windows 上运行。
这对 PowerShell 意味着什么?
使用 OSS 项目时,有许多场景,从 PowerShell 提示符进入 Bash 非常有用。 Bash 支持是互补的,增强了 Windows 上命令行的价值,使 PowerShell 和 PowerShell 社区能够利用其他常用技术。
在 PowerShell 团队博客上阅读详细信息 - Bash for Windows:为什么它很棒,以及 PowerShell 的含义
WSL 支持哪些处理器?
WSL 支持 x64 和 Arm64 CPU。
如何访问 C: 驱动器?
本地计算机上的硬盘驱动器的装入点会自动创建,并提供对 Windows 文件系统的轻松访问。
/mnt/<drive letter>/
示例用法是 cd /mnt/c 访问 c:\
如何设置 Git 凭据管理器? (如何在 WSL 中使用 Windows Git 权限?)
请参阅教程 :开始在适用于 Linux 的 Windows 子系统上使用 Git,其中包含有关在 Windows 凭据管理器中设置 Git 凭据管理器和存储身份验证令牌的部分。
如何将 Windows 文件与 Linux 应用配合使用?
WSL 的优势之一是通过 Windows 和 Linux 应用或工具访问文件。
WSL 将计算机的固定驱动器装载到 Linux 发行版中的文件夹下 /mnt/<drive> 。 例如,驱动器 C: 装载在 /mnt/c/.
使用装载的驱动器,可以通过通过/mnt/c/dev/myproj访问相同的文件来编辑代码,例如C:\dev\myproj\,使用 Visual Studio 或 VS Code 编辑代码,并在 Linux 中生成/测试代码。
详细了解 如何跨 Windows 和 Linux 文件系统 工作文章。
Linux 驱动器中的文件是否不同于装载的 Windows 驱动器?
Linux 根下的文件(即
/)由 WSL 控制,与 Linux 行为保持一致,包括但不限于:- 包含无效 Windows 文件名字符的文件
- 为非管理员用户创建的符号链接
- 通过
chmod和更改文件属性chown - 文件/文件夹区分大小写
装载驱动器中的文件由 Windows 控制,并具有以下行为:
- 支持区分大小写
- 所有权限都设置为最能反映 Windows 权限
如何卸载 WSL 分发版?
若要从 WSL 中删除分发版并 删除与该 Linux 分发版关联的所有数据,请运行 wsl --unregister <Distro><Distro> Linux 发行版的名称,该发行版可从命令中的 wsl -l 列表中查看。
此外,还可以像任何其他应用商店应用程序一样卸载计算机上的 Linux 发行版应用。
若要了解有关 wsl 命令的详细信息,请参阅文章: WSL 的基本命令。
如何运行 OpenSSH 服务器?
OpenSSH 附带 Windows 作为可选功能。 请参阅 安装 OpenSSH 文档。在 Windows 中,需要管理员权限才能在 WSL 中运行 OpenSSH。 若要运行 OpenSSH 服务器,请以管理员身份运行 WSL 分发(即 Ubuntu)或 Windows 终端。 有几种资源涵盖 WSL 的 SSH 方案。 查看 Scott Hanselman 的博客文章: 如何从 Linux 或 Windows OR 随处通过 SSH 连接到 Windows 10 计算机, 如何从外部计算机通过 SSH 连接到 Windows 10 上的 WSL2,以及如何从外部计算机通过 WINDOWS 10 通过 SSH 连接到 Bash 和 WSL2, 以及如何使用 Windows 10 的内置 OpenSSH 自动通过 SSH 连接到远程 Linux 计算机。
如何更改 WSL 的显示语言?
WSL 安装将尝试自动更改 Ubuntu 区域设置以匹配 Windows 安装的区域设置。 如果不希望此行为,可以在安装完成后运行此命令来更改 Ubuntu 区域设置。 必须重新启动 WSL 分发才能使此更改生效。
以下示例将区域设置更改为 en-US:
sudo update-locale LANG=en_US.UTF8
为什么我没有来自 WSL 的 Internet 访问?
某些用户报告了特定防火墙应用程序阻止 WSL 中的 Internet 访问的问题。 报告的防火墙包括:
- 卡巴斯基
- AVG
- Avast
- Symantec Endpoint Protection
- F-Secure
在某些情况下,关闭防火墙允许访问。 在某些情况下,只需安装防火墙即可阻止访问。
如何从 Windows 中的 WSL 访问端口?
WSL 共享 Windows 的 IP 地址,因为它在 Windows 上运行。 因此,可以在 localhost 上访问任何端口,例如,如果端口 1234 上有 Web 内容,则可以 https://localhost:1234 进入 Windows 浏览器。 有关详细信息,请参阅 访问网络应用程序。
如何备份 WSL 分发版?
备份或移动分发版的最佳方式是通过 Windows 版本 1809 及更高版本中提供的 导出/导入 命令。 可以使用命令将整个分发导出到 tarball wsl --export 。 然后,可以使用命令将此分发重新导入到 WSL wsl --import 中,该命令可以命名导入的新驱动器位置,从而允许备份和保存 WSL 分发版(或移动)状态。 若要了解有关移动 WSL 分发版的详细信息,请参阅如何将 WSL 文件从一台计算机传输到另一台计算机?
在 AppData 文件夹中备份文件(如 Windows 备份)的传统备份服务不会损坏 Linux 文件。
是否可以将 WSL 用于生产方案?
是的,但是 WSL 已设计并构建为与内部循环开发工作流一起使用。 WSL 中有一些设计功能,使其非常适合此目的,但与其他产品相比,它可能会使生产相关方案具有挑战性。 我们的目标是明确 WSL 与常规 VM 环境的不同之处,以便你可以就它是否符合业务需求做出决定。
WSL 与传统生产环境之间的主要区别包括:
- WSL 具有一个轻型实用工具 VM,可自动启动、停止和管理资源。
- 如果 Windows 进程没有打开的文件句柄,WSL VM 将自动关闭。 这意味着,如果将它用作 Web 服务器,请通过 SSH 连接到它以运行服务器,然后退出,VM 可能会关闭,因为它正在检测用户已完成使用它,并清理其资源。
- WSL 用户对其 Linux 实例具有完全访问权限。 VM 的生存期、已注册的 WSL 分发版等都可以由用户访问,可由用户修改。
- WSL 自动授予文件对 Windows 文件的访问权限。
- 默认情况下,Windows 路径会追加到路径中,这可能会导致某些 Linux 应用程序与传统 Linux 环境相比出现意外行为。
- WSL 可以从 Linux 运行 Windows 可执行文件,这也可能导致不同于传统 Linux VM 的环境。
- WSL 使用的 Linux 内核会自动更新。
- WSL 中的 GPU 访问通过将
/dev/dxgGPU 调用路由到 Windows GPU 的设备进行。 此设置不同于传统的 Linux 设置。 - 与裸机 Linux 相比,还有其他较小的差异,预计将来会出现更多的差异,因为内部循环开发工作流是优先顺序的。
如何将 WSL 文件从一台计算机传输到另一台计算机?
可通过几种方法完成此任务:
- 最简单的方法是使用
wsl --export <Distro> <FileName> --format vhd命令将 WSL 分发版导出到 VHD 文件。 然后,可以将此文件复制到另一台计算机,并使用它导入它wsl --import <Distro> <InstallLocation> <FileName> --vhd。 有关详细信息,请参阅 WSL 基本命令文档中的导入和导出命令。 - 上述实现需要大量的磁盘空间。 如果没有大量磁盘空间,则可以使用 Linux 技术将文件移出:
- 用于
tar -czf <tarballName> <directory>创建文件的 tarball。 然后,可以将这些特定文件复制到新计算机,然后运行tar -xzf <tarballName>以提取它们。 - 还可以使用
apt如下所示的命令导出已安装的包列表:dpkg --get-selections | grep -v deinstall | awk '{print $1}' > package_list.txt然后使用命令在另一台计算机上重新安装这些相同包,例如sudo apt install -y $(cat package_list.txt)在传输文件之后。
- 用于
如何将 WSL 分发版移动到其他驱动器或位置?
可以使用 PowerShell 执行此作。 下面是每个步骤的必要命令和说明。 请打开 PowerShell 窗口并调整标记之间的 <> 值以适应特定的用例:
# Export your distro to that folder as a VHD
wsl --export <Distro, e.g: Ubuntu> <FileName, e.g: D:\WSLDistros\Ubuntu\ext4.vhdx> --format vhd
# Unregister your old distro
# Please note this will erase your existing distro's file contents, please ensure the backup file you created in the 2nd step is present at the location and that the export operation completed successfully.
# Please exercise caution when using this command, as it is destructive and could cause data loss.
wsl --unregister <Distro, e.g: Ubuntu>
# Import your VHD backup
wsl --import-in-place <Distro, e.g: Ubuntu> <FileName, e.g: D:\WSLDistros\Ubuntu\ext4.vhdx>
如何设置默认用户帐户
可以通过设置wsl.conf值user.default=<name>来设置默认用户帐户
WSL 2
WSL 2 在 Windows 10 家庭版和 Windows 11 家庭版上是否可用?
是的。 WSL 2 在 WSL 可用的所有桌面 SKU 上可用,包括 Windows 10 家庭版和 Windows 11 家庭版。
具体而言,WSL2 需要启用两个功能:
- “虚拟机平台”(Hyper-V子集)
- “适用于 Linux 的 Windows 子系统”
WSL 2 是否使用 Hyper-V?
最新版本的 WSL 使用一 部分 Hyper-V 体系结构来实现其虚拟化。 此子集作为名为“虚拟机平台”的可选组件提供,可在所有桌面 SKU 上使用。
WSL 1 会发生什么情况? 会放弃吗?
我们目前没有计划弃用 WSL 1。 可以并行运行 WSL 1 和 WSL 2 发行版,并且可以随时升级和降级任何发行版。 将 WSL 2 添加为新体系结构为 WSL 团队提供了更好的平台,以提供使 WSL 成为在 Windows 中运行 Linux 环境的绝佳方法的功能。
能否运行 WSL 2 和其他第三方虚拟化工具,例如 VMware 或 VirtualBox?
在使用 Hyper-V 时,某些第三方应用程序无法正常工作,这意味着当启用了 WSL 2(如 VMware 和 VirtualBox)时,它们将无法运行。 但是,最近,VirtualBox 和 VMware 都发布了支持 Hyper-V 和 WSL2 的版本。 在此处详细了解 VirtualBox 的更改,以及此处的 VMware 更改。 若要排查问题,请查看 GitHub 上的 WSL 存储库中的 VirtualBox 问题讨论。 StackOverflow 还提供了一个有用的提示: 如何同时使 VirtualBox 6.0 和 WSL 正常工作。
我们一贯致力于支持 Hyper-V 的第三方集成的解决方案。 例如,我们公开了一组称为 虚拟机监控程序平台 的 API,第三方虚拟化提供程序可以使用这些 API 使其软件与 Hyper-V 兼容。 这使应用程序可以使用 Hyper-V 体系结构进行仿真,例如 Google Android Emulator 和 VirtualBox 6 及更高版本,它们现在都与 Hyper-V 兼容。
有关 VirtualBox 6.1 的 WSL 2 问题的详细信息和讨论,请参阅 WSL 问题存储库。
*如果要查找 Windows 虚拟机、VMWare、Hyper-V、VirtualBox 和 Parallels VM 下载,可在 Windows 开发人员中心获取。
是否可以在 WSL 2 中访问 GPU? 是否有计划增加硬件支持?
我们发布了在 WSL 2 分发版中访问 GPU 的支持! 这意味着,在涉及大数据集时,现在可以更轻松地将 WSL 用于机器学习、人工智能和数据科学方案。 查看 GPU 支持教程入门 。 截至目前,WSL 2 不包括串行支持或 USB 设备支持。 我们正在调查添加这些功能的最佳方式。 但是,USB 支持现已通过 USBIPD-WIN 项目提供。 有关设置 USB 设备支持的步骤,请参阅 “连接 USB 设备”。
WSL 2 是否可以使用网络应用程序?
是的,在一般网络应用程序中,WSL 2 的运行效果更好且速度更快,因为它提供完整的系统调用兼容性。 但是,WSL 2 体系结构使用虚拟化网络组件,这意味着 WSL 2 的行为类似于虚拟机 -- WSL 2 分发版将具有不同于主机(Windows OS)的 IP 地址。 有关详细信息,请参阅 使用 WSL 访问网络应用程序。
是否可以在虚拟机中运行 WSL 2?
是的! 需要确保虚拟机已启用嵌套虚拟化。 可以通过在具有管理员权限的 PowerShell 窗口中运行以下命令,在父 Hyper-V 主机中启用此功能:
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
请确保将“VMName>”<替换为虚拟机的名称。
是否可以在 WSL 2 中使用 wsl.conf?
WSL 2 支持 WSL 1 使用的相同 wsl.conf 文件。 这意味着你在 WSL 1 发行版中设置的任何配置选项(例如自动装载 Windows 驱动器、启用或禁用互作、更改将装载 Windows 驱动器的目录等)都将在 WSL 2 内部工作。 可以在 “分发管理 ”页中详细了解 WSL 中的配置选项。 有关在 WSL 2 中装载 Linux 磁盘 中装载驱动器、磁盘、设备或虚拟硬盘(VHD)的支持的详细信息。
1:VirtualBox 6.0 2 的更改日志:Hyper-V API3:Hyper-V Android 模拟器支持4:VMware 工作站技术预览版 20H1 — Hyper-V/主机 VBS 支持
我可以在哪里提供反馈?
WSL 产品仓库问题可以让你:
- 搜索现有问题 ,查看是否存在与你存在的问题相关的问题。 请注意,在搜索栏中,可以删除“is:open”以包括已在搜索中解决的问题。 请考虑对任何未解决的问题进行评论或点赞,表达你希望将其作为优先事项推动的兴趣。
-
提交新问题。 如果发现 WSL 存在问题且不存在现有问题,则可以选择绿色 的“新建问题 ”按钮,然后选择 “WSL - Bug 报告”。 你将需要包含问题的标题、Windows 内部版本号(运行
cmd.exe /c ver以查看当前内部版本号)、你是运行 WSL 1 还是 2、当前 Linux 内核版本号(运行wsl.exe --status或cat /proc/version)、你使用的发行版版本号(运行lsb_release -r)、涉及的任何其他软件版本、复现步骤、预期行为、实际行为,以及诊断日志(如果可用且适用)。 有关详细信息,请参阅 参与 WSL。 - 选择绿色的“新建问题”按钮,然后选择“功能请求”来提交功能请求。 你需要回答几个描述您请求的问题。
您还可以:
- 使用 WSL 文档存储库提交文档问题。 若要参与 WSL 文档,请参阅 Microsoft Docs 参与者指南。
- 如果你的问题与 Windows 终端、Windows 控制台或命令行 UI 相关,请使用 Windows 终端产品存储库提交 Windows 终端问题。
如果想要随时了解最新的 WSL 新闻,可以执行以下作:
- 命令行团队博客
- X. 请按照 X 上的@craigaloewen 了解新闻、更新等信息。
如何解决“错误:0x800704ec组策略阻止了此程序。 有关详细信息,请与系统管理员联系。'?
此错误是由阻止 WSL 的组策略引起的。 若要解决此问题,请先运行命令 wsl --update 以更新到最新的应用商店版本。 如果这无法解决问题,请与管理员联系。 详细了解收件箱 WSL 与 WSL 的应用商店版本之间的差异: Microsoft 应用商店中的 WSL。
LxssManager 是否被 WSLService 取代?
是的,当 WSL 从收件箱组件转换到由 Microsoft 应用商店提供服务时,LxssManager 已替换为 WSLService。