iOS 上的应用程序(也许还有 OS X 上沙盒的应用程序)仅限于虚拟根文件系统,该系统仅包含特定于应用程序的文件和目录。 iOS 应用程序看到的根目录如下所示:
/
Application.app/
Documents/
Library/
tmp/
正如您所看到的,沙箱根目录中没有公开系统可执行文件或共享库,这与应用程序运行所必需的 chroot 不同;我认为 Tizen、bada 和许多 J2ME 操作系统也是如此。 Linux 已经获得了可用于沙箱的新技术,例如命名空间、cgroup、seccomp-bpf,这些技术现在已用于 LXC、Docker 和 Chrome OS 等软件中。这些技术中的任何一个都可以用于为可能类似于以下内容的应用程序创建根:
/
app/
data/
resources/
app.xml
在嵌入式平台或消费电子设备上,有人可能不想将设备文件系统的其余部分暴露给应用程序?我猜测,iOS 应用程序可以调用 Apple 的库和框架,而不会让它们出现在监狱中,那么 Linux 的新技术也能实现同样的功能吗?
答案1
你不需要内部的系统库或二进制文件,chroot
以便应用程序运行。
例如:
$ ls chroot_test
hello*
$ sudo chroot chroot_test /hello
Hello, World
为什么这样有效?因为hello
程序是静态链接的,没有依赖关系:
$ file chroot_test/hello
chroot_test/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
基本上,无论采用什么技术,文件需要进入“沙箱”是运行应用程序所需的最低限度。所以动态链接的程序可能需要libc.so
等等ld.so
。
一个简单的bash
环境可能需要更多文件:
$ find chroot-bash -type f
chroot-bash/lib64/libdl.so.2
chroot-bash/lib64/ld-linux-x86-64.so.2
chroot-bash/lib64/libc.so.6
chroot-bash/lib64/libtinfo.so.5
chroot-bash/bin/bash
我们不能做其中有很多内容(例如,没有ls
命令,但它是一个正在运行的bash
shell。
$ sudo chroot chroot-bash /bin/bash
bash-4.2# pwd
/
bash-4.2# ls
bash: ls: command not found
bash-4.2# echo *
bin lib64
请注意,这些文件是副本原件;它们不是原件(好吧,你可以绑定安装它们)。操作系统没有暴露。
chroot
无论您使用或docker
或lxc
...,您都需要在其中包含相同的文件集。
现在请注意,这是还操作系统本身也是如此。当你yum install
或apt-get install
一个包时,它可能会带来一些依赖项,包括库!您的操作系统并不具备一切!它只是有一个大一组默认的东西,让人们更容易使用。