带有 unionfs-fuse 的 chroot,无法访问 /dev/*

use*_*000 7 chroot mount devices unionfs

我已经与 unionfs-fuse 结合创建了一个 chroot 监狱,这样我就不需要在里面安装另一个系统。

但是,生成的系统的 /dev 条目不可读。这会导致需要访问/dev/random/dev/null和 的程序出现问题/dev/urandom

我试图通过使包括持久性文件的目录,并使用使上述文件的等价物来解决自己的问题mknod所描述这里,然后创建的unionfs:

# unionfs-fuse -o cow /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
Run Code Online (Sandbox Code Playgroud)

进而,

# chroot chroot/
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试:

# head -c 10 /dev/random | hexdump -C
Run Code Online (Sandbox Code Playgroud)

我收到错误:

head: cannot open `/dev/random' for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)

我应该如何解决这个问题?

(我不需要访问/devlike/dev/sd*/dev/mem. 中的其他文件。)

Gil*_*il' 2

解释位于mount.fuse手册页中:

文件系统默认挂载nodev,nosuid,只能由特权用户覆盖

使用该nodev选项,内核将禁止对已安装文件系统中的设备的所有访问。使用该nosuid选项,内核会忽略 setuid 和 setgid 属性。当非 root 用户安装文件系统时,这两个选项都是安全所必需的:否则安装用户可以创建 setuid root shell 或设备,让他绕过文件系统访问所有磁盘。

allow_other如果非 root 用户要访问该文件系统,您还需要该选项。

unionfs-fuse -o cow,dev,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
Run Code Online (Sandbox Code Playgroud)

如果您想限制哪些设备在 chroot 中可见,那么联合挂载并不是实现此目的的方法。相反,放弃dev并安装一个包含您所需的最小/dev. 您可以将其设为 tmpfs:

unionfs-fuse -o cow,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
mount -t tmpfs -o mode=755 chroot-dev /chroot/chroot/dev
cp -a /dev/null /dev/zero /dev/urandom /chroot/chroot/dev
mkdir /chroot/chroot/dev/pts
mount --bind /dev/pts /chroot/chroot/dev/pts
Run Code Online (Sandbox Code Playgroud)

您可以绑定挂载一个包含准备就绪的设备的目录,而不是 tmpfs。您需要绑定安装/dev/pts才能在 chroot 中获取伪终端。