上下文
我了解 docker-desktop 的 WSL2 后端通过创建 2 个发行版来工作:docker-desktop
& docker-desktop-data
。
我可以看到这些发行版的文件系统安装在我的 Ubuntu WSL2 发行版中:
grant@BeastMini-II:~$ ls -l /mnt/wsl
total 4
drwxr-xr-x 4 root root 100 Apr 1 09:12 docker-desktop
drwxr-xr-x 3 root root 60 Apr 1 09:12 docker-desktop-bind-mounts
drwxr-xr-x 4 root root 80 Apr 1 09:12 docker-desktop-data
-rw-r--r-- 1 root root 197 Apr 1 09:12 resolv.conf
当我通过 Powershell 查看 docker-desktop-data 时,我可以看到文件系统中的各种文件:
PS C:\Users\grant> ls \\wsl$\docker-desktop-data
Directory: \\wsl$\docker-desktop-data
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 01/02/2023 18:36 lost+found
d----- 01/02/2023 18:36 .docker
d----- 01/02/2023 18:36 tmp
d----- 01/04/2023 09:12 etc
d----- 01/02/2023 18:36 isocache
d----- 01/04/2023 09:12 run
d----- 01/02/2023 18:36 sbin
d----- 01/02/2023 18:36 data
d----- 01/02/2023 18:36 bin
d----- 01/02/2023 18:36 mnt
d----- 01/04/2023 09:12 sys
d----- 01/02/2023 18:36 usr
d----- 01/04/2023 09:12 proc
d----- 01/04/2023 09:12 dev
------ 26/01/2023 12:11 1813552 wsl-keepalive
------ 01/01/1970 00:00 1955960 init
...但是当我在 Ubuntu 中查看已挂载的文件系统时,我只看到文件系统的一小部分:
grant@BeastMini-II:~$ ls -l /mnt/wsl/docker-desktop-data
total 4
drwxr-xr-x 2 root root 40 Apr 1 09:12 data
drwxr-xr-x 3 root root 4096 Feb 1 18:36 isocache
问题
/mnt/wsl/docker-desktop-data
为什么我在 Ubuntu WSL2 发行版中看不到整个文件系统?
什么决定了哪些文件会出现在挂载目录中,哪些不会出现?
在运行的发行版中 -与手动安装后有何/mnt/wsl/docker-desktop-data
不同?在后者中我可以清楚地看到更多的文件系统。/some/mount/path
docker-desktop-data
sudo mount -t drvfs '\\wsl$\docker-desktop-data' /some/mount/path
什么是不是问题
如何查看docker-desktop-data
WSL2 发行版中的整个目录——我已经知道可以使用 `sudo mount -t drvfs '\wsl$\docker-desktop-data' /some/mount/pat 来挂载它
答案1
笔记:此答案中的信息已针对 WSL 1.2.0 和 Docker Desktop 4.18.0 进行了验证。下面讨论的方法在过去已经发生了变化,将来可能会再次发生变化。
在 WSL2 发行版中 - 决定出现在以下位置的文件是什么:
/wsl/{some-other-distro}
问题标题有点含糊。我认为您问的是/mnt/wsl/{some-other-distro}
,但您漏掉了这/mnt
部分。或者您可能问的是\\wsl.localhost\<distro>
份额(又名\\wsl$\<distro>
)。
对于后者,发行版的 rootfs 是通过\\wsl.localhost
(现在首选的版本,而不是已弃用的但仍然可用的版本\\wsl$\
)作为共享提供的。
对于/mnt/wsl
,没有自动过程 - 每个发行版(甚至最终用户)都可以在 下挂载他们喜欢的任何内容/mnt/wsl
。Docker 选择在启动时执行此操作,但您也可以使用类似以下方法创建自己的挂载我的答案在这里。
就/mnt/wsl
其本身而言,WSL 会自动生成一些文件,以便它们在所有发行版中都可用:
resolv.conf
- 自动生成的解析器配置,然后将其符号链接到/etc/resolv.conf
。(在最新版本的 WSL 中):
/mnt/wsl/run
然后/mnt/wsl/user
将它们绑定安装到各自的目录中。
/mnt/wsl/docker-desktop-data
为什么我在 Ubuntu WSL2 发行版中看不到整个文件系统?
在运行的发行版中 -与手动安装后有何
/mnt/wsl/docker-desktop-data
不同?在后者中我可以清楚地看到更多的文件系统。/some/mount/path
docker-desktop-data
sudo mount -t drvfs '\\wsl$\docker-desktop-data' /some/mount/path
正如您所注意到的(或至少假设),Docker Desktop 不会docker-desktop-data
自行安装虚拟驱动器。相反,它会创建一个绑定安装到该驱动器的子目录(以及许多其他到其他子目录的绑定挂载)。从高层次来看,docker-desktop-data
似乎使用了一种技术相似的到我的答案在发行版之间共享文件,在启动时,它会为主要“共享目录”创建一个绑定挂载。
从常规 WSL 发行版中,你可以通过以下代码查看实际的挂载情况:
$ findmnt | grep "version-pack-data\s"
| |-/mnt/wsl/docker-desktop-data/version-pack-data /dev/sdf[/version-pack-data] ext4 rw,relatime,discard,errors=remount-ro,data=ordered
在这种情况下,dev/sdf
已分配给docker-desktop-data
分发版的虚拟驱动器。这可能会根据您启动分发版的顺序(以及数量)而改变。
如果我们可以docker-desktop-data
直接访问发行版,这相当于运行(作为 root ):
mount --bind / /mnt/wsl/docker-desktop-data/version-pack-data -o X-mount.mkdir
虽然您可能已经知道这一点,但对于其他读者,请注意,这/mnt/wsl
是tmpfs
WSL 每次启动时自身创建的。它在所有 WSL 发行版中共享且可访问,并且是短暂的——每次 WSL 关闭时,其内容(挂载点,而不是其下的数据)都会被删除。
什么决定了哪些文件会出现在挂载目录中,哪些不会出现?
考虑到上述情况,您应该会发现,在 中看到的/mnt/wsl/docker-desktop-data
是每个绑定安装的组合,其中主要的是version-pack-data
。
使用完整的findmnt
,您还会注意到许多其他docker-desktop-data
坐骑。虽然对每个坐骑进行逆向工程超出了任何一个答案的范围,但还是有一些有趣的。从 内部docker-desktop
运行:
mount | grep iso
这将向您展示 Docker 如何交付可执行文件和库本身。这些 ISO 可以在 WindowsDocker
安装文件夹(通常是C:\Program Files\Docker\Docker\resources
)中找到。当 Docker 的新版本发布时,ISO 文件将使用最新版本进行更新,然后安装到 WSL 中。
附注:
您会注意到该
mount
命令仅显示/dev/sdf
正在挂载/mnt/wsl/docker-desktop-data/version-pack-data
。如果您在首选发行版中自己创建了绑定挂载,也会发生同样的事情。例如:$ sudo mount --bind /home /mnt/wsl/test -o X-mount.mkdir $ mount | grep home # Doesn't find anything $ mount | grep test /dev/sdc on /mnt/wsl/test type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
findmnt
但是,您可以从(如上所述)或以下位置获取更好的信息:$ cat /proc/self/mountinfo | grep home 1734 71 8:32 /home /mnt/wsl/test rw,relatime shared:501 - ext4 /dev/sdc rw,discard,errors=remount-ro,data=ordered
您现在可能已经意识到,将
docker-desktop-data
驱动器作为本机驱动器安装可能ext4
比使用以下方法更好drvfs
:$ findmnt -a | grep "version-pack-data\s" | |-/mnt/wsl/docker-desktop-data/version-pack-data /dev/sdf[/version-pack-data] ext4 rw,relatime,discard,errors=remount-ro,data=ordered # Using the block device returned (sdf in this case): $ sudo mount /dev/sdf /mnt/wsl/instances/docker-desktop-data -o X-mount.mkdir $ cd /mnt/wsl/instances/docker-desktop-data
这将提供本机权限、符号链接等。
在 WSL 的最新版本中,可以从根命名空间(又称 Debug Shell)执行更多探索。在管理 PowerShell 中,运行:
wsl --debug-shell
此根命名空间显示全部每个发行版中正在运行的进程,包括
docker-desktop-data
。docker-desktop-data
除了默认和 Plan 9 服务器之外,只有一个进程在运行init
,那就是wsl-keepalive
。我将假设这个名字显而易见——这只是一个长期运行的进程,可以保持docker-desktop-data
运行和访问。您可以使用以下命令演示这一点(再次在调试 shell 中):
$ cat /proc/$(pgrep wsl-keepalive)/environ | xargs -0 -I{} echo {} | grep WSL_DISTRO_NAME WSL_DISTRO_NAME=docker-desktop-data
您还可以使用 、 和其他方式探索其他发行版命名空间
lsns
。nsenter
但是,请注意,由于缺少 shell 或任何其他可执行文件,因此docker-desktop-data
似乎无法使用nsenter
进行探索那特定的命名空间。但是,探索/proc/<pid>
该分布仍然很有趣。