雖然大多數元件會透過檔案系統使用儲存空間功能與儲存空間互動,但某些元件可能需要直接讀取及寫入分割區。本指南說明如何將分割區路由至元件。
大致步驟如下:
- 在主機板設定中定義語意標籤:定義實體分割區標籤到「語意」標籤的對應,這會是能力轉送中使用的分割區名稱。
- 更新元件資訊清單:將區塊裝置的目錄能力路徑傳送至元件。
- 在元件中存取區塊裝置:元件會使用已路由的目錄能力存取區塊裝置。
步驟
1. 在主面板設定中定義語意標籤
首先,請在主機板的設定中為實體分割區宣告語意標籤,通常是位於 //boards/
或供應商專屬對等項目中的 .bazel
或 .bzl
檔案。
在看板設定中,將 block_devices
清單新增至 filesystems
字典。這個清單中的每個項目都是字典,用於定義新的具名裝置。
device
:您將用來在元件資訊清單中參照這個分割區的語意標籤。from
:指定磁碟上應找到分割區的位置。label
:要轉送的分區 GPT 標籤。parent
:父項裝置,通常是「gpt」。
範例:在開發板的 BUILD.bazel
檔案中:
# In a board definition
fuchsia_board_configuration(
name = "my_board",
...
filesystems = {
"block_devices": [
{
"device": "my_partition",
"from": {
"label": "my-partition-label",
"parent": "gpt",
},
},
{
"device": "my_other_partition",
"from": {
"label": "my-other-partition-label",
"parent": "gpt",
},
},
],
...
},
...
)
這項設定會提供給 fshost
,後者會比對標籤為「my-partition-label」的 GPT 分區,並在「/block/my_partition」提供這些分區 (my-other-partition-label 也是如此)。
2. 將 Block 裝置路徑傳送至元件
設定好主機板後,您必須將區塊裝置的能力從 fshost
路由至元件。具體做法是在拓撲中的父項元件元件資訊清單 ( .cml
檔案) 中新增 offer
節。
這項能力是 fshost
在 /block
路徑下提供的 directory
。如要選取特定分割區,請在 offer
節中使用 subdir
參數,該參數必須與您在主機板設定中定義的 device
名稱相符。
在本範例中,我們會將分割區路由至 core
領域中的元件,但其他領域的步驟也大同小異。修改元件的核心分片,將分割區路徑傳送至該分片:
// my_component.core_shard.cml
{
offer: [
{
directory: "block",
from: "parent",
to: "#my_component",
subdir: "my_partition",
as: "my_partition",
},
{
directory: "block",
from: "parent",
to: "#my_component",
subdir: "my_other_partition",
as: "my_other_partition",
},
...
],
...
}
3. 在元件中使用 Block Device
最後一個步驟是讓元件 use
成為已路由目錄能力。
在元件的資訊清單 ( my_component.cml
) 中,為目錄新增 use
節。
示例:my_component.cml
{
use: [
{
directory: "my_partition",
rights: [ "r*" ],
path: "/block/my_partition",
},
{
directory: "my_other_partition",
rights: [ "r*" ],
path: "/block/my_other_partition",
},
...
],
}
現在,您的元件可以在 /block
存取命名空間中的分割區。如要連線至特定分割區的 fuchsia.hardware.block.volume.Volume
通訊協定,請透過下列路徑連線:
use fidl_fuchsia_hardware_block_volume::VolumeMarker;
use block_client::RemoteBlockClient;
async fn connect_to_my_partition() -> Result<(), anyhow::Error> {
let proxy = fuchsia_component::client::connect_to_protocol_at::<VolumeMarker>(
"/block/my_partition/fuchsia.hardware.block.volume.Volume"
)?;
let block_client = RemoteBlockClient::new(proxy).await?;
// ... use the block client
Ok(())
}