Starnix 容器支持在不同的 Linux 环境中运行 Linux 二进制文件。
Starnix 容器概览
Starnix 容器(在概念上类似于 Linux 容器或虚拟机)是 Starnix 内核实例和磁盘映像的组合,用于运行一系列 Linux 进程。例如,debian_container 组件是一个 Starnix 容器,其中包含一个基于 Debian 的小型 Linux 系统。请注意,此组件将 starnix 指定为其运行程序(请参阅 debian_container.cml)。这意味着,此 Starnix 容器组件不代表单个进程,而是代表由 Starnix 在 Fuchsia 上运行和管理的整个 Linux 环境。
Starnix 容器、Starnix 内核和 Starnix 运行器
以下定义有助于理解本页面中的概念:
- Starnix 容器:一个 Fuchsia 组件,其中包含 Starnix 内核实例的配置值。
- Starnix 内核 (
starnix_kernel):负责执行 Linux 程序的 Fuchsia 组件。此组件会运行 Starnix 容器,并在 Starnix 容器中创建和执行 Linux 进程。此组件还可以在 Starnix 容器中运行其他 Fuchsia 组件(设置为运行 Linux 二进制文件)。 - Starnix 运行器 (
starnix_runner):负责创建 Starnix 内核实例的 Fuchsia 组件。
将 Starnix 容器作为 Fuchsia 组件运行
如需启动 Starnix 容器,Fuchsia 会要求 Starnix 运行器启动 Starnix 容器组件。Starnix 运行程序会创建一个新的 Starnix 内核实例,作为此容器的内核。然后,Starnix 内核会从 Starnix 容器组件中读取 program 块,该块提供以下信息:
- 要在其 Linux 环境中的哪些路径装载哪些磁盘映像。
- 要作为
init(启动 Linux 启动过程的初始进程)运行的二进制文件。
虽然 Starnix 内核运行 Starnix 容器组件,但 Starnix 容器不属于 Starnix 内核的组件层次结构(见图 1),就像 ELF 运行器不是其运行的组件的父级一样。

图 1. 运行 Starnix 组件的 Fuchsia 系统的简化组件层次结构。
Starnix 容器中的 Linux 环境
在 Starnix 容器内的 Linux 环境中,与典型的 Linux 系统一样,大多数 Linux 进程都是从其他 Linux 进程派生的,从 init 进程开始(不过,该进程是由 Starnix 容器中的 Starnix 内核创建的)。例如,init 可能会派生并创建 sshd 进程,然后该进程会监听端口。当 sshd 在该端口上收到网络连接时,它可能会生成一个 sh 进程作为该连接的命令行 shell。
在 Starnix 容器中运行 Linux 二进制文件
作为 Fuchsia 组件的 Linux 二进制文件可以在现有 Starnix 容器内运行。Starnix 容器本身是一个组件运行器,可以在容器内运行 Fuchsia 组件。
以下 Linux 二进制文件可以作为 Fuchsia 组件在 Starnix 容器内运行:
- Fuchsia 软件包中包含的 Linux 二进制文件
- 运行中的 Starnix 容器中存在的 Linux 二进制文件
换句话说,如果开发者想要在 Starnix 容器内运行 Linux 程序,可以通过以下任一方式定义 Fuchsia 组件:
- 一个组件,用于在其 Fuchsia 软件包中包含 Linux 二进制文件(设置为在 Starnix 容器中运行)。
- 用于引用已在运行的 Starnix 容器中的 Linux 二进制文件的组件。
然后,Starnix 内核会为该组件生成一个新的 Linux 进程,作为 init 的子进程。
Starnix 容器作为组件运行程序
Starnix 容器可以在 Fuchsia 组件框架中包含一个子组件 collection(请参阅 container.shard.cml)。在这种情况下,Starnix 容器会向集合提供其运行程序。如果新组件在集合中启动(或在 Starnix 容器的运行程序已路由到的组件拓扑中的任何位置启动),该组件可以使用 Starnix 容器作为其运行程序(例如,请参阅 hello_starnix 组件)。

图 2. 一个组件拓扑,显示 Starnix 容器下的一组子组件。
当 Starnix 容器被要求使用其运行程序运行组件时(根据组件的 program 块),Starnix 容器会在其 Linux 环境中生成一个 Linux 进程,作为 init 进程的子进程。
在 Fuchsia 软件包中包含 Linux 二进制文件
在 hello_starnix 组件中,program 块指定 Starnix 容器运行 hello_starnix 组件所在软件包中的 bin/hello_starnix 二进制文件。hello_starnix 组件可以从其自己的软件包运行 bin/hello_starnix 二进制文件,因为 Starnix 容器的运行程序会将 hello_starnix 组件的命名空间装载为 Starnix 容器的 Linux 环境中根文件系统的目录。(不过,program 块也可以指定 Starnix 容器使用绝对路径(例如 /bin/sh)运行 Linux 环境自身文件系统中的二进制文件。)
这种从 Fuchsia 软件包运行 Linux 二进制文件的机制最常用于测试。测试通常附带测试固件和其他数据,这些数据需要与测试一起存在于容器中。通常,我们会将这些数据与测试二进制文件(一个 Linux 二进制文件)一起打包为一个 Fuchsia 组件,并要求一个测试专用的 Starnix 容器来运行测试。 此机制可让测试在 Starnix 容器内运行时访问其固件和其他数据。
不过,Linux 二进制文件应在包含其所有运行时依赖项的环境中运行。这些运行时依赖项因二进制文件而异,并且并不总是兼容。例如,某些二进制文件需要 glibc,而其他二进制文件可能需要 musl。因此,Fuchsia 软件包中的 Linux 二进制文件需要与 Starnix 容器提供的 Linux 环境兼容。例如,如果 Linux 二进制文件链接到 glibc,则必须在具有 glibc 的 Starnix 容器(例如 Debian Linux 发行版)中运行。同样,许多 Linux 二进制文件都会对文件系统布局做出假设。此类 Linux 二进制文件需要在 Starnix 容器中运行,该容器的文件系统布局应符合其预期。