最低曝光次數

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」分配的區塊作業。

資料欄的索引鍵。

  1. OPERATION:檔案系統的用戶端要求的動作。
  2. 區塊類型:每種檔案類型作業都會導致存取一或多種類型 方塊。
    • 資料:包含使用者資料和目錄項目。
    • 間接:檔案區塊地圖樹狀結構中的間接區塊
    • Dindirect:檔案區塊地圖樹狀結構中的雙間接區塊。
    • Inode 資料表:包含一或多個賭場的 Inode 資料表區塊。
    • Inode 點陣圖:包含代表自由/使用狀態的位元陣列 不堪負荷
    • 資料點陣圖:包含代表自由/已使用狀態的位元陣列 資料區塊
    • Superblock:包含資料說明檔案系統的版面配置和狀態。
  3. IO 類型:什麼是 IO 存取的類型、讀取/寫入?
  4. 案例:是否會日誌 IO。讀取作業不會記錄下來,但只有一部分 的寫入資料都會有日誌。
  5. 存取條件:視作業的輸入參數和 和部分區塊都能有條件存取。
    • 否:系統一律會執行 IO。
    • 是:檔案系統狀態和輸入參數會決定這個 IO 然後視需要
  6. 讀取 COUNT:讀取的檔案系統區塊數。
  7. WRITE COUNT (IGNORING JOURNAL):已寫入的檔案系統區塊數。寫作 因此日誌或日誌記錄的負擔不計入這個數字。
  8. 寫入 COUNT (含 JOURNAL):寫入日誌的檔案系統區塊數 然後前往最終位置這不包含封鎖日誌 以維護日誌狀態。

資料列<operation>就像「建立總數」這類的圖表 提供區塊總數 讀取/寫入作業針對涉及日誌的操作,日誌寫入了另外兩次 封鎖、日誌項目標頭和修訂版本區塊,依每次作業。下方的數字 的總寫入次數是 WRITE COUNT (有 JOURNALING) 的總寫入數 和日誌記錄的負擔,每項作業分別會阻 2 個區塊

超級區塊、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 個區塊用於日誌項目。