我有一些设备(比如说/dev/sda1
)安装在/home/user1
。我下也有一个完整的Linux系统/tmp/chroot
,并且该目录/tmp/chroot/home
只包含一个名为user2
.
如果我chroot
在/tmp/chroot
、 mount/dev
和/sys
那里/proc
发出mount
命令(或cat /proc/mounts
),我仍然可以看到/dev/sda1
安装在/home/user1
,而该目录/home/user1
甚至不再存在(在 chroot 中)。
我也尝试过withjchroot
而不是chroot
(这是一个界面类似的程序,chroot
但创建了一个新的挂载命名空间和一个新的PID命名空间),但结果是相同的。
这是正常行为吗?我可以访问有关 chroot 之外的挂载点的信息,这听起来很奇怪。
有没有办法让它们消失/proc/mounts
?
答案1
这是 chroot 中的预期行为。 chroot 实际上只是将进程所看到的文件系统根目录“/”更改为与引导时挂载为“/”的目录不同的目录。该进程仍然对内核本身具有相同的全局访问权限,只是不能访问“/”文件系统。
内核不会对 /proc 或设备进行任何修复或模拟,以使 chroot 进程相信 chroot 是“真实的”。作为其副作用,在 chroot 中以超级用户身份运行的任何进程都可以通过多种方式轻易地突破 chroot(例如,挂载 /dev 并挂载 /dev/sdaX ,其中真正的 root 所在,或者甚至只是 mknod 一个新的设备进入并使用它挂载——内核不关心)。 chroot 进程甚至可以安装设备驱动程序并做任何它喜欢做的事情......
如果您希望“欺骗”一个进程,使其认为它在与当前运行的系统不同的系统上运行,或者提供安全层,那么 chroot 可能是错误的技术,我建议您研究用户模式 Linux 或可能的 Linux集装箱
答案2
是的,您需要使用“unshare”来代替(或同时)chroot; chroot 仅更改进程的根目录。虽然在实践中很难达到高于它的任何目标,但有很多方法可以突破。这不是监狱。
有一些工具可以执行此操作,例如“lxc”(Linux 容器)