Starnix 容器

Starnix 容器可讓您在不同的 Linux 環境中執行 Linux 二進位檔。

Starnix 容器總覽

Starnix 容器 (在概念上與 Linux 容器或虛擬機器類似) 是 Starnix 核心執行個體與磁碟映像檔的組合,用來執行一組 Linux 程序。舉例來說,debian_container 元件是 Starnix 容器,其中包含小型 Debian 型 Linux 系統。請注意,這個元件會將 starnix 指定為其執行元件 (請參閱 debian_container.cml)。這表示此 Starnix 容器元件並不代表單一程序,而是在 Fuchsia 上由 Starnix 執行和管理的完整 Linux 環境。

Starnix 容器、Starnix 核心和 Starnix 執行元件

下列定義有助於瞭解本頁的概念:

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

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

為了啟動 Starnix 容器,Fchsia 要求 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 二進位檔

做為 Fuchsia 元件的 Linux 二進位檔可在現有的 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/fortune) 從 Linux 環境的檔案系統執行二進位檔)。

這個機器最常用於測試透過 Fuchsia 套件執行 Linux 二進位檔。測試通常會提供測試固件,以及需與測試一併出現在容器內的其他資料。常見的做法是將這項資料與測試二進位檔 (Linux 二進位檔) 一起封裝為 Fuchsia 元件,然後要求測試專用的 Starnix 容器執行測試。此機制可讓測試在 Starnix 容器中執行時,存取其固件和其他資料。

不過,Linux 二進位檔應會在包含所有執行階段依附元件的環境中執行。這些執行階段依附元件與二進位檔到二進位檔不同,且不一定相容。舉例來說,某些二進位檔需要 glibc,而其他二進位檔則需要使用 musl。因此,Fuchsia 套件中的 Linux 二進位檔必須與 Starnix 容器提供的 Linux 環境相容。舉例來說,如果 Linux 二進位檔已連結至 glibc,則這些二進位檔必須在有 glibc 的 Starnix 容器中執行,例如 Debian Linux 發行版。同樣地,許多 Linux 二進位檔也會假設檔案系統的版面配置。這類 Linux 二進位檔必須在 Starnix 容器中執行,且該容器的檔案系統版面配置符合預期。