我正在为我的主机Ubuntu上的ARM目标进行编译 http://www.raspberrypi.org/phpBB3/viewtopic.php?f=31&t=8478
以上链接指出使用chroot&直接将您的程序编译到主机上目标的根文件系统中。
有人建议使用像scratchbox这样的jail虚拟环境 Setting up a cross-compilation environment for a specific target platform
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。
答案 0 :(得分:1)
维基百科谈论chroot的安全性,因为chroot经常被比作sandbox (不提供chroot)或其他目的,以提供隔离安全性。
/>
chroot() (它是UNIX系统调用)是将明显根目录(/
)更改为系统调用指向的另一个目录的过程。
这意味着如果/ dir / target的chrooted可执行文件想要访问加载/lib/ld-linux.so.2
(可执行文件中的硬编码路径),那么真正的访问权限将发生在/dir/target/lib/ld-linux.so.2
<登记/>
因此,它意味着程序需要访问的每个文件和库需要将其通常的实际路径(以/
为前缀)到chrooted路径(/ dir / target in this)例如)。如果你在chroot中使用一个完整的系统,你最终会得到man hier
中描述的目录结构,但是带有chrooted路径的前缀(对于chrooted程序)。这也意味着您可以使用 不同架构的 的不同二进制文件(如果您的CPU支持多个;这样可以提供一种隔离)。
正如您在查看chroot时所看到的那样,主要目的不是为了提供安全性,而是用于从Linux中的initramfs根目录切换到磁盘上的挂载根目录的其他purposes(除了进程挂载-o move)。
然而,正如Wikipedia article所述,某些实现(如FreeBSD)选择提供一定程度的安全性:就像禁止在chroot中创建一个choked chroot的可能性。当维基百科告诉chroot需要以root身份运行时,它是错误的。今天的大多数系统都拥有比用户/组权限更多的fine-grained mechanism。
Jails旨在直接提供隔离,它允许人们限制进程可能使用的RAM和CPU的数量;禁用共享内存;限制权限...
某些实现(如使用sandbox命令)不提供chroot。 Jails在Operating system–level virtualization中有应用程序,或在testing special code时避免损坏系统的剩余部分
如果您以sandbox命令为例,您将看到它本身不能使用备用根目录结构。
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命令,您可以运行程序,就像它们具有相同的机器结构一样...
然后,您可能希望在没有交叉编译的情况下编译软件,只需在chroot中安装本机ARM编译器。