1

我很期待在我的主机 Ubuntu 上为我的 ARM 目标进行编译。
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=31&t=8478

上面的链接声明使用 chroot 并直接将您的程序编译到主机上目标的根文件系统中。

有人建议使用像 scratchbox 这样的监狱虚拟环境。
为特定目标平台设置交叉编译环境

https://en.wikipedia.org/wiki/Chroot

The chroot mechanism is not intended to defend against intentional tampering by privileged (root) users. On most systems, chroot contexts do not stack properly and chrooted programs with sufficient privileges may perform a second chroot to break out. To mitigate the risk of this security weakness, chrooted programs should relinquish root privileges as soon as practical after chrooting, or other mechanisms – such as FreeBSD Jails - should be used instead. Note that some systems, such as FreeBSD, take precautions to prevent the second chroot attack.[1]
So i am investigating on it for few days here i am not able to understand what above statement means. 

1> 与 chroot 相比,虚拟监狱环境有什么优势?

2> chroot 是否会影响所有打开的终端或.. 运行命令的特定终端?

3> 我们究竟应该使用什么来交叉编译 Jail,比如 scratch-box 或 chroot。

4

1 回答 1

1

维基百科谈论 chroot 的安全性,因为 chroot 经常与沙箱 (不提供 chroot)或其他旨在提供安全性和隔离的人进行比较。
chroot() (它是一个 UNIX 系统调用)是将明显的根目录 ( /) 更改为系统调用指向的另一个目录的过程。这意味着如果 /dir/target 的 chroot 可执行文件想要访问加载/lib/ld-linux.so.2(可执行文件中的硬编码路径),真正的访问将发生在/dir/target/lib/ld-linux.so.2
所以这意味着程序需要访问的每个文件和库都需要有它们通常的chroot 路径(本例中为 /dir/target )的真实路径(以 为前缀/. 如果您在 chroot 中使用完整的系统,您最终将使用 chroot 路径中描述的目录结构,man hier但前缀(对于 chrooted 程序)具有 chrooted 路径。这也意味着您可以使用不同架构的不同二进制文件(如果您的 CPU 支持多个二进制文件;例如提供一种隔离)。

正如您在查看 chroot 时所看到的,主要目的并不是提供安全性,而是用于其他目的,从 Linux 中的 initramfs 根切换到磁盘上的挂载根(除了进程 mount -o移动)。
但是,正如Wikipedia 文章所述,某些实现(例如 FreeBSD)选择提供一定级别的安全性:例如禁用在 chroot 中创建第二个 chroot 的可能性。当维基百科告诉 chroot 需要以 root 身份运行时,它是错误的。今天的大多数系统都具有比用户/组权限更细粒度的机制。

Jails 旨在直接提供隔离,它允许限制进程可能使用的 RAM 和 CPU 数量;禁用共享内存;限制权限...
某些实现(例如使用沙盒命令)不提供 chroot。监狱在操作系统级别的虚拟化中有应用,或者在测试特殊代码时避免损坏系统的其余部分。
如果您以沙箱命令为例,您会发现它不能单独使用备用根目录结构。

http://www.raspberrypi.org/forums/viewtopic.php?f=31&t=8478提到了 qemu-user,这显然是为了测试程序而不必将它们放在 Rasberry Pi 上。这与虚拟机不同,因为这里没有虚拟化硬件:程序的二进制指令被转换为本机指令,这意味着系统调用的处理就像程序在本机运行一样。
这里需要使用不同的根目录结构:一些共享对象文件路径名在所有发行版和体系结构中都是通用的(例如/lib/ld-linux.so.2. 您不能将多个架构混合到同一个二进制文件中。如果您将共享库替换为其 ARM 等效项,则这些文件将无法用于本机可执行文件。出于同样的原因,qemu-user 或整个目标系统需要静态编译。

我真的建议您安装并设置binfmt。它将使您能够通过自动启动 qemu-arm-static 命令来运行程序,就好像它们具有与您的机器相同的体系结构......
然后您可能想要编译软件而不进行交叉编译,只需在内部安装本机 ARM 编译器你的chroot。

于 2014-04-09T00:06:37.747 回答