儲存空間功能

儲存空間功能 在檔案系統目錄中分配每個元件的隔離儲存空間。這樣可以防止元件執行個體存取屬於其他元件的檔案,包括其本身的子項。

不同的檔案系統可能會支援不同的儲存空間功能。元件不應假設各儲存空間功能可以進行不可分割的 IO 作業。

如要進一步瞭解可在元件之間共用的目錄,請參閱目錄功能一文。

標準儲存空間能力名稱

標準名稱經常用於儲存功能。這些標準名稱都表示應將儲存空間能力用於特定目的,並提供特定行為。任何收到具備上述任一標準名稱儲存空間能力的元件,都可能會假設其提供了下述行為。

請注意,儲存空間能力名稱「不一定」可以全域識別儲存空間能力。舉例來說,在某些產品中,data 有多個不同的儲存空間功能位於元件執行個體拓撲中的不同位置。這些儲存空間功能在不同儲存空間磁碟區上由不同目錄備份,但對於使用這些儲存空間的元件執行個體,兩者的用途都相同。

並非所有儲存空間功能都會使用其中一個標準名稱。在這些情況下,對於儲存空間能力行為的任何預期,都應記錄該功能已定義儲存空間能力的地方,以及該能力重新命名的元件執行個體拓撲中的每個位置。

請注意,在測試儲存空間功能期間,建立的儲存功能可能會與這些行為不符。舉例來說,整合測試可能會提供在測試案例之間抹除的 data 能力。

data

名為「data」的儲存空間功能是用來儲存一般用途的永久資料。

元件可能會假設這些儲存空間功能中的檔案不會被系統刪除。使用 data 時,元件必須相當保守,因為合約不會在磁碟空間不足時刪除檔案。在多數情況下,建議您使用 cache

cache

名為「cache」的儲存空間功能是用來儲存可在必要時捨棄或重新產生的資料。例如可重新擷取的下載圖片。

在相同元件執行個體的不同執行作業之間,儲存在 cache 中的檔案通常會保留,但不保證會如此。即使元件正在執行,系統仍會隨時刪除檔案。

tmp

名為「tmp」的儲存空間功能是用來儲存臨時或中繼資料。

儲存在 tmp 中的檔案可能會在元件執行期間遭系統刪除。 元件執行期間,系統不會刪除檔案。當元件啟動時,tmp 通常會為空白,但不保證會如此。元件不應假設 tmp 會在啟動時為空白,但也不應使用啟動時的任何檔案。

備份目錄

當元件執行個體嘗試透過儲存空間能力存取提供給該目錄的目錄時,該架構會在該元件的幕後目錄內產生一個不重複的子目錄。

每個執行個體 ID 都是由元件 ID 索引檔案中列出的 256 位元全域不重複 ID。

以下是元件 ID 索引檔案中項目的範例,其中包含穩定的執行個體 ID:

{
    instances: [
        {
            instance_id: "47c3bf08f3e560c4dee659c28fa8d863dbdc0b1dbb74065e6cb1f38441ac759c",
            moniker: "/core/my_component",
        },
    ],
}

執行個體 ID 可讓元件的儲存空間在元件的捷徑變更 (例如將元件執行個體移至不同的領域) 時保留。使用路徑名稱是測試或其他儲存空間不需要持久耐用用途的次要選項。

如要進一步瞭解執行個體 ID,請參閱元件 ID 索引

提供儲存空間功能

如要提供儲存空間能力,元件必須宣告該能力,並從 self 轉送該功能。

{
    capabilities: [
        {
            storage: "tmp",
            from: "self",
            backing_dir: "memfs",
            storage_id: "static_instance_id",
        },
    ],
}

您必須以有效的目錄能力名稱指定 backing_dir

from 欄位會宣告提供幕後目錄的元件。如果供應器是其他元件,您可以提供元件參考資料

轉送儲存空間功能

無法向父項元件公開儲存空間功能。元件應將「支援目錄」轉送至適當的父項元件,並在其中宣告儲存空間,並提供給必要的子項。

如要進一步瞭解架構路徑元件功能,請參閱「功能轉送」。

提供

提供儲存空間能力可讓子項元件存取該能力:

{
    offer: [
        {
            storage: "data",
            from: "self",
            to: [ "#storage-user" ],
        },
    ],
}

使用儲存空間功能

如要要求能力,請為該功能新增 use 宣告:

{
    use: [
        {
            storage: "data",
            path: "/example_dir",
        },
    ],
}

這會在元件的命名空間填入包含獨立儲存空間內容的 path 目錄。

使用選用的儲存空間功能

請參閱「連線元件:使用選用功能」。

Storage 範例

請參考下列範例,假設元件 A 要求與父項共用獨立的儲存空間 tmp

// A.cml
{
    use: [
        {
            storage: "tmp",
            path: "/example_dir",
        },
    ],
}

這會在元件 A 的命名空間中,提供位於 /example_dir 的獨立儲存空間目錄。父項元件 B 使用 memfs 元件在相同領域中提供的幕後目錄,為 A 提供這項能力:

// B.cml
{
    capabilities: [
        {
            storage: "tmp",
            from: "#memfs",
            backing_dir: "memfs",
        },
    ],
    offer: [
        {
            storage: "tmp",
            from: "self",
            to: [ "#A" ],
        },
    ],
    children: [
        { name: "A", url: "fuchsia-pkg://...", },
        { name: "memfs", url: "fuchsia-pkg://..." },
    ],
}

如要進一步瞭解如何實作目錄,請參閱「目錄功能」。