我想将我的 Windows C:驱动器作为 drvfs 文件系统挂载到 WSL 中的 /mnt/c,但如果我指定 drvfs 作为文件系统类型,我会得到 9p 文件系统。
我输入了以下命令:
$ sudo umount /mnt/c
$ sudo mount -t drvfs C: /mnt/c/
$ mount -l
...
C: on /mnt/c type 9p (rw,relatime,dirsync,aname=drvfs;path=C:;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=3,wfd=3)
如您所见,类型是 9p,而不是指定的 drvfs。
答案1
是的,在 WSL 版本 2 中安装 Windows 驱动器时,它使用 9P 协议。这与使用 drvfs 的版本 1 相比有很大变化。WSL 主机运行 9P 服务器,WSL 实例连接到该服务器。
有很多网站在讨论这个问题,但在我看来,用搜索引擎很难找到,因为关于 9P 的“更大”新闻是每个 WSL实例(无论是 WSL1 还是 WSL2)也托管自己的 9P 服务器,Windows/WSL 主机可以作为客户端连接到该服务器并提供对\\wsl$\<distroname>
路径上的 WSL 文件的访问。
这是其中最好的一个我在 r/bashonubuntuonwindows 上找到的讨论请注意来自 WSL 开发人员之一(现在,我相信是团队负责人)的 u/benhelioz 的引言:
很棒的文章。我想非常清楚地说明这一点——我们对 Windows Drive 文件访问性能绝对不满意。这是我们投资的最大领域之一,我们正在努力提高性能。我要强调的一点是,我们的 9p 具有 Samba 和 SMB 所没有的一些优势。它更加安全,支持管理员/非管理员,并且与人们在 WSL1 中使用 DrvFs 的任何东西完全兼容。
您的问题中显然未得到解答的部分是为什么不能直接将驱动器挂载为 drvfs。这是因为 WSL 实例无法直接访问硬件。它们依赖 WSL(LxssManager)服务接口来提供对 Windows 元素的 API 访问。因此,我们依赖于 WSL 提供访问的方法,对于 WSL2 和 NTFS 驱动器,该方法是 9P。