WSL:我是运行的版本1还是版本2?

我有Windows Subsystem for Linux,但是我不知道我有哪个版本,而且很多东西在版本1中无法正常工作。我该如何检查我的版本?

3@Rinzwind 欢迎你加入我一起在 https://github.com/microsoft/WSL/issues/4555 发起这样的请求。 - K7AAY
2从那个线程来看,以下的 bash 命令似乎可行: uname -r | grep Microsoft > /dev/null && echo "WSL1". -- 这是一种相当临时的检测方式,但如果你正在运行 WSL1,它将会打印 "WSL1"。 - BrainSlugs83
5@BrainSlugs83 极其脆弱但对我有效!在WSL1中,uname -r 结尾为 -Microsoft,而在WSL2中,它以小写字母"m"结尾,即 -microsoft-standard - Arthur Tacca
1@Rinzwind 在我看来,关于WSL的任何问题,包括如何安装它,都是适合讨论的。 - Flimm
@Flimm 如果答案不在WSL之内,那就不是问题。一旦有人提到PowerShell,它就是离题的。我们不应该了解任何Windows中的工具。 - Rinzwind
1@Rinzwind 如果问题是相关的,那么对该问题的回答也是相关的。如果有人问如何在Windows上创建可启动的Ubuntu USB驱动器,那么这个问题是相关的,对它的所有回答也是相关的,即使回答中提到了unetbootin.exe。WSL也是同样的情况。 - Flimm
我至少希望wsl --version是可用的... - MC Emperor
在C:\Windows\System32\Wsl.exe的属性详细选项卡中检查文件版本-如果小于10.0.19041.x,则为WSL1。 - Oliver Slay
5个回答

在Windows 10命令提示符下运行ver。倒数第二个数字组的版本是否为18917或更高?如果是,那么您可能已经安装了WSL 2,但尚未进行验证。继续进行A步骤或者B步骤。
如果您没有看到Windows版本18917或更高版本,则表示您使用的是版本1。
这是操作系统构建16299时的结果示例:
Version 16299
A. 打开Windows PowerShellcmd,输入命令wsl -l -v。如果版本2已正确安装,您将看到版本号。如果您没有看到版本号,或者看到错误消息(感谢Cornea Valentin),则表示您使用的是版本1(您也可能看到版本号'1',这可能表示您正在运行v1-请参阅此处)。请卸载它,然后按照https://scotch.io/bar-talk/trying-the-new-wsl-2-its-fast-windows-subsystem-for-linux重新安装。

B. 在WSL shell提示符下运行unameuname -r。如果内核版本>= 4.19,则为WSL版本2。
为什么这个相关呢?
WSL 1是基于微软的Linux兼容内核接口开发的,它采用一种兼容性翻译层无Linux内核代码。
WSL 2在轻量级虚拟机环境中运行Linux内核,进行了重新设计,创新者们发现有许多更多可以利用WSL 2做的事情。
Windows 10 Version 2004(构建版本19041.153及更高版本)进一步增强了WSL2;请参阅https://devblogs.microsoft.com/commandline/wsl2-will-be-generally-available-in-windows-10-version-2004/https://winaero.com/blog/wsl2-will-ship-with-windows-10-version-2004-with-kernel-updates-via-windows-update/

35如果他在运行"wsl -l -v"命令后遇到任何错误,那就是100%的WSL 1版本。 - Cornea Valentin
5我需要使用uname -r命令来查看内核版本,但是内核版本最终显示为4.4.0,我相当确定这意味着WSL 1。 - Keara
16使用uname -a命令打印内核版本。 - thisismydesign
5对我来说,wsl -l -v 打印的是使用信息(即不起作用),但 wsl -l --verbose 打印了预期的详细列表。systeminfo.exe 给出了 OS 版本:10.0.19041 N/A Build 19041 - drkvogel
1根据MicrosoftMicrosoft博客作者的说法,由于新的后移版本,我们也可以在(1903或1909)构建18362.1049上获得WSL2。这有助于那些尚未拥有18917版本的公司中的用户,该版本在上面的答案中提到。 - Marcus
2我看到的是4.4,这个比4.19大还是小? - quant
在PS中,可以通过winver来查看弹出窗口中的Windows版本。 - Timo
1截至2020年12月,我在使用wsl -l -v命令时返回的是版本1,并且配备了Ubuntu 20.04。这对于更新的Ubuntu版本来说是个不错的修复。很酷! - Kyle Vassella
提到的链接在https://scotch.io上非常完美。 - Alireza Fattahi
如果我看到无效的命令行选项:-l,怎么办? - Moberg
你的回答自相矛盾 - 我看到第一次测试的版本号,表明它是第2版,但我的内核低于你所说的第2版所需的版本。 - Rebroad

  1. 打开 PowerShell
  2. 使用 wsl -l -v 命令检查版本
  3. 如果版本为 1,则使用 wsl --set-version Ubuntu-20.04 2 命令更新版本

