在 WSL2 中查找安装在 /init 上的“tools”文件系统

在 WSL2 中查找安装在 /init 上的“tools”文件系统

我已经使用 Linux 几年了,并且想尝试一下 WSL2。让我惊讶的是我如何能够“如此”运行 Windows PE 二进制文件(*.exe 文件)。一些研究让我发现这是由于binfmt_miscLinux 的特性造成的。我发现 Windows 可执行文件的解释器是/tools/init.

但是,我找不到该/tools目录(我只能找到一个可执行/init文件)。在 WSL2 中,运行mount | grep tools给了我这个:

tools on /init type 9p (ro,relatime,dirsync,aname=tools;fmask=022,loose,access=client,trans=fd,rfd=6,wfd=6)

然而,我什至找不到/init/(我能找到的最好的是C:\Windows\System32\lxss\tools在 Windows 中)。这在 WSL2 中如何工作?是否/安装在这些安装点“上方”?如果是这样,我如何查看WSL2/tools或中的内容?/init

答案1

首先,请记住,大多数 WSL 都是闭源的,因此我们必须从观察到的行为以及我们对 Linux 和 Windows 机制的理解中收集一些信息。也就是说,Microsoft 提供了许多有关 Interop 如何工作的有趣信息。微软博客文章Windows 和 Ubuntu 互操作性这是一本很棒的书,尽管就我个人而言,它仍然有点超出我的理解范围。虽然它是在 WSL1 时代编写的,但其中大部分内容仍然适用于 WSL2。

阅读该博客时请注意——一些术语已经改变。例如bash.exe现在wsl.exe,“Ubuntu”是当时唯一的发行版。

虽然 Microsoft 的实现是闭源的,但该博客确实链接到先驱开源项目它允许 WSL 运行 Windows 二进制文件,因此检查一下您可能会学到什么可能会很有趣。

然而,我什至找不到/init/(我能找到的最好的是C:\Windows\System32\lxss\tools在 Windows 中)。

我们至少可以相当明确地回答。在 Windows 的工具目录中,您将找到init二进制文件。/init您在 WSL(无论版本 1 或 2)实例中看到的实际上并不存在在文件系统中。当您启动实例时,它由 WSL 装载。您的 WindowsC:\Windows\System32\lxss\tools\init将变成/init.

请注意,如果您使用的是 WSL Store Preview,则实际的二进制文件来自 Store 包而不是..\System32\lxss.

另请注意,上面的博客文章提到:

/init是由 Microsoft 编写的多用途二进制文件,并作为包含在LxssManager.dll.

情况可能不再如此了。有一段时间,WSL1 和 WSL2 的文件大小/init略有不同。此时,大小和时间戳似乎是相同的,这意味着微软可能已经完全退出了/initLxssManager.dll一点,至少在我目前运行的商店预览版本中是这样。

是否/安装在这些安装点“上方”?

我想我已经在上面回答了这个问题,但需要澄清的是,事实恰恰相反。 /init在启动时安装到/.至少在 WSL2 中,它使用 9P 协议文件系统,这是一个网络文件系统。默认情况下,9P 还用于将所有 Windows 驱动器安装到/mnt/c, /mnt/d(等等)。

tools on /init type 9p (ro,relatime,dirsync,aname=tools;fmask=022,loose,access=client,trans=fd,rfd=6,wfd=6)

因此,将该挂载点解读为“Windows..\lxss\tools目录通过 9P 协议挂载为/init”。

更多精彩信息我还不知道你在 Reddit 上关于同一问题的帖子中的 u/diddlesnaps 。根据该信息(这对我来说非常有意义),tools安装是通过 WSL 完成的initrd,然后卸载。

相关内容