我已经使用 Linux 几年了,并且想尝试一下 WSL2。让我惊讶的是我如何能够“如此”运行 Windows PE 二进制文件(*.exe 文件)。一些研究让我发现这是由于binfmt_misc
Linux 的特性造成的。我发现 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
略有不同。此时,大小和时间戳似乎是相同的,这意味着微软可能已经完全退出了/init
这LxssManager.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
,然后卸载。