注意:更改正在运行的操作系统的版本将终止它。 操作系统的名称不一定是 Ubuntu-20.04,请选择在 wsl -l -v 中列出的实际名称

如果无法更新到版本 2,则可能未安装 WSL 2 内核。可以从Microsoft下载。


关于第三点的说明,运行它将立即终止当前正在运行的所选操作系统的所有实例,例如在这种情况下,所有Ubuntu-20.02的实例都会被终止。 - zshift
谢谢你指出这一点,我已经添加了一个注释来指出这一点。 - Jack
6@Jack,我只有一个版本的Ubuntu 18.04,我注意到在没有指定版本的情况下,"wsl --set-version Ubuntu 2" 对我有效。我怀疑这种情况总是如此。 - Angelo
这对我来说是在Windows 10上的正确答案。 - mLstudent33
只需按照此处所示运行wsl --status:https://www.youtube.com/watch?v=bRW5r7TK6KM - Benny Code

在我运行的WSL版本中,我只需输入uname -r,然后得到了结果。

5.4.72-microsoft-standard-WSL2

所以,我可以说它是WSL2,你可以尝试运行uname -r来检查。

1只要你使用的是原始内核,那么这个方法是可行的,但如果你使用的是自定义内核,名称可能会有所不同。另外,作为参考,WSL1 内核的命名类似于 "4.4.0-22000-Microsoft"(不带 "-standard-WSL2")。我记得在 WSL2 上,4.x 版本的发布只有 "-microsoft-standard"(不带 "-WSL2"),但我可能记错了。 - NotTheDr01ds
啊,我不知道那个,谢谢你告诉我! - Luce
14.4.0-17763-Microsoft (Server 2019 WSL 1) - Jason Pyeron

以编程方式:
# Multiline 
wsl.exe -l -v |
iconv -f utf16 |
egrep "\b${WSL_DISTRO_NAME}\s+Running" |
tr -d '\r' |
sed 's/.*\([[:digit:]]\)[[:space:]]*/\1/'

会返回12

逐行解释,这样做:

  • 执行wsl.exe -l -v以返回您可能安装的所有发行版的完整列表

  • 通过iconv运行它以修复其格式错误的UTF16输出。除非您尝试使用grep(或将其管道传输到诸如hexdump -C之类的工具),否则通常看不到问题,但您必须在使用grep之前清理它。

  • 匹配当前实例(通过$WSL_DISTRO_NAME)行

  • 删除DOS行结束符

  • 在该行中找到版本号并输出

感谢这个Super User答案提供的概念。

只要为WSL启用了Interop,这将起作用。

如果未启用Interop,则可以使用备用方法来检查/proc/cmdline

  • /proc/cmdline 在 WSL1 上是 BOOT_IMAGE=/kernel init=/init
  • /proc/cmdline 在 WSL2 上是 initrd=\initrd.img panic=-1 pty.legacy_count=0 nr_cpus=16

所以:

  • grep -q "^BOOT_IMAGE" /proc/cmdline 在 WSL1 上返回成功,但在 WSL2 上返回错误
  • grep -q "^initrd" /proc/cmdline 在 WSL2 上返回成功,但在 WSL1 上返回错误

目前这个方法可行(至少过去一年都有效),但如果 WSL1 或 WSL2 的架构发生变化,将来可能会有改变。然而,我预计 /proc/cmdline 在 WSL1 和 WSL2 之间很可能始终不同,并且可以通过编程解析来确定当前版本。


如果你碰巧在Windows上运行Docker,并且使用的是WSL 1,那么当你在WSL的终端中输入docker时,你会看到一条消息The command 'docker' could not be found in this WSL 1 distro.,这是一个非常明确的确认。