Starnix 容器

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 容器:包含 Starnix 核心執行個體設定值的 Fuchsia 元件。
  • Starnix 核心 (starnix_kernel):負責執行 Linux 程式的 Fuchsia 元件。這個元件會執行 Starnix 容器,並在 Starnix 容器中建立及執行 Linux 程序。這個元件也可以在 Starnix 容器中執行其他 Fuchsia 元件 (設定為執行 Linux 二進位檔)。
  • Starnix 執行器 (starnix_runner):負責建立 Starnix 核心執行個體的 Fuchsia 元件。

以 Fuchsia 元件的形式執行 Starnix 容器

如要啟動 Starnix 容器,Fuchsia 會要求 Starnix 執行元件啟動 Starnix 容器元件。Starnix 執行元件會建立新的 Starnix 核心執行個體,做為這個容器的核心。Starnix 核心會從 Starnix 容器元件讀取 program 區塊,其中提供下列資訊:

  • 要在 Linux 環境中的哪些路徑掛接哪些磁碟映像檔。
  • 要以 init 形式執行的二進位檔 (這是啟動 Linux 啟動程序的初始程序)。

雖然 Starnix 核心會執行 Starnix 容器元件,但 Starnix 容器並非 Starnix 核心元件階層的一部分 (請參閱圖 1),就像 ELF 執行工具並非其執行元件的父項一樣。

Starnix 元件階層

圖 1. 執行 Starnix 元件的 Fuchsia 系統簡化元件階層。

Starnix 容器中的 Linux 環境

在 Starnix 容器內的 Linux 環境中,就像一般的 Linux 系統一樣,大多數 Linux 程序都是從其他 Linux 程序分支而來,從 init 程序開始 (不過,該程序是由 Starnix 容器中的 Starnix 核心建立)。舉例來說,init 可能會分支並建立 sshd 程序,然後監聽通訊埠。當 sshd 在該通訊埠收到網路連線時,可能會產生 sh 程序,做為該連線的指令列殼層。

在 Starnix 容器中執行 Linux 二進位檔

Linux 二進位檔做為 Fuchsia 元件,可在現有的 Starnix 容器中執行。Starnix 容器本身是元件執行元件,可在容器內執行 Fuchsia 元件。

下列 Linux 二進位檔可在 Starnix 容器中做為 Fuchsia 元件執行:

  • 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 元件)。

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 容器中執行,且該容器的檔案系統版面配置必須符合預期。