我问这个问题是因为我很好奇并且想更好地了解 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
使用exec
和dev
选项重新安装。
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
使用exec
和dev
选项重新安装。...
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.exe
、powershell.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
在那里工作的原因。