上下文

上下文

上下文

我了解 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/pathdocker-desktop-datasudo mount -t drvfs '\\wsl$\docker-desktop-data' /some/mount/path

什么是不是问题

如何查看docker-desktop-dataWSL2 发行版中的整个目录——我已经知道可以使用 `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/pathdocker-desktop-datasudo 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/wsltmpfsWSL 每次启动时自身创建的。它在所有 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
    

    您还可以使用 、 和其他方式探索其他发行版命名空间lsnsnsenter但是,请注意,由于缺少 shell 或任何其他可执行文件,因此docker-desktop-data似乎无法使用nsenter进行探索特定的命名空间。但是,探索/proc/<pid>该分布仍然很有趣。

相关内容