为什么 wsl 有时会在命令行中使用错误的发行版?

为什么 wsl 有时会在命令行中使用错误的发行版?

例如,这是在 wsl 中运行简单命令的命令行会话的输出,其中它“选择”了错误的分布,直到我关闭 wsl 并重试。

PS D:\wslsandbox> wsl -l -v        
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  mikeenv                Stopped         2
  tam                    Stopped         2
  docker                 Stopped         2
  java17                 Stopped         2
  pedro                  Stopped         2
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2
  pedro3                 Running         2
  docker2                Stopped         2
PS D:\wslsandbox> wsl.exe -d pedro3 cat /etc/system-release
/bin/bash: /etc/system-release: No such file or directory
PS D:\wslsandbox> wsl.exe --shutdown
PS D:\wslsandbox> wsl.exe -d pedro3 cat /etc/system-release
Amazon Linux release 2 (Karoo)
PS D:\wslsandbox> 

命令 (wsl.exe -d pedro3 cat /etc/system-release) 会根据子系统在关闭前所处的某些“状态”产生不同的结果。这种情况经常发生在我身上,但我经常启动和停止发行版,尝试开发一些利用 wsl 的东西。

在这种情况下,无论哪个 disto 最先启动,都是您唯一可以获得的:

PS D:\wslsandbox> wsl.exe -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped         2
  mikeenv                Stopped         2
  tam                    Stopped         2
  docker                 Stopped         2
  java17                 Stopped         2
  pedro                  Stopped         2
  pedro3                 Stopped         2
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2
  docker2                Stopped         2
PS D:\wslsandbox> wsl.exe -d Ubuntu cat /etc/system-release
cat: /etc/system-release: No such file or directory
PS D:\wslsandbox> wsl.exe -d pedro3 cat /etc/system-release
cat: /etc/system-release: No such file or directory
PS D:\wslsandbox> wsl.exe -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped         2
  mikeenv                Stopped         2
  tam                    Stopped         2
  docker                 Stopped         2
  java17                 Stopped         2
  pedro                  Stopped         2
  pedro3                 Stopped         2
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2
  docker2                Stopped         2
PS D:\wslsandbox> wsl.exe -d pedro3 cat /etc/system-release
Amazon Linux release 2 (Karoo)
PS D:\wslsandbox> wsl.exe -d Ubuntu cat /etc/system-release
Amazon Linux release 2 (Karoo)

另一个会话中,wslg 发行版(执行 wsl -l -v 时未列出)是我关机前唯一可以使用的发行版:

C:\>wsl -d Ubuntu
wslg [ /mnt/c ]$ exit
logout

C:\>wsl -d pedro
wslg [ /mnt/c ]$ exit
logout

C:\>wsl -d pedro2
wslg [ /mnt/c ]$ exit
logout

C:\>wsl -d pedro2 id
uid=1000(wslg) gid=1000(wslg) groups=1000(wslg)

C:\>wsl -d pedro id
uid=1000(wslg) gid=1000(wslg) groups=1000(wslg)

C:\>wsl -d Ubuntu id
uid=1000(wslg) gid=1000(wslg) groups=1000(wslg)

C:\>wsl -l -v
  NAME        STATE           VERSION
* Ubuntu      Running         2
  mikeenv     Stopped         2
  java17_2    Stopped         2
  tam         Stopped         2
  pedro3      Stopped         2
  docker      Stopped         2
  pedro2      Stopped         2
  pedro4      Running         2
  pedro       Stopped         2
  docker2     Stopped         2

C:\>wsl -d mikeenv id
uid=1000(wslg) gid=1000(wslg) groups=1000(wslg)

C:\>wsl --shutdown

C:\>wsl -d mikeenv id
uid=1000(mdoyle) gid=1000(mdoyle) groups=1000(mdoyle)

C:\>wsl -d pedro id
uid=1620(lawson) gid=1620(lawson) groups=1620(lawson)

C:\>wsl -d pedro2 id
uid=1620(lawson) gid=1620(lawson) groups=1620(lawson)

C:\>wsl -d Ubuntu id
uid=1000(mdoyle) gid=1000(mdoyle) groups=1000(mdoyle),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),36257(docker)

答案1

我认为我已经找到原因了。无论出于什么原因,如果我将这一系列命令粘贴到 powershell 提示符中,我都可以重复出现此问题:

wsl --unregister pedro
wsl --shutdown
sleep 5
Start-Process -FilePath "taskkill" -ArgumentList "/f /im wslservice.exe" -Verb RunAs
sleep 5
wsl.exe --import pedro d:\pedro D:\imagecache\202362aa398ce6c410e395b44d710aea
wsl -l -v
wsl -d pedro echo "hello"
wsl -d pedro echo "hello"
sleep 20
wsl -d pedro

请注意,混合中有一个提升权限的命令,因此系统提示我输入该命令,但它会继续。在玩这个游戏时,我将要导入的图像更改为不同的图像,并注意到它只发生在一个图像上,所以我推断这是与图像相关的。有问题的图像在 wsl.conf 中有以下内容:

[boot]
command="sudo /usr/sbin/sysctl -p"

我创建了一个没有此条目的新图像,并且我不再能够重复将上述命令粘贴到 powershell 中的问题。我不确定该调用在 wsl 发行版中是否必要甚至有效?但我相信它是为了应用对 /etc/sysctl.conf 文件所做的一些调整,例如:

fs.inotify.max_queued_events=17408
fs.inotify.max_user_instances=256
fs.inotify.max_user_watches=524288

感谢@NotTheDr01ds 的帮助!

答案2

我刚刚遇到了类似的问题。运行时,wsl -d Debian我得到的是Ubuntu启动。右键单击ext4.vhdx->Mount给出未指定的错误,并且使用,,diskpart我收到类似于“无法附加 vdisk,文件由其他进程打开”的消息。不知道哪个进程阻止了该文件,但重新启动为我解决了这个问题。select vdisk file="C:\Path\to\Debian\ext4.vhdx"attach vdisk

相关内容