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 執行元件並非其執行的元件父項。
圖 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
元件)。
圖 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 容器中執行,且該容器的檔案系統版面配置符合預期。