MinFS 是專為 Zircon 建構的簡易 Unix 檔案系統。
目前支援的檔案大小上限為 4 GB。
使用 MinFS
主機裝置 (僅限 QEMU)
建立儲存 MinFS 的磁碟映像檔
$ truncate --size=16G blk.bin在平台上執行 zircon 指令碼,並使用「--」將引數直接傳遞至 QEMU,然後使用「-hda」指向檔案。如要附加其他裝置,可以使用「-hdb」、「-hdc」等指令。
fx set bringup.x64 fx build fx qemu -- -hda blk.bin
目標裝置 (QEMU 和實際硬體)
請務必小心,不要格式化錯誤的裝置。如有疑慮,請只透過 QEMU 執行下列指令。lsblk 指令可用於查看可從 Zircon 存取的裝置相關資訊。
在 zircon 中,
lsblk可用於列出系統上目前的區塊裝置。在以下範例系統中,/block/000/fuchsia.storage.block.Block是原始區塊裝置。> lsblk ID DEV DRV SIZE TYPE LABEL 000 block block 16G接著,我們將 GPT 新增至這個區塊裝置。
> gpt init /block/000/fuchsia.storage.block.Block ... > lsblk ID DEV DRV SIZE TYPE LABEL 002 block block 16G現在這部裝置上有 GPT 了,來看看可以怎麼運用。 (注意:操作 gpt 後,裝置編號可能會變更。使用
lsblk追蹤如何參照區塊裝置。> gpt dump /block/002/fuchsia.storage.block.Block blocksize=512 blocks=33554432 Partition table is valid GPT contains usable blocks from 34 to 33554398 (inclusive) Total: 0 partitionsgpt dump會提供一些重要資訊:(1) 區塊大小,以及 (2) 實際可用的區塊。接著,我們用 MinFS 檔案系統填滿部分磁碟。> gpt add 34 20000000 minfs /block/002/fuchsia.storage.block.Block在 Zircon 中,將分區格式化為 MinFS。使用
lsblk時,您應該會看到一個區塊裝置 (即整個磁碟),以及一個稍小的裝置 (即分區)。在上述輸出內容中,分區是裝置 003,路徑為/block/003/fuchsia.storage.block.Block> mkfs <PARTITION_PATH> minfs如要讓裝置在重新啟動時自動掛接,請使用 GPT 工具設定類型。如上所述,您必須再次使用
lsblk找出磁碟項目。我們要編輯第 0 個分區的類型。這裡我們使用關鍵字「fuchsia-data」設定類型 GUID,但如果您想使用任意 GUID,請在「fuchsia-data」的使用位置提供。> gpt edit 0 type fuchsia-data <DEVICE_PATH>日後每次啟動時,分區都會自動掛接在
/data。如果不想自動掛接分區,可以更新分區的瀏覽權限 (或 GUID),並手動掛接。
> mount <PARTITION_PATH> /data寫入
/data(這個 GUID 的掛接點) 的任何檔案都會在重新啟動後保留。如要測試,請嘗試在新的 MinFS 磁碟區上建立檔案,重新啟動,並觀察檔案是否仍存在。> touch /data/foobar > power reboot > ls /data如要找出指定路徑下各子目錄掛接的區塊裝置/檔案系統,請使用下列指令:
> df <PATH>
Minfs 作業
以下章節說明為完成簡單的使用者作業 (例如 read()/write()),系統會執行哪些 IO。
假設
- 無論是讀取或寫入,都不會快取或批次處理。每項作業都像是呼叫同步和直接 IO 設定。
- 重新命名:目的地檔案不存在。如果重新命名作業的目的地是有效檔案,重新命名可能會刪除檔案。這項假設可簡化數學運算。
- 「寫入」作業會將單一資料區塊寫入先前未存取的 vnode 部分。
- 「覆寫」作業會對先前由「寫入」作業分配的部分區塊,發出單一資料區塊寫入指令。
資料欄的鍵。
- 作業:檔案系統用戶端要求的動作。
- 區塊類型:每項檔案系統作業都會存取一或多種類型的區塊。
- 資料:包含使用者資料和目錄項目。
- 間接:檔案區塊對應樹狀結構中的間接區塊
- Dindirect:檔案區塊對應樹狀結構中的雙重間接區塊。
- Inode 表格:Inode 表格區塊,可存放一或多個 inode。
- Inode 點陣圖:包含位元陣列,每個位元代表 inode 的可用/已使用狀態。
- 資料點陣圖:包含位元陣列,每個位元代表資料區塊的可用/已使用狀態。
- 超級區塊:包含描述檔案系統版面配置和狀態的資料。
- IO TYPE:IO 存取權的類型 (讀取/寫入)。
- JOURNALED:是否要記錄 IO。讀取作業不會記錄,但部分寫入作業會記錄。
- 有條件存取:視作業的輸入參數和檔案系統狀態而定,部分區塊會受到有條件存取。
- 否:一律執行 IO。
- 是:檔案系統狀態和輸入參數會決定是否需要這個 IO。
- READ COUNT:讀取的檔案系統區塊數量。
- WRITE COUNT (IGNORING JOURNAL):寫入的檔案系統區塊數量。寫入日誌或日誌記錄負擔不計入這個數字。
- 寫入次數 (含日誌):寫入日誌,然後寫入最終位置的檔案系統區塊數量。這不包括日誌寫入用來維護日誌狀態的區塊。
「<作業> 總計」列 (例如「建立總計」) 會顯示讀取/寫入的區塊總數。對於涉及日誌記錄的作業,日誌會為每項作業寫入兩個額外的區塊:日誌項目標頭和修訂區塊。
啟動(掛接/fsck) 檔案系統時,超級區塊、索引節點資料表、索引節點點陣圖、資料點陣圖和部分日誌會快取在記憶體中。因此,系統不會針對這些區塊類型發出讀取 IO。
| 作業 | 封鎖類型 | IO 類型 | JOURNALED | 有條件存取 | 讀取次數 | 寫入次數(忽略日誌) | 寫入次數(含日誌) | 留言 |
|---|---|---|---|---|---|---|---|---|
| 查詢/開啟 | 資料 | 閱讀 | 否 | 否 | >=1 | 0 | 0 | 如果目錄很大,系統會讀取多個區塊。 |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | 查詢作業可由直接區塊提供。因此間接為選用。 | |
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | 查詢作業可由直接區塊提供。因此 dindirect 為選用。 | |
| 查詢/開啟總數 | >=1 | 0 | 0 | |||||
| 建立 | 資料 | 閱讀 | 否 | 否 | >=1 | 0 | 0 | 建立作業會先查詢名稱是否衝突。 |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 資料 | 寫入 | 是 | 否 | 0 | >=1 | >=2 | ||
| 間接 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| DIndirect | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| Inode 資料表 | 寫入 | 是 | 否 | 0 | 1 | 2 | 新檔案的 inode。 | |
| Inode 點陣圖 | 寫入 | 是 | 否 | 0 | 1 | 2 | 將 inode 標示為已分配。 | |
| 資料點陣圖 | 寫入 | 是 | 否 | 0 | >=0 | >=0 | 目錄可能會擴充,納入新的目錄項目。 | |
| 超級區塊 | 寫入 | 是 | 否 | 0 | 1 | 2 | 此外,分配的 inode 編號也會變更。 | |
| 建立總計 | >=1 | >=4 | >=10 | 包含 2 個日誌項目區塊。 | ||||
| 重新命名 | 資料 | 閱讀 | 否 | 否 | >=1 | 0 | 0 | 重新命名涉及在來源目錄中查詢。 |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 資料 | 寫入 | 是 | 否 | 0 | >=1 | >=2 | 來源目錄項目。 | |
| 間接 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| DIndirect | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| Inode 資料表 | 寫入 | 是 | 否 | 0 | 1 | 2 | 更新來源目錄 inode。 | |
| 資料 | 閱讀 | 否 | 否 | >=0 | 0 | 0 | 重新命名涉及在來源目錄中查詢。 | |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 資料 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | 寫入目的地目錄項目。 | |
| 間接 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| DIndirect | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| Inode 資料表 | 寫入 | 是 | 是 | 0 | 1 | 2 | 更新目的地目錄 inode。 | |
| Inode 資料表 | 寫入 | 是 | 否 | 0 | 1 | 2 | 重新命名檔案的 mtime。 | |
| 資料點陣圖 | 寫入 | 是 | 否 | 0 | >=0 | >=0 | 如果我們分配了資料,則為間接或 Dindirect 區塊。 | |
| 超級區塊 | 寫入 | 是 | 否 | 0 | 1 | 2 | ||
| 重新命名總計 | >=1 | >=5 | >=12 | 包含 2 個日誌項目區塊。 | ||||
| 閱讀 | 資料 | 閱讀 | 否 | 否 | >=1 | 0 | 0 | |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 讀取總計 | >=1 | 0 | 0 | |||||
| 寫入 | 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | 即使寫入作業並非覆寫,我們仍可能與現有資料共用 (D)indirect 區塊。導致讀取、修改、寫入。 |
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 資料 | 寫入 | 否 | 否 | 0 | 1 | 1 | ||
| 間接 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| DIndirect | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| Inode 資料表 | 寫入 | 是 | 否 | 0 | 1 | 2 | Inode 的 mtime 更新。 | |
| 資料點陣圖 | 寫入 | 是 | 否 | 0 | 1 | 2 | 分配的區塊。 | |
| 超級區塊 | 寫入 | 是 | 否 | 0 | 1 | 2 | 已分配區塊數量的變化。 | |
| 寫入總量 | >=0 | >=4 | >=9 | 包含 2 個日誌項目區塊。 | ||||
| 覆寫 | 資料 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | 讀取、修改、寫入。 |
| 間接 | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| DIndirect | 閱讀 | 否 | 是 | >=0 | 0 | 0 | ||
| 資料 | 寫入 | 否 | 否 | 0 | 1 | 1 | ||
| 間接 | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| DIndirect | 寫入 | 是 | 是 | 0 | >=0 | >=0 | ||
| Inode 資料表 | 寫入 | 是 | 否 | 0 | 1 | 2 | ||
| 資料點陣圖 | 寫入 | 是 | 否 | 0 | 1 | 2 | 寫入新的分配。 | |
| 資料點陣圖 | 寫入 | 是 | 否 | 0 | >=0 | >=0 | 釋出舊區塊。這個區塊位元可能屬於已分配的區塊點陣圖。 | |
| 超級區塊 | 寫入 | 是 | 否 | 0 | 1 | 2 | ||
| 覆寫總計 | >=0 | >=4 | >=9 | 包含 2 個日誌項目區塊。 |