QNX6 檔案系統¶
qnx6fs 由較新的 QNX 作業系統版本使用(例如,Neutrino)。它在 QNX 6.4.0 中引入,並從 6.4.1 開始預設使用。
選項¶
mmi_fs 掛載檔案系統,例如 Audi MMI 3G 系統使用的檔案系統
規範¶
qnx6fs 與傳統的 Unix 檔案系統共享許多屬性。它具有塊、inode 和目錄的概念。
在 QNX 上,可以建立小端位元組序和大端位元組序的 qnx6 檔案系統。此功能使得可以為在不同位元組序上執行的目標(QNX 用於相當多的嵌入式系統)平臺建立和使用不同的位元組序檔案系統。
Linux 驅動程式透明地處理位元組序(LE 和 BE)。
塊¶
裝置或檔案中的空間被分成塊。這些塊的大小是固定的,可以是 512、1024、2048 或 4096 位元組,這在建立檔案系統時決定。
塊指標是 32 位的,因此可以定址的最大空間是 2^32 * 4096 位元組或 16TB。
超級塊¶
超級塊包含有關檔案系統的所有全域性資訊。每個 qnx6fs 都有兩個超級塊,每個超級塊都有一個 64 位的序列號。該序列號用於標識“活動的”超級塊。在寫入模式下,對於每個新的快照(每次同步寫入後),新的主超級塊的序列號都會增加(舊的超級塊序列號 + 1)。
因此,基本上,快照功能是透過原子性地最終更新序列號來實現的。在更新該序列號之前,所有修改都是透過在特定的寫入請求(或週期)期間複製所有修改過的塊,並在非活動的超級塊下構建一個新的(穩定的)檔案系統結構來完成的。
每個超級塊都包含一組用於不同檔案系統部分的根 inode。(Inode,點陣圖和長檔名)這些根節點中的每一個都儲存著諸如儲存資料的總大小以及該特定樹中的定址級別之類的資訊。如果級別值為 0,則每個節點最多可以定址 16 個直接塊。
級別 1 添加了一個額外的間接定址級別,其中每個間接定址塊最多包含 blocksize / 4 位元組的指向資料塊的指標。 級別 2 添加了一個額外的間接定址塊級別(因此,已經可以定址 16 * 256 * 256 = 1048576 個塊)。
無論根節點、間接定址塊還是 inode,未使用的塊指標始終設定為 ~0。
資料葉始終位於最低級別。 因此,沒有資料儲存在較高的樹級別上。
第一個超級塊位於 0x2000。(0x2000 是引導塊的大小)Audi MMI 3G 的第一個超級塊直接從位元組 0 開始。
第二個超級塊的位置可以從超級塊資訊(檔案系統塊的總數)計算得出,也可以透過獲取最高的裝置地址,將最後 3 個位元組清零,然後從該地址中減去 0x1000 來獲得。
0x1000 是為每個超級塊保留的大小 - 無論檔案系統的塊大小如何。
Inode¶
檔案系統中的每個物件都由一個 inode 表示。(索引節點)inode 結構包含指向檔案系統塊的指標,這些檔案系統塊包含物件中儲存的資料以及有關物件的所有元資料,除了其長名稱(檔名長於 27 個字元)之外。關於物件的元資料包括許可權、所有者、組、標誌、大小、使用的塊數、訪問時間、更改時間和修改時間。
物件模式欄位是 POSIX 格式的。(這使得事情更容易)
如果物件資料可以用 16 個直接塊定址,則還有指向前 16 個塊的指標。
對於超過 16 個塊,使用另一種樹形式的間接定址。(方案與超級塊根節點使用的方案相同)
檔案大小儲存為 64 位。 Inode 計數從 1 開始。(而長檔名 inode 從 0 開始)
目錄¶
目錄是一個檔案系統物件,並且具有與檔案一樣的 inode。它是一個特殊格式的檔案,其中包含將每個名稱與 inode 編號關聯的記錄。
‘.’ inode 編號指向目錄 inode
‘..’ inode 編號指向父目錄 inode
每個檔名記錄還具有一個檔名長度欄位。
一個特殊的情況是長檔名或子目錄名稱。
這些名稱在相應的目錄記錄中設定了 0xff 的檔名長度欄位,以及也儲存在該記錄中的 longfile inode 編號。
使用該長檔名 inode 編號,可以從超級塊長檔名根節點指標開始遍歷長檔名樹。
特殊檔案¶
符號連結也是具有 inode 的檔案系統物件。 它們在 inode 模式欄位中有一個特定的位來標識它們作為符號連結。
目錄條目檔案 inode 指標指向目標檔案 inode。
硬連結有一個 inode,一個目錄條目,但是設定了一個特定的模式位,沒有塊指標,並且目錄檔案記錄指向目標檔案 inode。
字元和塊特殊裝置在 QNX 中不存在,因為這些檔案由 QNX 核心/驅動程式處理,並在 /dev 中建立,獨立於底層檔案系統。
長檔名¶
長檔名儲存在一個單獨的定址樹中。 起始點是活動超級塊中的長檔名根節點。
每個資料塊(樹葉)儲存一個長檔名。 該檔名限制為 510 個位元組。 前兩個起始位元組用作實際檔名的長度欄位。
如果該結構要適用於所有允許的塊大小,那麼很明顯,為什麼儲存的實際檔名限制為 510 個位元組。
點陣圖¶
qnx6fs 檔案系統分配點陣圖儲存在超級塊中點陣圖根節點下的樹中,並且點陣圖中的每個位代表一個檔案系統塊。
第一個塊是塊 0,它在超級塊開始後 0x1000 開始。 因此,對於正常的 qnx6fs,0x3000(引導塊 + 超級塊)是塊 0 所在的物理地址。
如果裝置小於點陣圖中的定址空間,則最後一個位圖塊末尾的位設定為 1。
點陣圖系統區域¶
點陣圖本身分為三個部分。
首先是系統區域,它分為兩個部分。
然後是使用者空間。
對靜態、預先分配的固定系統區域的要求來自 qnx6fs 如何處理寫入。
每個超級塊都有自己的系統區域的一半。 因此,超級塊 #1 始終使用下半部分的塊,而超級塊 #2 僅寫入由上半部分點陣圖系統區域位表示的塊。
點陣圖塊、Inode 塊和這兩個樹結構的間接定址塊被視為系統塊。
這背後的原理是,寫入請求可以在新的快照上工作(非活動的 - 或較低序列號的超級塊的系統區域),同時在系統區域的另一半中仍然存在完整的穩定檔案系統結構。
完成寫入後(同步寫入完成、達到最大同步躍遷時間或請求檔案系統同步),先前非活動的超級塊的序列原子性地增加,並且 fs 切換到該 - 然後宣告為穩定 - 超級塊。
對於系統區域之外的所有資料,塊只是在寫入時被複制。