沙箱
本文档描述了沙箱技术在Fushsia系统中的工作原理。
一个空的进程不具有任何功能
在Fuchsia中,一个新创建的过程不具有任何功能,它无法访问任何内核对象,无法分配内存,甚至无法执行代码。当然,这样的进程不会很有用,所以我们通常需要使用一些初始资源和功能来创建进程。
其中最常见的做法是,进程使用初始堆栈、一些命令行参数、环境变量和一组初始句柄开始执行某些代码,这其中最重要的初始句柄之一是PA_VMAR_ROOT
,进程可以使用该句柄将额外的内存映射到其地址空间上。
命名空间是通向外部世界的门户
传入进程的一些初始句柄是进程挂载到namespace的目录,这些句柄允许进程发现并与系统上运行的其他进程通信,包括文件系统和其他服务。有关更多详细的信息,请查看命名空间。
赋予进程的命名空间会强烈作用于进程可以对系统发挥的影响。因此,配置进程运行的沙箱相当于配置进程的命名空间。
包和命名空间
在我们当前的实现中,如果进程的二进制文件包含在程序包中,则进程将在沙箱中运行。随着包管理器的发展,这些细节可能会发生变化。
默认情况下,从包运行的组件可以访问两个名称空间:
/svc
:是来自组件运行环境的一组服务。/pkg
:是包含该组件程序包的只读视图。
一个典型的组件将与/svc
中的许多服务进行交互,以便在系统中发挥应有的作用。
要在运行时访问这些资源,进程可以使用/pkg
命名空间。例如,root_presenter
可以使用绝对路径/pkg/data/cursor32.png
来访问cursor32.png
。
配置额外的命名空间
如果进程需要访问额外的资源(例如,设备驱动程序),则程序包可以通过在它自身的组件清单文件(英文原文)中包含sandbox
属性来请求访问其他额外的名称。例如,以下meta/sandbox
文件可以请求直接访问输入驱动程序:
{
"dev": [ "class/input" ]
}
在当前的实现中,AppMgr用于授权所有此类请求,但随着系统的演化,未来可能会发生变化。
构建程序包
为了构建一个包,请使用gn
在//build/package.gni
中定义的package()
宏。有关资源的详细信息,请参阅package()
宏的相关文档。
例如,可以参阅https://github.com/fuchsia-mirror/garnet/blob/master/packages/prod/fortune和https://github.com/fuchsia-mirror/garnet/blob/master/bin/fortune/BUILD.gn文件。