常规
什么是适用于 Linux 的 Windows 子系统 (WSL)?
适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 操作系统的一项功能,通过它可以直接在 Windows 上运行 Linux 文件系统以及 Linux 命令行工具和 GUI 应用,并可以运行传统的 Windows 桌面和应用。
请参阅“关于”页了解更多详细信息。
WSL 面向哪些用户?
这主要是一种面向开发人员的工具,尤其是 Web 开发人员,他们从事开源项目,或者部署到 Linux 服务器环境。 WSL 适用于喜欢使用 Bash、常用 Linux 工具 (sed
awk
、 等) 和 Linux 优先框架 (Ruby、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 面向开发人员受众,旨在用作内部开发流程的一部分。 假设何石要创建一个 CI/CD 管道(持续集成和持续交付),而且他想先在本地计算机(笔记本电脑)上测试它,然后再将它部署到云中。 何石可启用 WSL(和 WSL 2 来提高速度和性能),然后在本地(在笔记本电脑上)将正版 Linux Ubuntu 实例与所需的任何 Bash 命令和功能搭配使用。 在本地验证开发管道后,何石可将该 CI/CD 管道向上推送到云中(也就是 Azure 中),方法是将它放入 Docker 容器并将该容器推送到云实例,使其在生产就绪的 Ubuntu VM 上运行。
什么是 Bash?
Bash 是一个流行的基于文本的 shell,并且是一种命令语言。 它是 Ubuntu 和其他 Linux 发行版中包含的默认 shell。 用户在 shell 中键入命令,即可执行脚本和/或运行命令与工具来完成许多任务。
WSL 的工作原理是怎样的?
请查看 Windows 命令行博客上的这篇文章:深入探究 WSL 如何允许 Windows 访问 Linux 文件,其中详细介绍了基础技术。
在 VM 中为何要使用 WSL 而不是 Linux?
WSL 所需的资源(CPU、内存和存储)少于完整虚拟机所需的资源。 WSL 还允许结合 Windows 命令行、桌面和 Store 应用运行 Linux 命令行工具与应用,并允许从 Linux 内部访问 Windows 文件。 这样,你便可以根据需要针对相同的文件集使用 Windows 应用和 Linux 命令行工具。
举例而言,我为何要在 Linux(而不是 Windows)上使用 Ruby?
生成某些跨平台工具时,已假设其运行环境的行为类似于 Linux。 例如,某些工具假设它们能够访问很长的文件路径,或者特定的文件/文件夹存在。 这通常会在 Windows 上导致出现问题,因为 Windows 的行为通常与 Linux 不同。
许多语言(例如 Ruby 和 Node.js)通常已移植到 Windows,并且可以在 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:Why it’s awesome and what it means for PowerShell(为何它如此出色,它对 PowerShell 而言意味着什么)
WSL 支持哪些处理器?
WSL 支持 x64 和 Arm CPU。
如何访问我的 C: 驱动器?
系统会自动为本地计算机上的硬盘驱动器创建装入点,通过这些装入点可以轻松访问 Windows 文件系统。
/mnt/<drive letter>/
示例用法:运行 cd /mnt/c
访问 c:\
如何设置 Git 凭据管理器? (如何在 WSL 中使用我的 Windows Git 权限?)
请参阅开始在适用于 Linux 的 Windows 子系统上使用 Git 这一教程,其中有一个关于设置 Git 凭据管理器和在 Windows 凭据管理器中存储身份验证令牌的部分。
如何在 Linux 应用中使用 Windows 文件?
WSL 的优势之一是可以通过 Windows 和 Linux 应用或工具访问文件。
WSL 将计算机的固定驱动器装载到 Linux 分发版中的 /mnt/<drive>
文件夹下。 例如,你的 C:
驱动器装载在 /mnt/c/
下
例如,使用装载的驱动器,可以使用 Visual Studio 或 VS Code 编辑 C:\dev\myproj\
中的代码,并通过 /mnt/c/dev/myproj
访问相同的文件,在 Linux 中生成/测试该代码。
有关详细信息,请参阅跨 Windows 和 Linux 文件系统工作一文。
Linux 驱动器中的文件是否不同于装载的 Windows 驱动器中的文件?
Linux 根目录(即
/
)下的文件由符合 Linux 行为的 WSL 控制,控制的内容和操作包括但不限于:- 包含无效 Windows 文件名字符的文件
- 为非管理员用户创建的符号链接
- 通过 chmod 和 chown 更改文件属性
- 文件/文件夹的区分大小写状态
装载的驱动器中的文件由 Windows 控制,并具有以下行为:
- 支持区分大小写
- 设置的所有权限可以最好地反映 Windows 权限
如何卸载 WSL 分发版?
要从 WSL 中删除一个发行版并删除与该 Linux 发行版相关的所有数据,请运行 wsl --unregister <distroName>
,其中 <distroName>
是你的 Linux 发行版的名称,可从 wsl -l
命令的列表中查看发行版的名称。
此外,可以像卸载任何其他应用商店应用程序一样,在计算机上卸载 Linux 发行版应用。
若要详细了解 wsl 命令,请参阅 WSL 的基本命令一文。
如何运行 OpenSSH 服务器?
OpenSSH 作为可选功能随 Windows 一起提供。 请参阅安装 OpenSSH 文档。在 WSL 中运行 OpenSSH 需要拥有 Windows 中的管理员特权。 若要运行 OpenSSH 服务器,请以管理员身份运行 WSL 发行版(如 Ubuntu)或 Windows 终端。 有几个资源涵盖了使用 WSL 的 SSH 场景。 请查看 Scott Hanselman 的博客文章:如何从 Linux 或 Windows 或任何位置通过 SSH 连接到 Windows 10 计算机,如何从外部计算机通过 SSH 连接到 Windows 10 上的 WSL2,从外部机器通过 SSH 连接到 Windows 10 上的 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 访问的问题。 报告的防火墙包括:
- Kaspersky
- AVG
- Avast
- Symantec Endpoint Protection
- F-Secure
在某些情况下,关闭防火墙即可进行访问。 在某些情况下,只需让安装的防火墙在表面上阻止访问。
如何从 Windows 中的 WSL 访问某个端口?
WSL 共享 Windows 的 IP 地址,因为它在 Windows 上运行。 因此,你可以访问 localhost 上的任何端口。例如,如果你在端口 1234 上提供 Web 内容,可以在 Windows 浏览器中输入 https://localhost:1234 。 有关详细信息,请参阅访问网络应用程序。
如何备份我的 WSL 发行版,或者如何将它们从一个驱动器移到另一个驱动器?
Windows 版本 1809 和更高版本中提供了备份或移动发行版的最佳方式:执行 export/import 命令。 可以使用 wsl --export
命令将整个分发版导出到 tarball。 然后,可以使用 wsl --import
命令(该命令可以指定一个新的驱动器位置,以用于导入)将此发行版导入回 WSL,从而可以备份和保存 WSL 发行版的状态或者移动 WSL 发行版。
请注意,用于备份 AppData 文件夹中的文件的传统备份服务(例如 Windows 备份)不会损坏 Linux 文件。
是否可以将 WSL 用于生产方案?
WSL 经过设计和构建,可与内部循环开发工作流配合使用。 WSL 中的一些设计功能使它非常适合用于此目的,但与其他产品相比,它可能会使其在生产相关方案中具有挑战性。 我们的目标是明确 WSL 与常规 VM 环境的不同之处,以便你可以决定它是否符合业务需求。
WSL 与传统生产环境之间的main差异如下:
- 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/dxg
设备进行,该设备将 GPU 呼叫路由到 Windows GPU。 此设置不同于传统的 Linux 设置。 - 与裸机 Linux 相比,还有其他较小的差异,随着内部循环开发工作流的优先顺序,预计将来会出现更多差异。
如何将 WSL 文件从一台计算机传输到另一台计算机?
有几种方法可以完成此任务:
- 最简单的方法是使用
wsl --export --vhd
命令将 WSL 分发导出到 VHD 文件。 然后,可以将此文件复制到另一台计算机,并使用wsl --import --vhd
导入它。 有关详细信息,请参阅 命令文档 。 - 上述实现需要大量磁盘空间。 如果磁盘空间不足,可以使用 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 2
WSL 2 是否使用 Hyper-V? 它在 Windows 10 家庭版 和 Windows 11 家庭版 上是否可用?
WSL 2 可用于提供 WSL 的所有桌面 SKU,包括Windows 10 家庭版和Windows 11 家庭版。
最新版本的 WSL 使用 Hyper-V 体系结构来实现其虚拟化。 此体系结构将在“虚拟机平台”可选组件中提供。 此可选组件在所有 SKU 上都将可用。 当我们更深入地了解 WSL 2 版本时,可以看到有关此体验的更多详细信息。
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 问题讨论。
我们一直在开发解决方案以支持 Hyper-V 的第三方集成。 例如,我们向第三方虚拟化提供商公开了一组称为虚拟机监控程序平台的 API,可以用来使其软件与 Hyper-V 兼容。 这使得应用程序可以将 Hyper-V 体系结构用于其模拟,例如,现在都与 Hyper-V 兼容的 Google 安卓模拟器和 VirtualBox 6 及更高版本。
有关 VirtualBox 6.1 的 WSL 2 问题的更多背景和讨论,请参阅 WSL 问题存储库。
*如果要查找 Windows 虚拟机,可在 Windows 开发人员中心下载 VMWare、Hyper-V、VirtualBox 和 Parallels VM。
是否可以在 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 分发版的 IP 地址与 windows OS) (主机地址不同。 有关详细信息,请参阅 使用 WSL 访问网络应用程序。
是否可以在虚拟机中运行 WSL 2?
可以! 你需要确保虚拟机已启用嵌套虚拟化。 可以在父 Hyper-V 主机中在 PowerShell 窗口中使用管理员权限运行以下命令来启用此功能:
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
请确保将“<VMName>”替换为你的虚拟机的名称。
是否可以在 WSL 2 中使用 wsl.conf?
WSL 2 支持 WSL 1 使用的同一 WSL 文件。 这意味着,你在 WSL 1 发行版中设置的任何配置选项(例如自动装载 Windows 驱动器、启用或禁用互操作、更改将装载 Windows 驱动器的目录等)在 WSL 2 中都可以工作。 还可以在发行版管理页面中详细了解 WSL 中的配置选项。 若要详细了解对装载驱动器、磁盘、设备或虚拟硬盘 (VHD) 的支持,请参阅在 WSL 2 中装载 Linux 磁盘一文。
可以在何处提供反馈?
借助 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 新闻,可以访问:
- 我们的命令行团队博客
- Twitter。 请在 Twitter 上关注 @craigaloewen 来了解最新资讯、更新等。