Fuchsia 命名空間

命名空間是 Fuchsia 中檔案存取和服務探索的重要支柱。

定義

命名空間是一種複合階層,當中包含檔案、目錄、通訊端、服務、裝置,以及其他提供給元件的已命名物件。

讓我們解開一點吧。

已命名物件:命名空間包含可列舉及存取的物件,就像列出目錄或開啟檔案一樣。

複合階層:命名空間是物件的「樹狀結構」,由其他命名空間中的物件子樹狀結構將物件「組合」組合成複合結構,其中每個部分都已依慣例指派路徑前置字串。

每個元件的命名空間:每個元件都會收到專屬的命名空間,以滿足自身需求。也可以發布自己的物件以納入其他命名空間中。

您也可以將命名空間和元件分開,雖然本文著重說明一般的元件繫結用途,但也可以單獨使用命名空間。

「命名空間」應用實例

您可能已經花一些時間探索 Fuchsia 命名空間,而且這些命名空間無所不在。如果您在指令列殼層提示中輸入 ls /,系統將列出可從殼層的命名空間存取的部分物件清單。

Fuchsia 與其他作業系統不同,並沒有「根檔案系統」,如前文所述,命名空間是依元件定義,而不是全域或個別程序。

請留意以下事項:

  • 沒有任何全域「根」命名空間。
  • 沒有「在已啟用 Root 權限的環境中執行」概念,因為每個元件有效都有自己的私人「根」
  • 元件會接收符合特定需求專屬的命名空間。
  • 命名空間界線的物件路徑可能不太有意義。
  • 一個程序可能會同時存取數個不同的命名空間。
  • 用來控管檔案存取權的機制也可用於根據個別元件,控管服務和其他已命名物件的存取權。

物品

命名空間中的項目稱為物件。這些遊戲有多種口味,包括:

  • 檔案:包含二進位資料的物件
  • 目錄:包含其他物件的物件
  • Socket (通訊端):開啟時建立連線的物件,例如具名管道
  • 服務:這類物件在開啟時提供 FIDL 服務
  • 裝置:提供硬體資源存取權的物件

存取物件

如要存取命名空間中的物件,您必須擁有其他物件。元件通常會在命名空間轉移期間接收其命名空間範圍內物件的管道控制。

您也可以實作適當的 FIDL 通訊協定,以空空氣形式建立新物件。

取得物件的管道後,您可以傳送 FIDL 訊息給其子物件開啟管道,其中含有可識別所需子物件的物件相對路徑運算式。這與開啟目錄中的檔案很類似

請注意,您只能存取可從您已有權存取的物件存取的物件。沒有背景授權。

現在,我們要定義物件名稱和路徑的建構方式。

物件名稱

物件名稱是物件在容器 (例如目錄) 中的本機專屬標籤,請注意,名稱是容器子物件資料表的屬性,而非物件本身的屬性。

舉例來說,cat 會指定位於 Open() 要求某些未指定收件者內的毛茸茸物件。

物件本質上沒有名稱,但他人可能會呼叫許多名稱。

物件名稱是以二進位八進位字串 (任意位元組序列) 表示,但必須遵守下列限制:

  • 長度下限為 1 個位元組。
  • 長度上限為 255 個位元組。
  • 不包含 NUL (零值位元組)。
  • 不含「/」。
  • 不等於 ...
  • 一律使用位元組與位元組的相等性 (意即有大小寫之分) 進行比較。

物件名稱是容器 Open() 方法的有效引數。請參閱 FIDL 通訊協定

該物件名稱必須編碼成使用者可理解的 UTF-8 圖形字元,但是該屬性並非由命名空間強制執行。

因此,用戶端應負責決定如何向使用者顯示包含無效、無法顯示或模稜兩可字元序列的名稱。

物件相對路徑運算式

物件相對路徑運算式是物件名稱或以 / 分隔的物件名稱序列,會指定一系列要周遊的巢狀物件,以找出容器中的物件 (例如目錄)。

舉例來說,house/box/cat 指定位於該物件內的 box 物件裡,位於其包含的物件內,位於名為 house 且位於某個 Open() 要求的特定收件者內。

物件相對路徑運算式一律會從更深入地掃遍命名空間。值得注意的是,命名空間不會直接支援從容器向上掃遍 (例如透過 ..),但這項功能可能會由用戶端部分模擬 (請見下文)。

物件相對路徑運算式有下列額外的限制:

  • 長度下限為 1 個位元組。
  • 長度上限為 4095 個位元組。
  • 開頭或結尾不得為 /
  • 所有區隔都是有效的物件名稱。
  • 一律使用位元組與位元組的相等性 (意即有大小寫之分) 進行比較。

物件相對路徑運算式是容器 Open() 方法的有效引數。請參閱 FIDL 通訊協定

用戶端解讀路徑運算式

