MinFS 是專為 Zircon 打造的簡易 Unix 檔案系統,
目前支援的檔案大小上限為 4 GB。
使用 MinFS
主機裝置 (僅限 QEMU)
建立儲存 MinFS 的磁碟映像檔
# (Linux) $ truncate --size=16G blk.bin # (Mac) $ mkfile -n 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
可用來列出系統上目前的封鎖裝置。在下面的範例系統中,/dev/class/block/000
是原始區塊裝置。> lsblk ID DEV DRV SIZE TYPE LABEL 000 block block 16G
接下來要新增 GPT 到這個封鎖裝置
> gpt init /dev/class/block/000 ... > lsblk ID DEV DRV SIZE TYPE LABEL 002 block block 16G
裝置現在有了 GPT,接下來讓我們看看 如何應用這些發布商廣告代碼。 (注意:在操作 gpt 後,裝置號碼可能會改變。使用
lsblk
即可追蹤如何參照區塊裝置)。> gpt dump /dev/class/block/002 blocksize=512 blocks=33554432 Partition table is valid GPT contains usable blocks from 34 to 33554398 (inclusive) Total: 0 partitions
gpt dump
會告訴我們一些重要資訊:它可以告訴我們 (1) 龐大的區塊,以及 (2) 我們實際可以使用的區塊。讓我們使用 MinFS 檔案系統來填滿磁碟的部分。> gpt add 34 20000000 minfs /dev/class/block/002
在 Zircon 中,將分區的格式設為 MinFS。使用
lsblk
時,您應該會看到區塊裝置,也就是整個磁碟,也是較小的裝置,也就是分區。在上述輸出結果中,分區為裝置 003,路徑為/dev/class/block/003
> mkfs <PARTITION_PATH> minfs
如果希望裝置在重新啟動時自動掛接,請使用 GPT 工具設定裝置類型。如先前所述,您必須再次使用
lsblk
找到磁碟的項目。我們只需要編輯第零個分區的類型這裡使用關鍵字「fuchsia-data」設定 GUID,但如果您想使用任意 GUID,可在使用「fuchsia-data」的地方提供任意 GUID。> gpt edit 0 type fuchsia-data <DEVICE_PATH>
您日後的啟動裝置都將分區,自動在
/data
掛接。如果您不希望自動掛接分區,可以更新分區的瀏覽權限 (或 GUID),只要手動掛接即可。
> mount <PARTITION_PATH> /data
寫入
/data
(此 GUID 的掛接點) 的所有檔案會在不同的啟動期間保留。如要測試這一點,請嘗試以新的 MinFS 磁碟區製作檔案,然後重新啟動並觀察它仍然存在。> touch /data/foobar > dm reboot > ls /data
如果想找出哪個區塊裝置/檔案系統已掛接在指定路徑下的每個子目錄中,請使用下列指令:
> df <PATH>
Minfs 作業
下節將說明在 read()/write() 等簡易使用者作業時,系統會執行 IO。
假設
- 未快取或批次處理任何、讀取或寫入作業。這些作業都好比是同步 io 設定呼叫和呼叫,
- 重新命名:目的地檔案不存在。如果重新命名作業的目的地是有效檔案,則重新命名作業可能會刪除檔案。這個假設是為了簡化計算工作
- 「寫入」作業會將單一資料區塊寫入先前未存取的 vnode 部分。
- 「覆寫」作業會讓單一資料區塊寫入先前從先前「寫入」作業分配的區塊的一部分。
資料欄的索引鍵。
- OPERATION:檔案系統的用戶端要求的動作。
- 區塊類型:每個 Fileystem 作業都會導致存取一或多個類型的區塊。
- 資料:包含使用者資料和目錄項目。
- 間接:檔案區塊地圖樹狀結構中的間接區塊
- Dindirect:檔案區塊對應樹狀結構中的雙間接區塊。
- 節點資料表:保存一或多個 inos 的節點資料表區塊。
- 節點點陣圖:包含陣列,每個位元都代表賭場自由/使用狀態。
- 資料點陣圖:包含一組位元,每個位元代表資料區塊自由/使用狀態。
- 超級區塊:包含檔案系統的版面配置和狀態資料。
- IO 類型:屬於 IO 存取權的類型、讀取/寫入。
- JOURNALED:針對 IO 建立日誌。讀取作業不會納入日誌記錄,但部分寫入作業會留下日誌記錄。
- 存取條件:視 OPERATION 的輸入參數和檔案系統的狀態而定,某些區塊有條件地存取。
- 否:一律會執行 IO。
- 是:檔案系統狀態和輸入參數會決定是否需要這個 IO。
- READ COUNT:讀取的檔案系統區塊數量。
- 寫入 COUNT (IGNORING JOURNAL):已寫入的檔案系統區塊數量。計算日記或寫日記錄時不計入這個數值。
- 寫入 COUNT (含有 JOURNAL):寫入日誌,然後寫入最終位置的檔案系統區塊數。這不包含用來維持日誌狀態的區塊日誌寫入內容。
資料列「<operation> 總數」(例如「Create Total」) 會產生讀取/寫入的區塊總數。如果作業涉及日誌記錄,日誌會針對每個作業另外寫入兩個區塊,也就是日誌項目標頭和修訂區塊。
Superblock、Inode 資料表、I 節點點陣圖、資料點陣圖和部分日誌會在啟動(掛接/fsck) 檔案系統時快取記憶體。因此,系統不會為這些區塊類型發出讀取 IO。
營運 | 區塊類型 | IO 類型 | 修女 | 可使用的條件 | 讀取次數 | 寫入 COUNT(IGNORING JOURNAL) | 寫入次數(含 JOURNAL) | 留言 |
---|---|---|---|---|---|---|---|---|
查詢/開啟 | 資料 | 已讀 | 不可以 | 不可以 | 大於或等於 | 0 | 0 | 如果目錄較大,系統會讀取多個區塊。 |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | 查詢可透過直接區塊提供。間接為選用項目。 | |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | 查詢可透過直接區塊提供。因此 dindirect 為選用項目。 | |
查詢/開啟總計 | 大於或等於 | 0 | 0 | |||||
建立 | 資料 | 已讀 | 不可以 | 不可以 | 大於或等於 | 0 | 0 | 對名稱衝突而言,Create 會先查詢 。 |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
資料 | 寫入 | 是 | 不可以 | 0 | 大於或等於 | 大於或等於 2 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
節點資料表 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 新檔案的 I 節點。 | |
節點點陣圖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 將 inode 標示為已分配。 | |
資料點陣圖 | 寫入 | 是 | 不可以 | 0 | 大於或等於 0 | 大於或等於 0 | 目錄可能會擴增以包含新的目錄項目。 | |
超級封鎖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 此外,分配的 inode 號碼會變更。 | |
建立總計 | 大於或等於 | 4 次以上 | 大於或等於 10 | 為日誌項目加入 2 個區塊。 | ||||
重新命名 | 資料 | 已讀 | 不可以 | 不可以 | 大於或等於 | 0 | 0 | 如要重新命名,您必須在來源目錄中進行查詢。 |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
資料 | 寫入 | 是 | 不可以 | 0 | 大於或等於 | 大於或等於 2 | 來源目錄項目。 | |
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
節點資料表 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 更新來源目錄 inode。 | |
資料 | 已讀 | 不可以 | 不可以 | 大於或等於 0 | 0 | 0 | 如要重新命名,您必須在來源目錄中進行查詢。 | |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
資料 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | 正在編寫目的地目錄項目。 | |
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
節點資料表 | 寫入 | 是 | 是 | 0 | 1 | 2 | 更新目的地目錄 inode。 | |
節點資料表 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 重新命名檔案的 mtime。 | |
資料點陣圖 | 寫入 | 是 | 不可以 | 0 | 大於或等於 0 | 大於或等於 0 | 如果是我們分配的資料,則是間接區塊或間接區塊。 | |
超級封鎖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | ||
重新命名總計 | 大於或等於 | >=5 | 12 歲以上 | 為日誌項目加入 2 個區塊。 | ||||
已讀 | 資料 | 已讀 | 不可以 | 不可以 | 大於或等於 | 0 | 0 | |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
讀取總計 | 大於或等於 | 0 | 0 | |||||
寫入 | 間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | 即使寫入未覆寫,我們仍可能會與現有資料共用 (D) 間接區塊。導向讀取修改寫入。 |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
資料 | 寫入 | 不可以 | 不可以 | 0 | 1 | 1 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
節點資料表 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 節點的 mtime 更新 | |
資料點陣圖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 用於分配的區塊。 | |
超級封鎖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 已分配的區塊數量變更。 | |
寫入總計 | 大於或等於 0 | 4 次以上 | 大於或等於 9 | 為日誌項目加入 2 個區塊。 | ||||
覆寫 | 資料 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | 讀取修改寫入。 |
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
間接 | 已讀 | 不可以 | 是 | 大於或等於 0 | 0 | 0 | ||
資料 | 寫入 | 不可以 | 不可以 | 0 | 1 | 1 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
間接 | 寫入 | 是 | 是 | 0 | 大於或等於 0 | 大於或等於 0 | ||
節點資料表 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | ||
資料點陣圖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | 寫入新的分配作業。 | |
資料點陣圖 | 寫入 | 是 | 不可以 | 0 | 大於或等於 0 | 大於或等於 0 | 擺脫舊方塊。這個區塊位元可能屬於已分配的區塊點陣圖。 | |
超級封鎖 | 寫入 | 是 | 不可以 | 0 | 1 | 2 | ||
覆寫總計 | 大於或等於 0 | 4 次以上 | 大於或等於 9 | 為日誌項目加入 2 個區塊。 |