最低曝光次數

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 部分。
  • 「覆寫」作業會讓單一資料區塊寫入先前從先前「寫入」作業分配的區塊的一部分。

資料欄的索引鍵。

  1. OPERATION:檔案系統的用戶端要求的動作。
  2. 區塊類型:每個 Fileystem 作業都會導致存取一或多個類型的區塊。
    • 資料:包含使用者資料和目錄項目。
    • 間接:檔案區塊地圖樹狀結構中的間接區塊
    • Dindirect:檔案區塊對應樹狀結構中的雙間接區塊。
    • 節點資料表:保存一或多個 inos 的節點資料表區塊。
    • 節點點陣圖:包含陣列,每個位元都代表賭場自由/使用狀態。
    • 資料點陣圖:包含一組位元,每個位元代表資料區塊自由/使用狀態。
    • 超級區塊:包含檔案系統的版面配置和狀態資料。
  3. IO 類型:屬於 IO 存取權的類型、讀取/寫入。
  4. JOURNALED:針對 IO 建立日誌。讀取作業不會納入日誌記錄,但部分寫入作業會留下日誌記錄。
  5. 存取條件:視 OPERATION 的輸入參數和檔案系統的狀態而定,某些區塊有條件地存取。
    • 否:一律會執行 IO。
    • 是:檔案系統狀態和輸入參數會決定是否需要這個 IO。
  6. READ COUNT:讀取的檔案系統區塊數量。
  7. 寫入 COUNT (IGNORING JOURNAL):已寫入的檔案系統區塊數量。計算日記或寫日記錄時不計入這個數值。
  8. 寫入 COUNT (含有 JOURNAL):寫入日誌,然後寫入最終位置的檔案系統區塊數。這不包含用來維持日誌狀態的區塊日誌寫入內容。

資料列「<operation> 總數」(例如「Create Total」) 會產生讀取/寫入的區塊總數。如果作業涉及日誌記錄,日誌會針對每個作業另外寫入兩個區塊,也就是日誌項目標頭和修訂區塊。 總計的寫入計數數字是 WRITE COUNT (WITH JOURNALING) 和日誌負擔的總和,也就是每項作業 2 個區塊。

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 個區塊。