用戶端解讀的路徑運算式是物件相對路徑運算式的通用化,但包含可由用戶端程式碼模擬的選用功能,以加強與預期檔案型檔案類介面的程式的相容性。

從技術層面來說,這些功能不在 Fuchsia 命名空間通訊協定的範圍內,但經常會用到,因此我們在此說明這些功能。

  • 用戶端可以將其中一個命名空間指定為「根層級」。這個命名空間會顯示為 /
  • 用戶端可能會預先輸入一個 /,以建立相對於其指定根命名空間的路徑。
  • 用戶端可以透過稱為用戶端「標準化」的程序,使用 .. 路徑區段一起折疊片段 (假設容器的路徑已知),藉此建立與容器往上層的路徑。
  • 這些功能可能會合併使用。

例如,/places/house/box/../sofa/cat 會在某些指定「根」容器中,指定位於 places/house/sofa/cat 的滾動物件。

用戶端解譯的路徑運算式包含這些選用功能,並非容器 Open() 方法的有效引數;這些運算式必須先由用戶端翻譯,才能與命名空間通訊。請參閱 FIDL 通訊協定

舉例來說,fdio 會在檔案操縱 API (例如 open()stat()unlink() 等) 中實作 .. 路徑的用戶端解譯。

命名空間移轉

元件啟動 (例如啟動程序) 時會收到資料表,將一或多個命名空間路徑前置字串對應至物件控制代碼。

表格中的路徑前置字串,是按照慣例將相關物件的預期重要性編碼。舉例來說,pkg 前置字串應與目錄物件建立關聯,目錄物件中包含元件專屬的二進位檔和資產。

詳情請見下一節。

命名空間慣例

本節說明在 Fuchsia 上執行一般元件的命名空間版面配置。

元件命名空間的精確內容和結構會因元件的角色、類型、身分、範圍、與其他元件的關係以及權限而有所不同。如要瞭解命名空間如何使用命名空間為元件建立沙箱,請參閱沙箱機制

如要進一步瞭解元件可接收的命名空間,請參閱與要實作的元件類型相關的說明文件。

一般物件

元件命名空間可能包含一些常見的物件:

  • 元件套件中的唯讀執行檔和資產。
  • 私人本機永久儲存空間。
  • 私人臨時儲存空間。
  • 由系統、元件架構,或啟動元件的用戶端提供給元件的服務。
  • 裝置節點 (適用於驅動程式和具有特殊權限的元件)。
  • 設定資訊。

一般目錄結構

  • pkg/:目前程式套件的內容 (與套件簽署時相同)
    • bin/:套件中的可執行二進位檔
    • lib/:套件中的共用程式庫
    • data/:套件中的資料,例如資產
  • data/:本機永久儲存空間 (讀寫,僅限元件)
  • tmp/:臨時儲存空間 (讀寫,僅限元件的私人)
  • svc/:提供給元件的通訊協定和服務
    • fuchsia.process.Launcher:啟動程序
    • fuchsia.logger.Log:記錄訊息
    • vendor.topic.Interface供應商定義的服務
  • dev/:裝置樹狀結構 (視需要向具有特殊權限的元件顯示相關部分)
    • class/……
  • config/:元件設定資料
    • build-info/:建構資訊檔案的標準路徑。
    • ssl/:SSL 憑證的標準路徑
    • tzdata/:時區資料檔案。第一個子路徑應為資料格式名稱,例如 tzif2/...icudata/...

命名空間參與者

以下提供幾個與 Fuchsia 命名空間通訊協定互動及支援之抽象的相關資訊。

檔案系統

檔案系統能讓檔案在命名空間中存取。

檔案系統只是一個元件,會從他人的命名空間發布類似檔案的物件。

通訊協定

通訊協定

「通訊協定控制代碼」是由實作 FIDL 通訊協定支援的管道物件,可透過命名空間探索。通訊協定名稱會對應至命名空間 /svc 分支中的路徑,元件可以從該位置存取實作。

例如,預設的 Fuchsia 記錄通訊協定為 fuchsia.logger.Log,命名空間中的路徑為 /svc/fuchsia.logger.Log

如要進一步瞭解通訊協定和元件,請參閱通訊協定功能

服務

服務

「服務控制代碼」是一個目錄,其中包含相關的 FIDL 通訊協定。您可使用命名空間探索這些通訊協定的實作方式。服務名稱會對應至命名空間 /svc 分支中的路徑,元件可從該名稱存取實作項目。

如要進一步瞭解服務和元件,請參閱服務功能

元件

元件會使用及擴充命名空間。

元件是一種可執行程式物件,會在某些拓撲中執行個體化,並提供命名空間。

元件會透過兩種方式加入 Fuchsia 命名空間:

  1. 這個 API 可以「使用」提供的命名空間中的物件,例如傳入的通訊協定與服務,或是自身的套件內容。
  2. 容器能以命名空間的形式,透過傳出目錄將物件「發布」publish至其他元件。