为什么 Windows 文件系统在 WSL 上使用 noexec 和 nodev 选项挂载?

为什么 Windows 文件系统在 WSL 上使用 noexec 和 nodev 选项挂载?

我问这个问题是因为我很好奇并且想更好地了解 WSL。

我的环境是 Windows 11,使用运行 Ubuntu 的 WSL 2。我正在学习容器基础知识,在运行时遇到了一个有趣的错误解引导

当我在已挂载的 Windows 文件系统中运行它时(/mnt/c/):

user@laptop:/mnt/c/Users/user/workshop$ sudo debootstrap --arch amd64 jammy container_fs http://archive.ubuntu.com/ubuntu

我收到以下错误:

mknod: /mnt/c/Users/user/workshop/container_fs/test-dev-null: Operation not supported
E: Cannot install into target '/mnt/c/Users/user/workshop/container_fs' mounted with noexec or nodev

我尝试/mnt/c/Users/user/workshop/container_fs使用execdev选项重新安装。

user@laptop:/mnt/c/Users/user/workshop$ sudo mount -o remount,exec,dev /mnt/c/Users/user/workshop/container_fs

输出:

mount: /mnt/c/Users/user/workshop/container_fs: mount point not mounted or bad option.

此时我尝试运行 debootstrap/home/user/并且它没有任何问题。

答案1

为什么 Windows 文件系统在 WSL 上使用 noexec 和 nodev 选项挂载?

您收到的错误消息有点误导。它实际上是不是使用其中任一选项进行安装,您可以使用以下命令进行确认:

mount | grep '/mnt/c'

drvfs on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=262144,trans=virtio)


我尝试/mnt/c/Users/user/workshop/container_fs使用execdev选项重新安装。

...

mount: /mnt/c/Users/user/workshop/container_fs: mount point not mounted or bad option.

错误是因为/mnt/c/Users/user/workshop/container_fs不是挂载点。挂载点/mnt/c。以下操作将成功完成:

sudo mount -o remount,exec,dev /mnt/c

但是,它不能解决您的问题。


请记住错误说noexec 或者 nodev

因此我们将其分为两部分:

noexec

如上所述,文件系统实际上拥有exec特权,并且你从该驱动器运行可执行文件。这就是为什么您可以从 Windows 驱动器运行 Windows 可执行文件(例如notepad.exepowershell.exe和)code。您可以使用以下方法测试反例:

sudo mount -o remount,noexec,dev /mnt/c/
notepad.exe

您将收到 ,Permission denied直到您使用 重新安装exec


nodev

为此,查看错误的第一部分很重要debootstrap

mknod: /mnt/c/Users/user/workshop/container_fs/test-dev-null: Operation not supported

这可能是因为 WSL2 下的 Windows 文件系统及其共享不完全符合 POSIX 标准。

WSL2 通过 Plan 9 (9P) 网络文件系统提供对 Windows 驱动器的访问。据我所知,9P 不支持mknod。根据此评论我发现,即使是 Linux 版本的 9P 也不支持(或者至少 3-4 年前不支持)mknod

但是,用于 WSL2 发行版本身的虚拟 SDD 上的 ext4 文件系统完全符合 POSIX 标准,这就是它能debootstrap在那里工作的原因。

相关内容