在本部分中,您将了解 Zircon 内核对象如何让 Fuchsia 遵循最小权限原则,隔离进程并仅向其授予所需的功能。
沙盒
创建新进程时,该进程没有任何功能。通过传递给它的一组 handle。也可以说,空进程没有环境权限。
因此,进程通常会带有一些初始资源和功能进行创建。fuchsia.process.Launcher
协议提供了一个低级接口,用于通过可执行文件和一组内核对象句柄在系统上创建新进程。大多数软件都使用组件框架,该框架简化了设置新进程的工作,以便使用一组标准的初始功能来执行某些代码。您稍后将详细了解组件。
向进程提供的一些初始句柄是进程挂载到其命名空间的目录。
命名空间
进程的命名空间包含其对世界的私有视图,并控制进程可以影响的 Fuchsia 系统的范围。 这实际上定义了该进程运行的沙盒的规则。
命名空间中填充了各种资源对象,包括:
- 文件:包含二进制数据的对象。
- 目录:包含其他对象的对象。
- 套接字:在打开时建立连接的对象,例如命名管道。
- 协议和服务:在打开时提供结构化服务的对象。
- 设备:用于访问硬件资源的对象。
进程的创建者会根据一组必需的功能填充命名空间的内容。进程无法将对象添加到自己的命名空间,因为这实际上相当于该进程自行授予访问这些对象的功能。
练习:命名空间
在本练习中,您将探索组件的命名空间中的内容。
启动模拟器
如果您还没有运行的实例,请启动模拟器:
ffx emu start --headless
启动完成后,模拟器会输出以下消息并返回:
Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
Waiting for Fuchsia to start (up to 60 seconds)........
Emulator is ready.
查找目标组件
您在上一部分中了解到,与组件关联的进程使用 .cm
扩展名进行命名。回想一下以下示例流程列表:
TASK PSS PRIVATE SHARED STATE NAME
j: 1027 507.8M 507.4M root
p: 1061 564.4k 564k 36k bin/bootsvc
p: 1150 4264.4k 4264k 36k bin/component_manager
j: 1479 228.4k 228k
p: 1583 228.4k 228k 36k pwrbtn-monitor.cm
j: 1484 532.4k 532k
p: 1599 532.4k 532k 36k svchost.cm
j: 1544 402.4k 304k
p: 1633 402.4k 304k 232k netsvc.cm
j: 1681 296.4k 296k
p: 1733 296.4k 296k 36k console-launcher.cm
j: 1799 7232.4k 7232k
p: 1825 7232.4k 7232k 36k archivist.cm
...
j: 31294 1872.2K 1872K
p: 31331 1872.2K 1872K 20K http-client.cm
在本练习中,您将使用 http-client.cm
作为要探索的目标。
连接到目标组件
如需探索组件的命名空间,您需要确定该组件在系统中的唯一标识符。这称为“标识名”。
使用 ffx component show
命令列出与组件相关的其他详细信息,包括组件标识名:
ffx component show http-client.cm
该命令会输出类似于以下内容的输出:
$ ffx component show http-client.cm
Moniker: /core/network/http-client
URL: #meta/http-client.cm
Type: CML static component
...
您可以使用 ffx component explore
命令在目标组件的环境中打开交互式 shell。请针对 http-client
组件尝试以下操作:
ffx component explore /core/network/http-client
在探索 Shell 中,使用 ls
命令列出根目录的内容:
[explore shell] $ ls
bin
exposed
ns
out
runtime
svc
探索命名空间
您可以在环境内的 /ns
路径下找到组件的命名空间。
在探索 Shell 中,列出命名空间的内容:
[explore shell] $ ls /ns
config
pkg
svc
下面简要介绍了各个元素的亮点:
config/
:组件的配置数据pkg/
:组件软件包的内容svc/
:可供组件使用的系统服务
在探索 Shell 中,列出传入 /ns/svc
目录的内容。此目录包含表示向此组件提供的系统服务的服务节点。
[explore shell] $ ls /ns/svc
fuchsia.logger.LogSink
fuchsia.net.name.Lookup
fuchsia.posix.socket.Provider
这些服务中的每项都可以通过由 Fuchsia 接口定义语言 (FIDL) 定义的众所周知的协议进行访问。 我们稍后会详细介绍 FIDL 协议以及如何访问各种服务。
在探索 Shell 中,输入 exit
以返回开发机器上的 Shell:
[explore shell] $ exit