MinFS 是一個類似 UniFS 的簡易檔案系統,專為 Zircon 打造。
目前支援的檔案大小上限為 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 和 Real Hardware)
請勿格式化錯誤的裝置。如有疑慮,請僅執行
透過 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
找出磁碟的項目。假設我們要編輯「0」的 這裡使用關鍵字「fuchsia-data」設定 GUID 類型,不過 如要使用任意 GUID,請在 「fuchsia-data」> gpt edit 0 type fuchsia-data <DEVICE_PATH>
日後在任何啟動時,分區都會自動掛接到
/data
。如果您不希望自動掛接分區,可以更新 並手動掛接該分區。
> mount <PARTITION_PATH> /data
所有寫入
/data
(這個 GUID 的掛接點) 的檔案都會保留下來 因此不會遇到任何啟動如要測試這一點,請嘗試使用新的 MinFS 磁碟區建立檔案 重啟,並觀察它仍然存在。> touch /data/foobar > dm reboot > ls /data
如何查看各子目錄所掛接的封鎖裝置/檔案系統 並輸入下列指令:
> df <PATH>
Minfs 作業
下節說明為了完成簡單的 IO 執行哪些作業 例如 read()/write() 等使用者作業
假設
- 不會快取或批次處理任何作業、讀取或寫入作業。這些作業的每項作業 就像使用同步與直式 io 呼叫一樣
- 重新命名:目標檔案不存在。只要符合以下條件,重新命名就能刪除檔案 重新命名作業的目的地是有效的檔案。這項假設 數學運算
- 《寫言》因此,系統會將單一資料區塊寫入先前 在節點中未存取的部分
- 「覆寫」因此,系統會將單一資料區塊寫入 先前已從前一個「Write」分配的區塊作業。
資料欄的索引鍵。
- OPERATION:檔案系統的用戶端要求的動作。
- 區塊類型:每種檔案類型作業都會導致存取一或多種類型
方塊。
- 資料:包含使用者資料和目錄項目。
- 間接:檔案區塊地圖樹狀結構中的間接區塊
- Dindirect:檔案區塊地圖樹狀結構中的雙間接區塊。
- Inode 資料表:包含一或多個賭場的 Inode 資料表區塊。
- Inode 點陣圖:包含代表自由/使用狀態的位元陣列 不堪負荷
- 資料點陣圖:包含代表自由/已使用狀態的位元陣列 資料區塊
- Superblock:包含資料說明檔案系統的版面配置和狀態。
- IO 類型:什麼是 IO 存取的類型、讀取/寫入?
- 案例:是否會日誌 IO。讀取作業不會記錄下來,但只有一部分 的寫入資料都會有日誌。
- 存取條件:視作業的輸入參數和
和部分區塊都能有條件存取。
- 否:系統一律會執行 IO。
- 是:檔案系統狀態和輸入參數會決定這個 IO 然後視需要
- 讀取 COUNT:讀取的檔案系統區塊數。
- WRITE COUNT (IGNORING JOURNAL):已寫入的檔案系統區塊數。寫作 因此日誌或日誌記錄的負擔不計入這個數字。
- 寫入 COUNT (含 JOURNAL):寫入日誌的檔案系統區塊數 然後前往最終位置這不包含封鎖日誌 以維護日誌狀態。
資料列<operation>就像「建立總數」這類的圖表
提供區塊總數
讀取/寫入作業針對涉及日誌的操作,日誌寫入了另外兩次
封鎖、日誌項目標頭和修訂版本區塊,依每次作業。下方的數字
超級區塊、Inode 表格、Inode 點陣圖、資料點陣圖和日誌的一部分 從檔案系統啟動(mount/fsck) 時快取記憶體中。因此,讀取 IO 沒有為這些封鎖類型發出。
營運 | 封鎖類型 | IO 類型 | 焦耳 | 使用了條件 | 讀取號碼 | 寫入計數(IGNORING JOURNAL) | 寫入計數(含 JOURNAL) | 留言 |
---|---|---|---|---|---|---|---|---|
查詢/開啟 | 資料 | 已讀 | 否 | 否 | 1 次以上 | 0 | 0 | 如果目錄較大,系統會讀取多個區塊。 |
間接 | 已讀 | 否 | 是 | 0 以上 | 0 | 0 | 查詢可透過直接區塊執行。因此不一定要間接設定 | |
DIndirect | 已讀 | 否 | 是 | 0 以上 | 0 | 0 | 查詢可透過直接區塊執行。所以選用 dindirect。 | |
查詢/開啟總計 | 1 次以上 | 0 | 0 | |||||
建立 | 資料 | 已讀 | 否 | 否 | 1 次以上 | 0 | 0 | 「Create」涉及先查詢名稱衝突。 |
間接 | 已讀 | 否 | 是 | 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 | 重新命名檔案的管理時間。 | |
資料點陣圖 | 寫入 | 是 | 否 | 0 | 0 以上 | 0 以上 | 如果我們分配了資料,間接或間接區塊。 | |
超級封鎖 | 寫入 | 是 | 否 | 0 | 1 | 2 | ||
重新命名總計 | 1 次以上 | >=5 | 12 以上版本 | 包含 2 個區塊用於日誌項目。 | ||||
已讀 | 資料 | 已讀 | 否 | 否 | 1 次以上 | 0 | 0 | |
間接 | 已讀 | 否 | 是 | 0 以上 | 0 | 0 | ||
DIndirect | 已讀 | 否 | 是 | 0 以上 | 0 | 0 | ||
讀取總數 | 1 次以上 | 0 | 0 | |||||
寫入 | 間接 | 已讀 | 否 | 是 | 0 以上 | 0 | 0 | 即使寫入作業並未覆寫,我們仍可能會與現有資料共用 (D) 間接區塊。導向讀取修改寫入作業。 |
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 個區塊用於日誌項目。 |