Windows10专业版WSL环境搭建
一、官网解读
二、概述
2.1 什么是WSL
适用于 Linux 的 Windows 子系统可让开发人员直接在 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 应用程序。
2.2 WSL 1和WSL 2
WSL 2 使用最新、最强大的虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核。 但是,WSL 2 不是传统的 VM 体验。
逃离Hyper-V
2.2.1 比较功能
功能 | WSL 1 | WSL 2 |
---|---|---|
Windows 和 Linux 之间的集成 | ✅ | ✅ |
启动时间短 | ✅ | ✅ |
与传统虚拟机相比,占用的资源量少 | ✅ | ✅ |
可以与当前版本的 VMware 和 VirtualBox 一起运行 | ✅ | ✅ |
托管 VM | ❌ | ✅ |
完整的 Linux 内核 | ❌ | ✅ |
完全的系统调用兼容性 | ❌ | ✅ |
跨 OS 文件系统的性能 | ✅ | ❌ |
从上述比较表中可以看出,除了跨操作系统文件系统的性能外,WSL 2 体系结构在多个方面都比 WSL 1 更具优势。
2.2.2 跨 OS 文件系统的性能
建议不要跨操作系统使用文件,除非有这么做的特定原因。 若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,前提是在 Linux 命令行(Ubuntu、OpenSUSE 等)中工作。 如果使用 Windows 命令行(PowerShell、命令提示符)工作,请将文件存储在 Windows 文件系统中。
例如,在存储 WSL 项目文件时:
- 使用 Linux 文件系统根目录:
\\wsl$\Ubuntu-18.04\home\<user name>\Project
- 而不使用 Windows 文件系统根目录:
C:\Users\<user name>\Project
所有当前正在运行的分发 (wsl -l
) 均可通过网络连接进行访问。 为此,请运行命令 [WIN+R](键盘快捷方式)或在文件资源管理器地址栏中键入 \\wsl$
,以查找相应的分发名称并访问其根文件系统。
还可以在 WSL 的 Linux 终端中使用 Windows 命令。 尝试打开 Linux 分发版(即 Ubuntu),通过输入以下命令确保你位于 Linux 主目录中:cd ~
。 然后通过输入 powershell.exe /c start .
(不要忘记尾部的句点),在文件资源管理器中打开 Linux 文件系统。
如果遇到错误“-bash: powershell.exe: 找不到命令”,请参阅 WSL 故障排除页面予以解决。
WSL 2 仅适用于 Windows 10 版本 1903、内部版本 18362 或更高版本。 通过按 Windows 徽标键 + R,检查你的 Windows 版本,然后键入 winver,选择“确定”。 (或者在 Windows 命令提示符下输入 ver
命令)。 你可能需要更新到最新的 Windows 版本。 低于 18362 的版本根本不支持 WSL。
WSL 2 适用于 VMware 15.5.5+ 和 VirtualBox 6+。 通过我们的 WSL 2 常见问题解答了解详细信息。
2.2.3 WSL 2 中的新增功能
WSL 2 是对基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。 此更新的主要目标是提高文件系统性能和添加完全的系统调用兼容性。
2.2.3.1 WSL 2 体系结构
传统的 VM 体验可能启动速度慢,是独立的,消耗大量资源,需要你花费时间进行管理。 WSL 2 没有这些属性。
WSL 2 有 WSL 1 的优点,包括 Windows 和 Linux 之间的无缝集成,启动时间短,资源占用量少,并且无需 VM 配置或管理。 虽然 WSL 2 确实使用 VM,但 VM 是在幕后管理和运行的,因此你将具有与 WSL 1 相同的用户体验。
2.2.3.2 完整的 Linux 内核
WSL 2 中的 Linux 内核是 Microsoft 根据最新的稳定版分支(基于 kernel.org 上提供的源代码)构建的。此内核已专门针对 WSL 2 进行了调整,针对大小和性能进行了优化,以便在 Windows 上提供良好的 Linux 体验。 内核将由 Windows 更新提供服务,这意味着你将获得最新的安全修补程序和内核改进功能,而无需自行管理它。
WSL 2 Linux 内核是开源的。 如果你想要了解详细信息,请查看由构建该内核的团队撰写的博客文章随 Windows 一起提供 Linux 内核。
2.2.3.3 提升了文件 IO 性能
如果使用 WSL 2,文件密集型操作(如 git 克隆、npm 安装、apt 更新、apt 升级等)的速度都明显更快。
实际的速度提升将取决于你运行的应用以及它与文件系统的交互方式。 在对压缩的 tarball 进行解包时,WSL 2 的初始版本的运行速度比 WSL 1 快达 20 倍,在各种项目上使用 git 克隆、npm 安装和 cmake 时,大约快 2-5 倍。
2.2.3.4 完全的系统调用兼容性
Linux 二进制文件使用系统调用来执行访问文件、请求内存、创建进程等功能。 虽然 WSL 1 使用的是由 WSL 团队构建的转换层,但 WSL 2 包括了自己的 Linux 内核,具有完全的系统调用兼容性。 优点包括:
- 可以在 WSL 内部运行的一组全新应用,例如 Docker 等。
- 对 Linux 内核的任何更新都立即可供使用。 (无需等待 WSL 团队实现更新并添加更改)。
2.2.4 例外情况(使用 WSL 1 而不是 WSL 2)
我们建议使用 WSL 2,因为它提供更快的性能和100% 的系统调用兼容性。 但是,在某些特定情况下,你可能会更倾向于使用 WSL 1。 在以下情况下,请考虑使用 WSL 1:
- 你的项目文件必须存储在 Windows 文件系统中。 WSL 1 可以更快地访问从 Windows 装载的文件。
- 如果你将使用 WSL Linux 分发版来访问 Windows 文件系统上的项目文件,并且这些文件无法存储在 Linux 文件系统上,那么,通过使用 WSL 1,你将跨 OS 文件系统实现更快的性能。
- 一个项目要求对相同的文件使用 Windows 和 Linux 工具进行交叉编译。
- 在 WSL 1 中,跨 Windows 和 Linux 操作系统的文件性能比 WSL 2 中更快,因此如果要使用 Windows 应用程序来访问 Linux 文件,则目前通过 WSL 1 可实现更快的性能。
- 你的项目需要访问串行端口或 USB 设备。
- 根据 WSL 2 常见问题解答,WSL 2 不支持访问串行端口。 The 待解决的串行支持问题指出尚未添加该支持。
- 有严格的内存要求
- WSL 2 的内存使用量会随使用而缩放。 当进程释放内存时,这会自动返回到 Windows。 但从现在开始,在关闭 WSL 实例前,WSL 2 还不会将内存中缓存的页面释放回 Windows。 如果你有长时间运行的 WSL 会话或访问非常大量的文件,此缓存可能会耗尽 Windows 内存。 我们通过 WSL Github 存储库问题 4166 跟踪工作以改善此体验
请考虑尝试 VS Code 远程 WSL 扩展,以便使你不仅能够使用 Linux 命令行工具将项目文件存储在 Linux 文件系统上,而且还可以使用 Windows 上的 VS Code 在 Internet 浏览器中创作、编辑、调试或运行项目,而不会造成任何与跨 Linux 和 Windows 文件系统工作相关联的性能下降。 了解详细信息
2.2.5 访问网络应用程序
2.2.5.1 从 Windows (localhost) 访问 Linux 网络应用
如果要在 Linux 分发版中构建网络应用(例如,在 NodeJS 或 SQL server 上运行的应用),可以使用 localhost
从 Windows 应用(如 Microsoft Edge 或 Chrome Internet 浏览器)访问它(就像往常一样)。
但是,如果运行的是较旧版本的 Windows(版本 18945 或更低版本),则需要获取 Linux 主机 VM 的 IP 地址(或更新到最新的 Windows 版本)。
若要查找为 Linux 分发版提供支持的虚拟机的 IP 地址,请执行以下操作:
- 在 WSL 分发版(即 Ubuntu)中运行以下命令:
ip addr
- 查找并复制
eth0
接口的inet
值下的地址。 - 如果已安装 grep 工具,请通过使用以下命令筛选输出来更轻松地查找此地址:
ip addr | grep eth0
- 使用此 IP 地址连接到 Linux 服务器。
下图显示了一个示例,该示例使用 Microsoft Edge 浏览器连接到 Node.js 服务器。
2.2.5.2 从 Linux(主机 IP)访问 Windows 网络应用
如果要从 Linux 分发版(即 Ubuntu)访问 Windows 上运行的网络应用(例如,在 NodeJS 或 SQL 服务器上运行的应用),则需要使用主机的 IP 地址。 虽然这不是一种常见方案,但你可以执行以下步骤来使其可行。
- 通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:
cat /etc/resolv.conf
- 复制以下词语后面的 IP 地址:
nameserver
。 - 使用复制的 IP 地址连接到任何 Windows 服务器。
下图显示了一个示例,该示例说明如何通过 curl 连接到在 Windows 中运行的 Node.js 服务器。
2.2.6 其他网络注意事项
2.2.6.1 通过远程 IP 地址进行连接
当使用远程 IP 地址连接到应用程序时,它们将被视为来自局域网 (LAN) 的连接。 这意味着你需要确保你的应用程序可以接受 LAN 连接。
例如,你可能需要将应用程序绑定到 0.0.0.0
而非 127.0.0.1
。 以使用 Flask 的 Python 应用为例,可以通过以下命令执行此操作:app.run(host='0.0.0.0')
。 进行这些更改时请注意安全性,因为这将允许来自你的 LAN 的连接。
2.2.6.2 从局域网 (LAN) 访问 WSL 2 分发版
当使用 WSL 1 分发版时,如果计算机设置为可供 LAN 访问,那么在 WSL 中运行的应用程序也可供在 LAN 中访问。
这不是 WSL 2 中的默认情况。 WSL 2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,你需要执行与常规虚拟机相同的步骤。 (我们正在寻找改善此体验的方法。)
下面是一个示例 PowerShell 命令,用于添加侦听主机上的端口 4000 的端口代理并将其连接到端口 4000,并使用 IP 地址 192.168.101.100 连接到 WSL 2 VM。
PowerShell复制
1 | netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100 |
2.2.6.3 IPv6 访问
WSL2 分发版目前无法访问纯 IPv6 地址。 我们正在致力于添加此功能。
2.2.6.4 扩展 WSL 2 虚拟硬盘的大小
WSL 2 使用虚拟硬盘 (VHD) 来存储 Linux 文件。 在 WSL 2 中,VHD 在 Windows 硬盘驱动器上表示为 .vhdx 文件。
WSL 2 VHD 使用 ext4 文件系统。 此 VHD 会自动调整大小以满足你的存储需求,并且其最大大小为 256GB。 如果 Linux 文件所需的存储空间超过此大小,则可能需要将其展开。 如果你的分发版大小增长到大于 256GB,则会显示错误,指出磁盘空间不足。 可以通过扩展 VHD 大小来纠正此错误。
若要将最大 VHD 大小扩展到超过 256GB,请执行以下操作:
使用
wsl --shutdown
命令终止所有 WSL 实例若要查找你的分发版安装包名称(“PackageFamilyName”):
- 使用 PowerShell(其中,“distro”是分发版名称)输入以下命令:
Get-AppxPackage -Name "*<distro>*" | Select PackageFamilyName
- 例如:
Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName
使用生成的
PackageFamilyName
查找 WSL 2 安装使用的 VHD 文件fullpath
,这将是你的pathToVHD
。 若要查找完整路径:- 在“开始”菜单中,输入“%LOCALAPPDATA%”并选择打开 %LOCALAPPDATA% 文件文件夹。
- 接下来,打开“Packages”文件夹并搜索分发版的
PackageFamilyName
。 打开该文件夹(即 CanonicalGroupLimited.Ubuntu20.04onWindows_79xxxxx)。 - 在
PackageFamilyName
文件夹中,打开“LocalState”文件夹并找到<disk>.vhdx
文件。 - 复制该文件的路径,它应如下所示:
%LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx
- 例如,Ubuntu 20.04 的
<pathToVHD>
应如下所示:%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79xxxx\LocalState\ext4.vhdx
。
通过完成以下命令调整 WSL 2 VHD 的大小:
以管理员权限打开 Windows 命令提示,然后输入:
cmd复制
1
diskpart
cmd复制
1
DISKPART> Select vdisk file="<pathToVHD>"
cmd复制
1
DISKPART> detail vdisk
检查 detail 命令的输出。 输出将包含虚拟大小的值。 这是当前的最大值。 将此值转换为兆字节。 如果如果“详细信息”输出显示“虚拟大小: 256 GB”,请将此转换为 256000 。
你输入的新值必须大于此原始值。 例如,若要将上述虚拟大小翻倍,可输入值 512000。 确定要为新大小(以 MB 为单位)设置的数字后,在 Windows 命令提示符 diskpart 提示中输入以下命令:
cmd复制
1
DISKPART> expand vdisk maximum=<sizeInMegaBytes>
Exit diskpart
cmd复制
1
DISKPART> exit
启动 WSL 分发版(例如 Ubuntu)。
通过从 WSL 分发版命令行运行以下命令,让 WSL 知道它可扩展其文件系统的大小。
Bash复制
1
2sudo mount -t devtmpfs none /dev
mount | grep ext4- 可能会看到以下消息,它响应第一个 mount 命令:“/dev: /dev 上未装载任何内容。” 可以放心地忽略此消息。
- 复制此项的名称,该名称类似于:
/dev/sdX
(X 表示任何其他字符)。 在下面的示例中,X 的值是 b:
Bash复制
1
sudo resize2fs /dev/sdb <sizeInMegabytes>M
- 在上述示例中,我们将 vhd 大小更改为了 512000,因此命令将为
sudo resize2fs /dev/sbd 512000M
。
三、快速入门
3.1 手动安装
3.1.1 步骤1-启用适用于Linux的Windows子系统
以管理员身份打开PowerShell并运行
1 | dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart |
3.1.2 步骤2-检查运行WSL 2的要求
若要更新到 WSL 2,需要运行 Windows 10。
- 对于 x64 系统:版本 1903 或更高版本,采用 内部版本 18362 或更高版本。
- 对于 ARM64 系统:版本 2004 或更高版本,采用 内部版本 19041 或更高版本。
- 低于 18362 的版本不支持 WSL 2。 使用 Windows Update 助手更新 Windows 版本。
若要检查 Windows 版本及内部版本号,选择 Windows 徽标键 + R,然后键入“winver”,选择“确定”。 更新到“设置”菜单中的最新 Windows 版本。
3.1.3 步骤3-启用虚拟机功能
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。
以管理员身份打开 PowerShell 并运行:
PowerShell复制
1 | dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart |
重新启动 计算机,以完成 WSL 安装并更新到 WSL 2。
3.1.4 步骤4-下载Linux内核更新包
下载最新包:
如果使用的是 ARM64 计算机,请下载 ARM64 包。 如果不确定自己计算机的类型,请打开命令提示符或 PowerShell,并输入:
systeminfo | find "System Type"
。 警告: 在非英语 Windows 版本中,你可能需要修改搜索文本,例如在德语中为systeminfo | find "Systemtyp"
。运行上一步中下载的更新包。 (双击以运行 - 系统将提示你提供提升的权限,选择“是”以批准此安装。)
安装完成后,请继续执行下一步 - 在安装新的 Linux 分发时,将 WSL 2 设置为默认版本。 (如果希望将新的 Linux 安装设置为 WSL 1,请跳过此步骤。)
3.1.5 步骤5-将WSL 2设置为默认版本
打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:
PowerShell复制
1 | wsl --set-default-version 2 |
查看
1 | wsl -l -v |
3.1.6 步骤6-安装所选的Linux分发
打开 Microsoft Store,并选择你偏好的 Linux 分发版。
单击以下链接会打开每个分发版的 Microsoft Store 页面:
在分发版的页面中,选择“获取”。
首次启动新安装的 Linux 分发版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。 未来的所有启动时间应不到一秒。
然后,需要为新的 Linux 分发版创建用户帐户和密码。
祝贺你!现已成功安装并设置了与 Windows 操作系统完全集成的 Linux 分发!
3.2 安装 Windows 终端(可选)
Windows 终端可启用多个选项卡(在多个 Linux 命令行、Windows 命令提示符、PowerShell 和 Azure CLI 等之间快速切换)、创建键绑定(用于打开或关闭选项卡、复制粘贴等的快捷方式键)、使用搜索功能,以及使用自定义主题(配色方案、字体样式和大小、背景图像/模糊/透明度)。 了解详细信息。
3.3 将分发版版本设置为 WSL 1 或 WSL 2
可打开 PowerShell 命令行并输入以下命令(仅在 Windows 内部版本 18362 或更高版本中可用),检查分配给每个已安装的 Linux 分发版的 WSL 版本:wsl -l -v
PowerShell复制
1 | wsl --list --verbose |
若要将分发版设置为受某一 WSL 版本支持,请运行:
PowerShell复制
1 | wsl --set-version <distribution name> <versionNumber> |
请确保将 <distribution name>
替换为你的分发版的实际名称,并将 <versionNumber>
替换为数字“1”或“2”。 可以随时更改回 WSL 1,方法是运行与上面相同的命令,但将“2”替换为“1”。
备注
从 WSL 1 更新到 WSL 2 可能需要几分钟才能完成,具体取决于目标分发版的大小。 如果从 Windows 10 周年更新或创意者更新运行 WSL 1 的旧(历史)安装,可能会遇到更新错误。 按照这些说明卸载并删除任何旧分发。
如果 wsl --set-default-version
结果为无效命令,请输入 wsl --help
。 如果 --set-default-version
未列出,则表示你的 OS 不支持它,你需要更新到版本 1903(内部版本 18362)或更高版本。 如果你在使用 ARM64 版本 19041,那么当使用 PowerShell 时,此命令可能会失败;在这种情况下,你可使用命令提示符,而不是发出 wsl.exe
命令。
运行命令后如果看到此消息:WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel
。 仍需要安装 MSI Linux 内核更新包。
此外,如果要使 WSL 2 成为你的默认体系结构,可以通过此命令执行该操作:
PowerShell复制
1 | wsl --set-default-version 2 |
这会将安装的任何新分发版的版本设置为 WSL 2。
四、为Linux分发版创建用户账户和密码
启用 WSL 并从 Microsoft Store 中安装 Linux 分发版后,在打开新安装的 Linux 分发版时将会要求你完成的第一步是创建帐户,包括用户名和密码。
此用户名和密码特定于安装的每个单独的 Linux 分发版,与 Windows 用户名无关。
创建用户名和密码后,该帐户将是分发版的默认用户,并将在启动时自动登录。
此帐户将被视为 Linux 管理员,能够运行 sudo (Super User Do) 管理命令。
在适用于 Linux 的 Windows 子系统上运行的每个 Linux 分发版都有其自身的 Linux 用户帐户和密码。 每当添加分发版、重新安装或重置时,都必须配置一个 Linux 用户帐户。
4.1 更新和升级包
大多数分发版随附了一个空的的包目录或最简单的包目录。 我们强烈建议定期更新包目录并使用分发版的首选包管理器升级已安装的包。 对于 Debian/Ubuntu,请使用 apt:sudo apt update && sudo apt upgrade
Windows 不会自动更新或升级 Linux 分发版。 大多数 Linux 用户往往倾向于自行控制此任务。
4.2 重置 Linux 密码
若要更改密码,请打开 Linux 分发版(例如 Ubuntu)并输入以下命令:passwd
系统会要求你输入当前密码,然后要求输入新密码,之后再确认新密码。
4.3 忘记密码
如果忘记了 Linux 分发版的密码:
- 请打开 PowerShell,并使用以下命令进入默认 WSL 分发版的根目录:wsl -u root
如果需要在非默认分发版中更新忘记的密码,请使用命令:wsl -d Debian -u root,并将 Debian 替换为目标分发版的名称。
在 PowerShell 内的根级别打开 WSL 发行版后,可使用此命令更新密码:passwd
,其中 是 DISTRO 中帐户的用户名,而你忘记了它的密码。 系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用以下命令在 PowerShell 内关闭 WSL:exit
五、Tips
5.1 重启
wsl环境下reboot和shutdown都是没有作用的,wsl可以通过windows命令行进行重启,使用管理员权限运行下面脚本实现重启:
- cmd
1 | net stop LxssManager |
- PowerShell
1 | Get-Service LxssManager | Restart-Service |
5.2 sudo su不输入密码
由于默认情况下我们不知道 root 用户的密码,所以如果我们想要使用 root 用户的话可以使用 passwd 命令为 root 用户设置一个新的密码,同时为了避免sudo切换root是需要输入密码,把自己配置的用户名加到sudo免密中,命令如下:
1 | # 替换leap为自己单独配置的用户名 |
或者使用
1 | visudo |
进行编辑
5.2 更换ubuntu的apt更新源
默认的安装源相对国内很慢,我们更换源到阿里云,登录到ubuntu到操作如下:
1 | cp /etc/apt/sources.list /etc/apt/sources.list.bak |
执行更新:
1 | apt update && apt upgrade -y |
可以会使用到
1 | apt-get update && apt-get upgrade -y |