最低曝光次數

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 partitions
    
  • gpt 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 部分。
  • 「覆寫」作業會對先前由「寫入」作業分配的部分區塊,發出單一資料區塊寫入指令。

資料欄的鍵。

  1. 作業:檔案系統用戶端要求的動作。
  2. 區塊類型:每項檔案系統作業都會存取一或多種類型的區塊。
    • 資料:包含使用者資料和目錄項目。
    • 間接:檔案區塊對應樹狀結構中的間接區塊
    • Dindirect:檔案區塊對應樹狀結構中的雙重間接區塊。
    • Inode 表格:Inode 表格區塊,可存放一或多個 inode。
    • Inode 點陣圖:包含位元陣列,每個位元代表 inode 的可用/已使用狀態。
    • 資料點陣圖:包含位元陣列,每個位元代表資料區塊的可用/已使用狀態。
    • 超級區塊:包含描述檔案系統版面配置和狀態的資料。
  3. IO TYPE:IO 存取權的類型 (讀取/寫入)。
  4. JOURNALED:是否要記錄 IO。讀取作業不會記錄,但部分寫入作業會記錄。
  5. 有條件存取:視作業的輸入參數和檔案系統狀態而定,部分區塊會受到有條件存取。
    • 否:一律執行 IO。
    • 是:檔案系統狀態和輸入參數會決定是否需要這個 IO。
  6. READ COUNT:讀取的檔案系統區塊數量。
  7. WRITE COUNT (IGNORING JOURNAL):寫入的檔案系統區塊數量。寫入日誌或日誌記錄負擔不計入這個數字。
  8. 寫入次數 (含日誌):寫入日誌,然後寫入最終位置的檔案系統區塊數量。這不包括日誌寫入用來維護日誌狀態的區塊。

「<作業> 總計」列 (例如「建立總計」) 會顯示讀取/寫入的區塊總數。對於涉及日誌記錄的作業,日誌會為每項作業寫入兩個額外的區塊:日誌項目標頭和修訂區塊。 「Total」寫入次數下方的數字是「WRITE COUNT (WITH JOURNALING)」和日誌記錄負擔的總和,即每項作業 2 個區塊。

啟動(掛接/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 個日誌項目區塊。