




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JFS 文件系統(tǒng)概述及布局分析日志文件系統(tǒng)如何縮短系統(tǒng)重啟時(shí)間如果發(fā)生系統(tǒng)崩潰,JFS 提供了快速文件系統(tǒng)重啟。通過(guò)使用數(shù)據(jù)庫(kù)日志技術(shù),JFS 能在幾秒或幾分鐘之內(nèi)把文件系統(tǒng)恢復(fù)到一致狀態(tài),而非日志文件系統(tǒng)卻要花上幾小時(shí)甚至幾天才能完成。本白皮書對(duì) JFS 體系結(jié)構(gòu)作了概述,并且描述了可在 developerWorks 網(wǎng)站上找到的 JFS 技術(shù)的設(shè)計(jì)特性、潛在限制以及管理實(shí)用程序。日志文件系統(tǒng) (JFS) 提供了基于日志的字節(jié)級(jí)文件系統(tǒng),該文件系統(tǒng)是為面向事務(wù)的高性能系統(tǒng)而開發(fā)的。它具有可伸縮性和健壯性,與非日志文件系統(tǒng)相比,它的優(yōu)點(diǎn)是其快速重啟能力:JFS 能夠在幾秒或幾分鐘內(nèi)就把文件系統(tǒng)
2、恢復(fù)到一致狀態(tài)。雖然 JFS 主要是為滿足服務(wù)器(從單處理器系統(tǒng)到高級(jí)多處理器和群集系統(tǒng))的高吞吐量和可靠性需求而設(shè)計(jì)的,JFS 還可用于想得到高性能和可靠性的客戶機(jī)配置。體系結(jié)構(gòu)和設(shè)計(jì)JFS 體系結(jié)構(gòu)可從磁盤布局特性的角度進(jìn)行說(shuō)明。邏輯卷 所有文件系統(tǒng)討論的基礎(chǔ)是某種類型的邏輯卷。這可以是一個(gè)物理磁盤,或物理磁盤空間的某個(gè)子集,例如:一個(gè) FDISK 分區(qū)。邏輯卷也稱為磁盤分區(qū)。 聚集和文件集 文件系統(tǒng)創(chuàng)建實(shí)用程序 mkfs,創(chuàng)建了完全包含在分區(qū)內(nèi)的聚集。聚集是包含一種特定格式的磁盤塊陣列,其格式包括超級(jí)塊和分配映射表。超級(jí)塊將分區(qū)標(biāo)識(shí)成 JFS 聚集,而分配映射表描述聚集內(nèi)每個(gè)數(shù)據(jù)塊的分配
3、狀態(tài)。格式還包括描述它所必需的初始文件集和控制結(jié)構(gòu)。文件集是可安裝的實(shí)體。 文件、目錄、inode 與尋址結(jié)構(gòu) 文件集包含文件和目錄。文件和目錄由 inode 持續(xù)表示;每個(gè) inode 描述文件或目錄的屬性,并作為查找磁盤上文件或目錄數(shù)據(jù)的起始點(diǎn)。JFS 還使用 inode 來(lái)表示其它文件系統(tǒng)對(duì)象,如描述文件集中每個(gè) inode 的分配狀態(tài)和磁盤位置的映射表。 目錄將用戶特定的名稱映射到為文件和目錄所分配的 inode 上,并且形成傳統(tǒng)的命名層次。文件包含用戶數(shù)據(jù),用戶數(shù)據(jù)中沒有隱含任何限制或格式。也就是說(shuō),JFS 將用戶數(shù)據(jù)看成是未解釋的字節(jié)流。根植于 inode 基于盤區(qū)的尋址結(jié)構(gòu)用來(lái)將
4、文件數(shù)據(jù)映射到磁盤。聚集超級(jí)塊和磁盤分配映射表、文件描述符和 inode 映射表、inode、目錄以及尋址結(jié)構(gòu)一起表示了 JFS 控制結(jié)構(gòu)或元數(shù)據(jù)。日志 在每個(gè)聚集中維護(hù) JFS 日志,并且用來(lái)記錄元數(shù)據(jù)的操作信息。日志有一種同樣由文件系統(tǒng)創(chuàng)建實(shí)用程序設(shè)置的格式。聚集內(nèi)多個(gè)安裝的文件集可以同時(shí)使用一個(gè)日志。 設(shè)計(jì)特性JFS 從一開始就設(shè)計(jì)成完全集成了日志記錄,而不是在現(xiàn)有文件系統(tǒng)上添加日志記錄。JFS 的許多特性使之區(qū)別于其它文件系統(tǒng)。日志處理 JFS 提供了改進(jìn)的結(jié)構(gòu)化一致性和可恢復(fù)性,以及比非日志文件系統(tǒng)(例如:HPFS、ext2 和傳統(tǒng) UNIX 文件系統(tǒng))快得多的系統(tǒng)重啟時(shí)間。發(fā)生系統(tǒng)
5、故障時(shí)非日志文件系統(tǒng)容易崩潰,是由于一個(gè)邏輯寫文件操作通常占用多個(gè)媒體 I/O 來(lái)完成,且在任何給定時(shí)間,可能沒有完全反映在媒體上。這些文件系統(tǒng)依靠重啟實(shí)用程序(也就是 fsck),fsck 檢查文件系統(tǒng)的所有元數(shù)據(jù)(例如:目錄和磁盤尋址結(jié)構(gòu))以檢測(cè)和修復(fù)結(jié)構(gòu)完整性問(wèn)題。這是一個(gè)耗時(shí)并且容易出錯(cuò)的過(guò)程,在最糟糕的情況下,它還可能丟失或放錯(cuò)數(shù)據(jù)。 相反,JFS 使用原來(lái)為數(shù)據(jù)庫(kù)開發(fā)的技術(shù),記錄了文件系統(tǒng)元數(shù)據(jù)上執(zhí)行的操作(即原子事務(wù))信息。如果發(fā)生系統(tǒng)故障,可通過(guò)重放日志并對(duì)適當(dāng)?shù)氖聞?wù)應(yīng)用日志記錄,來(lái)使文件系統(tǒng)恢復(fù)到一致狀態(tài)。由于重放實(shí)用程序只需檢查文件系統(tǒng)最近活動(dòng)所產(chǎn)生的運(yùn)行記錄,而不是檢查所
6、有文件系統(tǒng)的元數(shù)據(jù),因此,與這種基于日志的方法相關(guān)的文件系統(tǒng)恢復(fù)時(shí)間要快得多?;谌罩净謴?fù)的其它幾個(gè)方面也值得注意。首先,JFS 只記錄元數(shù)據(jù)上的操作,因此,重放這些日志只能恢復(fù)文件系統(tǒng)中結(jié)構(gòu)關(guān)系和資源分配狀態(tài)的一致性。它沒有記錄文件數(shù)據(jù),也沒有將這些數(shù)據(jù)恢復(fù)到一致狀態(tài)。因此,恢復(fù)后某些文件數(shù)據(jù)可能丟失或失效,對(duì)數(shù)據(jù)一致性有關(guān)鍵性需求的用戶應(yīng)該使用同步 I/O。面對(duì)媒體出錯(cuò),日志記錄不是特別有效。特別地,在將日志或元數(shù)據(jù)寫入磁盤的期間發(fā)生的 I/O 錯(cuò)誤,意味著在系統(tǒng)崩潰后,要將文件系統(tǒng)恢復(fù)到一致狀態(tài),需要耗時(shí)并且有可能強(qiáng)加的全面完整性檢查。這暗示著,壞塊重定位是任何駐留在 JFS 下的存儲(chǔ)管
7、理器或設(shè)備的一個(gè)關(guān)鍵特性。JFS 日志記錄的語(yǔ)義如下:當(dāng)涉及元數(shù)據(jù)更改的文件系統(tǒng)操作-例如,unlink()-返回成功執(zhí)行的返回碼時(shí),操作的結(jié)果已經(jīng)提交到文件系統(tǒng),即使系統(tǒng)崩潰了也可以發(fā)現(xiàn)。例如,一旦成功刪除了文件,即使系統(tǒng)崩潰然后重啟,它仍然是刪除的并且不會(huì)再重新出現(xiàn)。日志記錄風(fēng)格將同步寫入日志磁盤引入每個(gè)修改元數(shù)據(jù)的 inode 或 vfs 操作。(對(duì)數(shù)據(jù)庫(kù)專家而言,這是一種使用非剝奪緩沖區(qū)策略的僅重做的、物理殘留映象、提前寫的日志記錄協(xié)議。)在性能方面,與依賴(多個(gè))謹(jǐn)慎的同步元數(shù)據(jù)寫操作以獲得一致性的許多非日志文件系統(tǒng)相比,這種方法較好。但是,與其它日志文件系統(tǒng)相比,它在性能上處于劣勢(shì)
8、。其它日志文件系統(tǒng),如 Veritas VxFS 和 Transarc Episode,使用不同的日志風(fēng)格并且緩慢地將日志數(shù)據(jù)寫入磁盤。在執(zhí)行多個(gè)并行操作的服務(wù)器環(huán)境中,通過(guò)將多個(gè)同步寫操作組合成單一寫操作的組提交來(lái)減少這種性能損失。JFS 日志記錄風(fēng)格隨著時(shí)間推移而得到不斷改進(jìn),現(xiàn)在提供了異步日志記錄,異步日志記錄提高了文件系統(tǒng)的性能。基于盤區(qū)的尋址結(jié)構(gòu) JFS 使用基于盤區(qū)的尋址結(jié)構(gòu),連同主動(dòng)的塊分配策略,產(chǎn)生緊湊、高效、可伸縮的結(jié)構(gòu),以將文件中的邏輯偏移量映射成磁盤上的物理地址。盤區(qū)是象一個(gè)單元那樣分配給文件的相連塊序列,可用一個(gè)由 組成的三元組來(lái)描述。尋址結(jié)構(gòu)是一棵 B+ 樹,該樹由盤
9、區(qū)描述符(上面提到的三元組)填充,根在 inode 中,鍵為文件中的邏輯偏移量。 可變的塊尺寸 按文件系統(tǒng)分,JFS 支持 512、1024、2048 和 4096 字節(jié)的塊尺寸,以允許用戶根據(jù)應(yīng)用環(huán)境優(yōu)化空間利用率。較小的塊尺寸減少了文件和目錄中內(nèi)部存儲(chǔ)碎片的數(shù)量,空間利用率更高。但是,小塊可能會(huì)增加路徑長(zhǎng)度,與使用大的塊尺寸相比,小塊的塊分配活動(dòng)可能更頻繁發(fā)生。因?yàn)榉?wù)器系統(tǒng)通常主要考慮的是性能,而不是空間利用率,所以缺省塊尺寸為 4096 字節(jié)。 動(dòng)態(tài)磁盤 inode 分配 JFS 按需為磁盤 inode 動(dòng)態(tài)地分配空間,同時(shí)釋放不再需要的空間。這一支持避開了在文件系統(tǒng)創(chuàng)建期間,為磁盤
10、inode 保留固定數(shù)量空間的傳統(tǒng)方法,因此用戶不再需要估計(jì)文件系統(tǒng)包含的文件和目錄最大數(shù)目。另外,這一支持使磁盤 inode 與固定磁盤位置分離。 目錄組織 JFS 提供兩種不同的目錄組織。第一種組織用于小目錄,并且在目錄的 inode 內(nèi)存儲(chǔ)目錄內(nèi)容。這就不再需要不同的目錄塊 I/O,同時(shí)也不再需要分配不同的存儲(chǔ)器。最多可有 8 個(gè)項(xiàng)可直接存儲(chǔ)在 inode 中,這些項(xiàng)不包括自己(.)和父(.)目錄項(xiàng),這兩個(gè)項(xiàng)存儲(chǔ)在 inode 中不同的區(qū)域內(nèi)。 第二種組織用于較大的目錄,用按名字鍵控的 B+ 樹表示每個(gè)目錄。與傳統(tǒng)無(wú)序的目錄組織比較,它提供更快的目錄查找、插入和刪除能力。稀疏和密集文件
11、按文件系統(tǒng)分,JFS 既支持稀疏文件也支持密集文件。 稀疏文件允許把數(shù)據(jù)寫到一個(gè)文件的任意位置,而不要將以前未寫的中間文件塊實(shí)例化。所報(bào)告的文件大小是已經(jīng)寫入的最高塊位處,但是,在文件中任何給定塊的實(shí)際分配,只有在該塊進(jìn)行寫操作時(shí)才發(fā)生。例如,假設(shè)在一個(gè)指定為稀疏文件的文件系統(tǒng)中創(chuàng)建一個(gè)新文件。應(yīng)用程序?qū)?shù)據(jù)塊寫到文件中第 100 塊。盡管磁盤空間只分配了 1 塊給它,JFS 將報(bào)告該文件的大小為 100 塊。如果應(yīng)用程序下一步讀取文件的第 50 塊,JFS 將返回填充了 0 的一個(gè)字節(jié)塊。假設(shè)應(yīng)用程序然后將一塊數(shù)據(jù)寫到該文件的第 50 塊,JFS 仍然報(bào)告文件的大小為 100 塊,而現(xiàn)在已經(jīng)
12、為它分配了兩塊磁盤空間。稀疏文件適合需要大的邏輯空間但只使用這個(gè)空間的一個(gè)(少量)子集的應(yīng)用程序。對(duì)于密集文件,將分配相當(dāng)于文件大小的磁盤資源。在上例中,第一個(gè)寫操作(將一塊數(shù)據(jù)寫到文件的第 100 塊)將導(dǎo)致把 100 個(gè)塊的磁盤空間分配給該文件。在任何已經(jīng)隱式寫入的塊上進(jìn)行讀操作,JFS 將返回填充了 0 的字節(jié)塊,正如稀疏文件的情況一樣。JFS 內(nèi)部(潛在)限制JFS 是完全 64 位的文件系統(tǒng)。所有 JFS 文件系統(tǒng)結(jié)構(gòu)化字段都是 64 位大小。這允許 JFS 同時(shí)支持大文件和大分區(qū)。 文件系統(tǒng)大小 JFS 支持的最小文件系統(tǒng)是 16M 字節(jié)。最大文件系統(tǒng)的大小是文件系統(tǒng)塊尺寸和文件系
13、統(tǒng)元數(shù)據(jù)結(jié)構(gòu)支持的最大塊數(shù)兩者的乘積。JFS 將支持最大文件長(zhǎng)度是 512 萬(wàn)億字節(jié)(TB)(塊尺寸是 512 字節(jié))到 4 千萬(wàn)億字節(jié)(PB)(塊尺寸是 4K 字節(jié)) 文件長(zhǎng)度 最大文件長(zhǎng)度是主機(jī)支持的虛擬文件系統(tǒng)最大文件長(zhǎng)度。例如:如果主機(jī)只支持 32 位,則這就限制了文件長(zhǎng)度。 可移動(dòng)媒體 JFS 不支持把軟盤作為基本文件系統(tǒng)設(shè)備。 標(biāo)準(zhǔn)管理實(shí)用程序JFS 提供創(chuàng)建和維護(hù)文件系統(tǒng)的標(biāo)準(zhǔn)管理實(shí)用程序。創(chuàng)建文件系統(tǒng) 這個(gè)實(shí)用程序提供 mkfs 命令的 JFS 特定部分,用來(lái)在指定的驅(qū)動(dòng)器上初始化 JFS 文件系統(tǒng)。該實(shí)用程序在較低級(jí)別上操作,并假設(shè)文件系統(tǒng)所存在的任何卷的創(chuàng)建/初始化由更高級(jí)
14、別的另一個(gè)實(shí)用程序處理。 檢查/修復(fù)文件系統(tǒng) 這個(gè)實(shí)用程序提供 fsck 命令的 JFS 特定部分。該命令檢查文件系統(tǒng)的一致性,修復(fù)發(fā)現(xiàn)的問(wèn)題。它也重放日志,把提交的改動(dòng)應(yīng)用到文件系統(tǒng)元數(shù)據(jù),如果由于日志重放而聲明文件系統(tǒng)是干凈的,就不會(huì)再采取進(jìn)一步操作。如果文件系統(tǒng)不認(rèn)為是干凈的,這意味著由于某種原因沒有完整和正確地重放日志,或者文件系統(tǒng)不能單靠重放日志來(lái)恢復(fù)到一致狀態(tài),那么,就對(duì)文件系統(tǒng)執(zhí)行一遍完整檢查。 當(dāng)執(zhí)行全部完整性檢查時(shí),檢查/修復(fù)實(shí)用程序首要目的是要達(dá)到可靠的文件系統(tǒng)狀態(tài),以防止將來(lái)文件系統(tǒng)崩潰或故障,第二個(gè)目的就是面對(duì)崩潰時(shí)保存數(shù)據(jù)。這意味著為了達(dá)到文件系統(tǒng)的一致性,實(shí)用程序可
15、能丟棄數(shù)據(jù)。具體而言,當(dāng)實(shí)用程序在不做假設(shè)的情況下,無(wú)法獲得所需信息以將結(jié)構(gòu)上不一致的文件或目錄恢復(fù)到一致狀態(tài)時(shí),就會(huì)廢棄數(shù)據(jù)。當(dāng)遇到不一致的文件或目錄時(shí),就廢棄整個(gè)文件或目錄,而不再試圖保存任何部分。任何由刪除受損目錄所孤立起來(lái)的文件或子目錄,都放在文件系統(tǒng)根下的 lost+found 目錄中。文件系統(tǒng)檢查/修復(fù)實(shí)用程序重點(diǎn)考慮的因素之一是所需虛存數(shù)量。通常,這些實(shí)用程序所需的虛存數(shù)量由文件系統(tǒng)的大小決定,這是由于所需虛存主要用于跟蹤文件系統(tǒng)中個(gè)別塊的分配狀態(tài)。隨著文件系統(tǒng)增大,塊的數(shù)量增多,用來(lái)跟蹤這些塊所需的虛存數(shù)量也隨之增加。JFS 檢查/修復(fù)實(shí)用程序的設(shè)計(jì)區(qū)別在于其虛存需求由文件系統(tǒng)
16、中文件和目錄的數(shù)量(而不是由塊的數(shù)量)所決定。對(duì) JFS 檢查/修復(fù)實(shí)用程序而言,每個(gè)文件或目錄的虛存大約為每個(gè)文件或目錄 32 字節(jié),或者對(duì)于包含百萬(wàn)個(gè)文件和目錄的文件系統(tǒng)而言,不論其文件系統(tǒng)大小,虛存需求都是大約 32 兆字節(jié)。如同所有其它的文件系統(tǒng),JFS 實(shí)用程序需要跟蹤塊分配狀態(tài),但避免使用虛存方法,而是使用位于實(shí)際文件系統(tǒng)中的一小塊保留工作區(qū)來(lái)實(shí)現(xiàn)。日志文件系統(tǒng)如何處理磁盤布局本文描述磁盤日志文件系統(tǒng)(JFS)布局,以及使用磁盤布局結(jié)構(gòu)來(lái)實(shí)現(xiàn)可擴(kuò)展性、可靠性和性能的機(jī)制。還會(huì)了解用來(lái)操作這些結(jié)構(gòu)的策略和算法,以及 JFS 是在哪里使用遍布文件系統(tǒng)的 B+ 樹來(lái)提高文件系統(tǒng)操作性能。
17、JFS 體系結(jié)構(gòu)可通過(guò)其磁盤布局特性的上下文進(jìn)行說(shuō)明。磁盤布局是 JFS 用來(lái)控制文件系統(tǒng)的格式。本文討論盤區(qū)的文件幾何構(gòu)造、目錄格式、塊分配映射表格式、inode 和布局結(jié)構(gòu)的其它特性。本文還提供了文件布局使用的 B+ 樹數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)和示例。選擇 B+ 樹是為了提高讀寫盤區(qū)的性能,這是 JFS 執(zhí)行的最普通操作。分區(qū)、聚集、分配組、文件集分區(qū) JFS 文件系統(tǒng)建立在分區(qū)上,分區(qū)是由 FDISK 導(dǎo)出到 JFS 的抽象。 分區(qū)有:固定分區(qū)塊尺寸,其合法值為 512、1024、2048 或 4096 字節(jié)。分區(qū)塊尺寸定義了分區(qū)上支持的最小 I/O 單元。這對(duì)應(yīng)于組成分區(qū)的物理設(shè)備的基本磁盤扇區(qū)
18、大小,最普遍的尺寸是 512 字節(jié)。 大小為:PART_NBlocks,是分區(qū)磁盤塊數(shù)。 分區(qū)磁盤塊的抽象地址空間 0. PART_NBlocks - 1 。聚集 為了支持 DCE DFS(分布式計(jì)算環(huán)境分布式文件系統(tǒng)),JFS 將磁盤空間分配池(稱為聚集)的概念, 與可安裝的文件系統(tǒng)子樹(稱為文件集)的概念分開。本文中聚集和文件集的術(shù)語(yǔ)與其 DFS 用法一致。每個(gè)分區(qū)剛好只有一個(gè)聚集;每個(gè)聚集可能有多個(gè)文件集。在第一個(gè)發(fā)行版中,JFS 僅支持每個(gè)聚集一個(gè)文件集;但是,所有元數(shù)據(jù)都已設(shè)計(jì)成適用于所有情況。 聚集有:在此聚集的開始部分有 32K 保留區(qū)域。 固定的聚集塊尺寸,其合法值為 512、
19、1024、2048 或 4096 字節(jié),但不小于分區(qū)塊尺寸。聚集塊尺寸定義了聚集上支持的最小空間分配單元。不要把它與分區(qū)塊尺寸混淆起來(lái),后者定義的是 I/O 的最小單元。 主聚集超級(jí)塊和輔助聚集超級(jí)塊。超級(jí)塊包含聚集方面的信息,例如:聚集的大小、分配組的大小、聚集塊的尺寸等等,輔助聚集超級(jí)塊是主聚集超級(jí)塊的直接副本。如果主聚集超級(jí)塊損壞,則使用輔助聚集超級(jí)塊。這些超級(jí)塊位于固定位置。這使得 JFS 不依賴任何其它信息,就能夠找到它們。超級(jí)塊結(jié)構(gòu)在 jfs_superblock.h 的 struct jfs_superblock 中定義。 聚集 inode 表,包含描述聚集范圍的控制結(jié)構(gòu)的 in
20、ode 。聚集 inode 表邏輯上包含一個(gè) inode 數(shù)組。聚集無(wú)目錄結(jié)構(gòu);在聚集或文件集名字空間中,任何地方都沒有聚集 inode 。 輔助聚集 inode 表,包含從聚集 inode 表復(fù)制的 inode 。由于對(duì)任何文件系統(tǒng)信息的查找而言,聚集 inode 表中的 inode 都是至關(guān)重要的,所以它們每一個(gè)在輔助聚集 inode 表中都有備份。當(dāng)然,不會(huì)復(fù)制 inode 的實(shí)際數(shù)據(jù),而只是復(fù)制可用來(lái)查找數(shù)據(jù)和 inode 本身的尋址結(jié)構(gòu)。 聚集 inode 映射表,描述聚集 inode 表。聚集 inode 分配映射表包含聚集 inode 上及其磁盤位置上的分配狀態(tài)信息。輔助聚集 i
21、node 映射表,描述輔助聚集 inode 表。由于必須復(fù)制聚集 inode 表本身,輔助聚集 inode 映射表實(shí)際上是與聚集 inode 分配映射表分開的映射結(jié)構(gòu)。 塊分配映射表,描述在聚集內(nèi)分配和釋放聚集磁盤塊的控制結(jié)構(gòu)。塊分配映射表在聚集磁盤塊內(nèi)進(jìn)行一對(duì)一映射。 fsck 工作區(qū),它為 fsck 提供用來(lái)跟蹤聚集塊分配的空間。因?yàn)?JFS 支持超大聚集,所以這一區(qū)域是必需的;當(dāng) fsck 運(yùn)行時(shí),可能沒有足夠的內(nèi)存用來(lái)跟蹤內(nèi)存中的這些信息。超級(jí)塊描述了這一區(qū)域。每個(gè)聚集塊需要一位。 fsck 工作區(qū)總是存在于聚集的末端。 內(nèi)嵌日志為記錄聚集中的元數(shù)據(jù)更改提供了空間。超級(jí)塊描述了這一區(qū)域
22、。內(nèi)嵌日志總是緊跟 fsck 工作空間后。 初始情況下,在聚集創(chuàng)建時(shí)分配了第一個(gè) inode 盤區(qū)。按需要?jiǎng)討B(tài)分配和釋放其它 inode 盤區(qū)。每個(gè)聚集 inode 描述聚集本身的某些方面,如下:保留聚集 inode 0。 聚集 inode 1,即自身 inode ,描述包括聚集 inode 映射表的聚集磁盤塊。這是一種循環(huán)表示法,因?yàn)榫奂?inode 1 本身也在自己所描述的文件中。可通過(guò)強(qiáng)制規(guī)定至少第一個(gè)聚集 inode 盤區(qū)要在眾所周知的位置,即主聚集超級(jí)塊后面 4K 的位置,來(lái)處理以上顯而易見的循環(huán)表示法問(wèn)題。因此,JFS 能輕而易舉地找到聚集 inode 1,從聚集 inode 1,
23、通過(guò)跟隨 inode 1 中的 B+ 樹,能找到聚集 inode 表的余下 inode 。 要復(fù)制聚集 inode 表,JFS 還需要找到聚集 inode 1 的副本,以查找所復(fù)制表的其余部分。超級(jí)塊會(huì)包含一個(gè)盤區(qū)描述符,該描述符描述輔助聚集 inode 表的第一個(gè) inode 盤區(qū)的位置。JFS 能夠從中找到輔助聚集 inode 1,以及輔助聚集 inode 表的余下部分。聚集 inode 2 描述塊分配映射表。 聚集 inode 3 描述安裝時(shí)的內(nèi)嵌日志。雖然分配了 inode ,但無(wú)數(shù)據(jù)存入磁盤。 聚集 inode 4 描述在聚集格式化期間發(fā)現(xiàn)的壞塊。在塊映射表中這些標(biāo)記成已分配。該 i
24、node 是數(shù)據(jù)為壞塊的普通文件。 保留聚集 inode 5 到 15 以備將來(lái)擴(kuò)展。 從聚集 inode 16 開始,每個(gè)文件集有一個(gè) inode ,即文件集分配映射表 inode 。這個(gè) inode 描述了表示文件集的控制結(jié)構(gòu)。當(dāng)更多文件集添加到聚集中時(shí),為了容納更多的文件集 inode ,聚集 inode 表本身可能必須增大。 分配組 分配組(AG)把聚集中的空間分成大塊,并且允許 JFS 資源分配策略使用眾所周知的方法,來(lái)實(shí)現(xiàn)更好的 JFS I/O 性能。首先,分配策略嘗試將相關(guān)數(shù)據(jù)的磁盤塊和磁盤 inode 集群起來(lái),使磁盤實(shí)現(xiàn)好的局域性。文件通常是順序地讀寫,而目錄中的文件通常一起
25、訪問(wèn)。其次,為了容納局域性,分配策略嘗試在整個(gè)聚集中分配不相關(guān)數(shù)據(jù)。聚集內(nèi)的分配組用從 0 開始的 AG(分配組)索引。即用 AG 標(biāo)識(shí)。 必須選擇分配組大小,以使 AG 足夠大以不斷提供連續(xù)資源分配。為了將聚集擴(kuò)充或縮小時(shí)所需進(jìn)行的更新數(shù)最小化,分配組必須限制最大組數(shù) 128。此外,JFS 將對(duì) 8192 個(gè)聚集塊的分配組大小規(guī)定其最小值。分配組大小必須總是 1 個(gè) dmap 頁(yè)(1、2、4、8、 .dmap 頁(yè))描述的塊數(shù)的 2 的冪次方。分配組大小在聚集超級(jí)塊中存儲(chǔ)。大小不是分配組大小倍數(shù)的聚集將包含部分分配組;磁盤塊沒有完全覆蓋聚集的最后一個(gè)分配組。除了JFS 將標(biāo)記在塊分配映射表中分
26、配的卻不存在的磁盤塊之外,該部分分配組將被當(dāng)作完整的分配組。文件集 文件集是文件和目錄的集合,這些文件和目錄形成了可獨(dú)立安裝的子樹。文件集完全包含在一個(gè)聚集中。請(qǐng)注意,一個(gè)聚集中可能有多個(gè)文件集;在那種情況下,所有文件集共享由聚集控制結(jié)構(gòu)定義的空閑聚集磁盤塊公共池。 文件集有:文件集 inode 表,包含描述文件集范圍的控制結(jié)構(gòu)的 inode 。文件集 inode 表邏輯上包含一個(gè) inode 數(shù)組。 文件集 inode 分配映射表,描述文件集 inode 表。文件集 inode 分配映射表包含文件集 inode 上及其磁盤位置上的分配狀態(tài)信息。描述文件集分配映射表和其他文件集信息的超級(jí) in
27、ode ,駐留前面所描述的聚集 inode 表中。由于復(fù)制了聚集 inode 表,因此這個(gè) inode 存在第二個(gè)版本,它指向同樣的數(shù)據(jù)。超級(jí) inode 本身是一個(gè)文件。當(dāng)文件集一開始創(chuàng)建時(shí),分配第一個(gè) inode 盤區(qū)按需要?jiǎng)討B(tài)分配和釋放其它 inode 盤區(qū)。 文件集中 inode 的分配如下所示:保留文件集 inode 0。 文件集 inode 1 包含附加的文件集信息,它們無(wú)法放入聚集 inode 表中的文件集分配映射表 inode 。 文件集 inode 2 是文件集的根目錄 inode 。注意,JFS 保留了 inode 2 是文件系統(tǒng)的根這一公共 Unix 約定。 文件集 in
28、ode 3 是文件集的 ACL 文件。 從文件集 inode 4 開始,文件集 inode 用于一般文件集對(duì)象、用戶文件、目錄和符號(hào)鏈接。 盤區(qū)、inode 、B+ 樹盤區(qū)是當(dāng)作單元分配給 JFS 對(duì)象的連續(xù)聚集塊序列。盤區(qū)完全包含在一個(gè)聚集(并且因此也是在一個(gè)分區(qū))中;但是,大盤區(qū)可能跨多個(gè)分配組。每個(gè) JFS 對(duì)象可用一個(gè) inode 來(lái)表示。inode 包含預(yù)期的對(duì)象特定信息,例如:時(shí)間戳和文件類型。它們還包含記錄盤區(qū)分配的 B+ 樹。注意,所有 JFS 元數(shù)據(jù)結(jié)構(gòu)(除超級(jí)塊之外)都以文件表示。通過(guò)重用這種數(shù)據(jù)的 inode 結(jié)構(gòu),數(shù)據(jù)格式(即磁盤布局) 自然是可擴(kuò)展的。盤區(qū)、B+ 樹、
29、inode 在以下章節(jié)中詳細(xì)描述。盤區(qū) 文件是按盤區(qū)順序分配的。盤區(qū)是當(dāng)作一個(gè)單元分配的聚集塊的連續(xù)變長(zhǎng)序列。盤區(qū)的尺寸范圍是 1 到 2(24)-1 個(gè)聚集塊。盤區(qū)可能跨越多個(gè)分配組(AG)。為了在插入新盤區(qū)、定位特定盤區(qū)等操作方面有更優(yōu)性能,這些盤區(qū)是按 B+ 樹索引的。 定義一個(gè)盤區(qū)需要兩個(gè)值,即其長(zhǎng)度和其地址。長(zhǎng)度以聚集塊尺寸為單位計(jì)算。JFS 使用 24 位值來(lái)表示盤區(qū)的長(zhǎng)度,因此盤區(qū)的范圍大小是 1 到 2(24)-1 個(gè)聚集塊。對(duì)于 512 字節(jié)的聚集塊尺寸 (所允許的最小值),最大盤區(qū)是512*(2(24)-1)字節(jié),(比 8G 稍小)。對(duì)于 4096 字節(jié)的聚集塊尺寸(所允許
30、的最大值),盤區(qū)的最大長(zhǎng)度是 4096*(2(24)-1)字節(jié),(比 64G 稍小)。這些限制僅適用于一個(gè)的盤區(qū);對(duì)整體文件大小沒有限制作用。地址指的是盤區(qū)中第一個(gè)塊的地址。地址同樣以聚集塊為單位:它從聚集的開始處計(jì)算塊偏移量。結(jié)合了用戶特定聚集塊尺寸的基于盤區(qū)的文件系統(tǒng),允許 JFS 不需要單獨(dú)支持內(nèi)部存儲(chǔ)碎片??膳渲镁奂褂眯〉木奂瘔K尺寸(例如,512 字節(jié)),以使大量小尺寸文件的聚集內(nèi)部存儲(chǔ)碎片最小化。通常,JFS 分配嘗試通過(guò)分配最小數(shù)量的盤區(qū)策略,而使每個(gè)盤區(qū)盡可能大。這就允許大的 I/O 傳送,結(jié)果使得性能提高。然而,對(duì)于特殊情況,不一定總有這種結(jié)果。例如,一個(gè)段的寫入時(shí)復(fù)制會(huì)造成
31、連續(xù)盤區(qū)被分割成更小的連續(xù)盤區(qū)系列。另一種情況是盤區(qū)大小的限制。例如:由于 JFS 必須把整個(gè)盤區(qū)讀入內(nèi)存,然后進(jìn)行解壓縮,所以壓縮文件盤區(qū)大小是有限的。由于 JFS 的可用內(nèi)存數(shù)量有限,因此它必須保證有足夠的空間用于解壓縮盤區(qū)。提供了一個(gè)碎片整理實(shí)用程序,以減少動(dòng)態(tài)分配釋放可變長(zhǎng)盤區(qū)時(shí)出現(xiàn)的外部存儲(chǔ)碎片。這種分配和釋放可能導(dǎo)致不相連的變長(zhǎng)空閑盤區(qū)遍及整個(gè)聚集。碎片整理實(shí)用程序會(huì)把多個(gè)小的空閑盤區(qū)合并成一個(gè)較大的盤區(qū)。inode JFS 磁盤 inode 是 512 字節(jié)。一個(gè) JFS 磁盤 inode 包含 4 組基本信息。第一組描述 JFS 對(duì)象的 POSIX 屬性。第二組描述 JFS 對(duì)
32、象的其它屬性;這些屬性包括支持 VFS 必需的信息、操作系統(tǒng)環(huán)境特定的信息、以及 B+ 樹的頭部。第三組不是包含 B+ 樹根節(jié)點(diǎn)的盤區(qū)分配描述符就是包含內(nèi)嵌數(shù)據(jù)。第四組包含擴(kuò)展屬性、更多內(nèi)嵌數(shù)據(jù)或附加的盤區(qū)分配描述符。在 jfs_dinode.h 的 struct dinode 中定義磁盤 inode 結(jié)構(gòu)。 JFS 動(dòng)態(tài)分配 inode 提供的好處如下:inode 磁盤塊可放在任何磁盤地址,這使得 inode 號(hào)和位置分開。這種分離簡(jiǎn)化了支持聚集和文件集重組,能夠使聚集縮小??梢砸苿?dòng) inode ,移動(dòng)后號(hào)碼仍然相同。這允許 JFS 不必需要查找目錄結(jié)構(gòu)就可以更新 inode 號(hào)。對(duì)于支持
33、DFS 文件集復(fù)制而言,這種分離也是必需的。當(dāng)復(fù)制文件集時(shí),僅復(fù)制 inode 。既然 JFS 能把新的 inode 放在磁盤的任意位置,新 inode 將有與從它們復(fù)制的 inode 相同的號(hào)碼。這允許 JFS 不需復(fù)制目錄結(jié)構(gòu)并且更新 inode 號(hào)。 不再需要分配實(shí)際所需十倍的 inode 。這對(duì)于 JFS 中較大的 inode 尺寸(大于 512 字節(jié))而言,尤為重要。 大文件的文件分配可能消耗多個(gè)分配組且仍是連續(xù)的,而靜態(tài)分配造成間隔(由于每個(gè)分配組中初始分配的 inode )。 另一方面,動(dòng)態(tài) inode 分配造成大量問(wèn)題,包括:對(duì)于靜態(tài)分配,文件系統(tǒng)的幾何構(gòu)造隱含描述了磁盤上 i
34、node 的布局;對(duì)于動(dòng)態(tài)分配,必需有單獨(dú)的映射結(jié)構(gòu)。 對(duì) JFS 完整性而言,這些映射結(jié)構(gòu)是至關(guān)重要的。由于復(fù)制這些結(jié)構(gòu)的系統(tǒng)開銷,JFS 決定接受丟失這些映射表的風(fēng)險(xiǎn)。但是,JFS 將復(fù)制 B+ 樹結(jié)構(gòu),該結(jié)構(gòu)允許 JFS 查找映射表。 通過(guò)只分配磁盤上 inode 連續(xù)大塊的 inode 盤區(qū),動(dòng)態(tài)分配了 inode 。根據(jù)定義,一個(gè) JFS inode 盤區(qū)包含 32 個(gè) inode 。對(duì)于 512 字節(jié)的 inode 尺寸,因此磁盤上一個(gè) inode 盤區(qū)的大小是 16KB。當(dāng)分配新的 inode 盤區(qū)時(shí),并不初始化盤區(qū)。然而,要使 fsck 能夠檢查是否 inode 在使用中,JF
35、S 需要 inode 的一些信息。一旦盤區(qū)中的 inode 標(biāo)記成在使用中,就必須初始化它的文件集號(hào)、inode 號(hào)、inode 戳以及 inode 分配組塊地址。因此,鏈接字段就足以確定 inode 當(dāng)前是否正在使用。 注意,動(dòng)態(tài) inode 分配意味著在 inode 號(hào)與 inode 的磁盤地址之間沒有直接關(guān)系。因此,JFS 必須有查找磁盤上 inode 的方法。inode 分配映射表提供了這一功能。inode 生成號(hào)只是每當(dāng)重用 inode 時(shí)值就增加的計(jì)數(shù)器。存儲(chǔ)每個(gè) inode 生成計(jì)數(shù)器這一靜態(tài) inode 分配常用方法在動(dòng)態(tài) inode 分配中不起作用,因?yàn)楫?dāng) inode 空閑時(shí)
36、,其磁盤空間可能確實(shí)由不是 inode 的數(shù)據(jù)所重用,(換句話說(shuō),空間可能被收回,以存儲(chǔ)普通文件數(shù)據(jù))。因此,在 JFS 中,只有一個(gè) inode 生成計(jì)數(shù)器,它在每一個(gè) inode 分配時(shí)增加其值,即在重用 inode 時(shí),相應(yīng)的計(jì)數(shù)器增加其值,而不是每個(gè) inode 有一個(gè)計(jì)數(shù)器。B+ 樹 這一節(jié)描述文件布局使用的 B+ 樹數(shù)據(jù)結(jié)構(gòu)。選擇 B+ 樹是為了提高讀寫盤區(qū)的性能,這是 JFS 必須進(jìn)行的最普通操作。B+ 樹為讀取文件的特定盤區(qū)提供快速搜索。它還提供有效方法將盤區(qū)添加或插入文件中。較為少見的情形是:當(dāng)刪除文件時(shí),JFS 需要遍歷整個(gè) B+ 樹。為了保證 JFS 會(huì)刪除 B+ 樹使用
37、的塊以及文件數(shù)據(jù),對(duì)于遍歷 B+ 樹效率也很高。 盤區(qū)分配描述符(xad 結(jié)構(gòu))描述盤區(qū)并且又添加了表示文件所需的兩個(gè)字段:描述盤區(qū)表示的邏輯字節(jié)地址的偏移量和標(biāo)志字段。盤區(qū)分配描述符結(jié)構(gòu)在 jfs_xtree.h, struct xad 中定義。 xad 結(jié)構(gòu)為: struct xad unsignedflag:8; unsignedrsvrd:16; unsignedoff1:8; uint32 off2; unsignedlen:24; unsignedaddr1:8; uint32 addr2; xad_t;其中:flag 是包含各種標(biāo)志的 8 位字段。這些標(biāo)志能夠表示寫入時(shí)復(fù)制、是否
38、分配了盤區(qū)但沒有記錄它、壓縮信息等等。 rsvrd是保留供將來(lái)使用的 16 位字段。它總為零。 off1,off2 是 40 位字段,包含盤區(qū)中第一個(gè)塊的邏輯偏移量。邏輯偏移量是以聚集塊尺寸為單位表示;也就是說(shuō),要取得一個(gè)字節(jié),偏移量必須乘以聚集塊尺寸。 len 是 24 位字段,包含盤區(qū)的長(zhǎng)度。長(zhǎng)度以聚集塊尺寸為單位表示。 addr1,addr2 是 40 位字段,包含盤區(qū)的地址。地址以聚集塊尺寸為單位表示。 xad 結(jié)構(gòu)描述了兩個(gè)抽象范圍:磁盤上磁盤塊的物理范圍。它以聚集塊號(hào) xad_address 開始,并且延伸為 xad_length 聚集塊。 文件內(nèi)字節(jié)的邏輯范圍。它以字節(jié)號(hào) xad
39、_offset * AGBS(聚集塊尺寸)開始,并且延伸為 xad_length*AGBS 字節(jié)。 當(dāng)然,物理范圍和邏輯范圍有相同長(zhǎng)度的字節(jié)。請(qǐng)注意, xad_offset 以聚集塊尺寸為單位存儲(chǔ)(例如,在 xad_offset 中值 3 意味著 3 個(gè)聚集塊,而不是 3 個(gè)字節(jié))。它遵循文件內(nèi)盤區(qū)總是以聚集塊尺寸為邊界。 JFS 中的所有索引對(duì)象(除目錄外),有一個(gè)類屬 B+ 樹索引結(jié)構(gòu)。索引的數(shù)據(jù)將取決于對(duì)象。B+ 樹以由樹描述的數(shù)據(jù)的 xad 偏移量為鍵。項(xiàng)按 xad 結(jié)構(gòu)的偏移量排序。xad 結(jié)構(gòu)是 B+ 樹節(jié)點(diǎn)中的項(xiàng)。磁盤 inode 第二扇區(qū)底部包含數(shù)據(jù)描述符,它描述在 inode
40、 的后半部分內(nèi)存儲(chǔ)的內(nèi)容。對(duì)于足夠小的文件,后半部分可能包含內(nèi)嵌數(shù)據(jù)。如果文件數(shù)據(jù)不適合 inode 的內(nèi)嵌數(shù)據(jù)空間,它將包含在盤區(qū)中,inode 將包含 B+ 樹的根節(jié)點(diǎn)。頭部指出在使用的 xad 個(gè)數(shù),可用的 xad 個(gè)數(shù)。通常,inode 將包含 8 個(gè) xad 結(jié)構(gòu) B+ 樹的根。如果文件有 8 個(gè)或更少盤區(qū),那么這 8 個(gè) xad 結(jié)構(gòu)也是 B+ 樹的葉節(jié)點(diǎn)。它們將描述盤區(qū)。否則,inode 中的 8 個(gè) xad 結(jié)構(gòu)將指向 B+ 樹的葉節(jié)點(diǎn)或內(nèi)部節(jié)點(diǎn)。一旦 inode 中的 8 個(gè) xad 結(jié)構(gòu)均已填充,為了有更多的 xad 結(jié)構(gòu),就會(huì)嘗試使用 inode 的最后四分之一。如果 I
41、NLINEEA 位在 inode 的 di_mode 字段中設(shè)置,那么 inode 的最后四分之一可用。 一旦 inode 中所有可用的 xad 結(jié)構(gòu)都被使用,就必須拆分 B+ 樹。JFS 將把 4K 的磁盤空間分配給 B+ 樹的葉節(jié)點(diǎn)。葉節(jié)點(diǎn)邏輯上是帶頭的 xad 項(xiàng)的數(shù)組。頭部指向節(jié)點(diǎn)中第一個(gè)空閑的 xad 項(xiàng),沒有分配緊跟其后的所有 xad 項(xiàng)。8 個(gè) xad 項(xiàng)從 inode 復(fù)制到葉節(jié)點(diǎn),初始化頭部以指向第 9 個(gè)項(xiàng)作為第一個(gè)空閑項(xiàng)。然后 JFS 將把 B+ 樹的根更新為 inode 的第一個(gè) xad 結(jié)構(gòu);該 xad 結(jié)構(gòu)將指向最新分配的葉節(jié)點(diǎn)。這個(gè)新的 xad 結(jié)構(gòu)的偏移量是葉節(jié)
42、點(diǎn)中第一個(gè)項(xiàng)的偏移量。將更新 inode 中的頭部以表示當(dāng)前 B+ 樹只使用 1 個(gè) xad。還需要更新 inode 頭部以表示當(dāng)前 inode 包含 B+ 樹的純根。當(dāng)把新盤區(qū)添加到文件時(shí),將以必需的次序,繼續(xù)把它們添加到相同的葉節(jié)點(diǎn)。這將持續(xù)直到節(jié)點(diǎn)填滿為止。一旦節(jié)點(diǎn)填滿了,將為 B+ 樹的另一個(gè)葉節(jié)點(diǎn)分配新的 4K 磁盤空間。將把該 inode 的第二個(gè) xad 結(jié)構(gòu)設(shè)置成指向新分配的節(jié)點(diǎn)。這將持續(xù)直到填滿 inode 的所有 8 個(gè) xad 結(jié)構(gòu)為止,這時(shí),將再次拆分 B+ 樹。這種拆分將創(chuàng)建 B+ 樹的內(nèi)部 inode ,它們是純粹用來(lái)記錄樹的搜索路徑。JFS 將為 B+ 樹的內(nèi)部
43、inode 分配 4K 磁盤空間。內(nèi)部節(jié)點(diǎn)看起來(lái)如同葉節(jié)點(diǎn)。從 inode 復(fù)制 8 個(gè) xad 項(xiàng)到內(nèi)部節(jié)點(diǎn),初始化頭部以指向第 9 個(gè)項(xiàng)作為第一個(gè)空閑項(xiàng)。然后,通過(guò)使 inode 的第一個(gè) xad 結(jié)構(gòu)指向新分配的內(nèi)部節(jié)點(diǎn),JFS 更新 B+ 樹的根。將更新 inode 中的頭部以表示當(dāng)前 B+ 樹只使用 1 個(gè) xad。文件 jfs_xtree.h 在 struct xtpage_t 中描述 B+ 樹根的頭部。文件 jfs_btree.h 是在 struct btpage_t 中的內(nèi)部節(jié)點(diǎn)或葉節(jié)點(diǎn)的頭部。 例子 下列例子進(jìn)一步分析了盤區(qū)描述符和 xad 結(jié)構(gòu)的用法: 連續(xù)分配的 1041
44、377 字節(jié)文件。 相同的 1041377 字節(jié)文件,但在磁盤上拆分成三段。 1041377 字節(jié)的文件,但里面有一個(gè)洞(稀疏文件)。 連續(xù)分配的 16GB 文件。 在所有這些例子中,聚集塊尺寸都是 1KB。連續(xù)分配的 1041377 字節(jié)尺寸文件: 該文件需要 1017 個(gè) 1KB 聚集塊,(在最后一個(gè)聚集塊中,有 31 個(gè)字節(jié)丟失成為內(nèi)部存儲(chǔ)碎片)。要描述這個(gè)連續(xù)文件只需要一個(gè) xad 結(jié)構(gòu): flag這里不討論offset 0 /* the beginning of the file */length 1017/* 1017 1KB aggregate blocks */address
45、xxxxx /* aggregate block # */相同的 xad 結(jié)構(gòu)能夠表示任何長(zhǎng)度為 1040385 (1016 * 1024 + 1)到 1041408 (1017 * 1024)的連續(xù)文件,因?yàn)楸P區(qū)描述符只表示小于聚集塊大小粒度的尺寸。只有 inode 的 di_size 字段記錄字節(jié)粒度。 在 1041377 字節(jié)文件分三段: 假設(shè)相同的文件拆分成磁盤上三個(gè)不同盤區(qū):一個(gè)為 495 個(gè)聚集塊長(zhǎng),一個(gè)為 22,一個(gè)為 500。需要三個(gè) xad 結(jié)構(gòu)來(lái)表示該文件,每個(gè)物理盤區(qū)需要一個(gè): xad #0 :flag這里不討論offset 0 /* the beginning of t
46、he file */length 495 /* 495 1KB aggregate blocks */address xxxxx /* aggregate block # */xad #1:flag這里不討論offset 495 /* the beginning of the file */length 22 /* 22 1KB aggregate blocks */address yyyyy /* aggregate block # */xad #2:flag這里不討論offset 517 /* the beginning of the file */length 500 /* 500 1K
47、B aggregate blocks */address zzzzz /* aggregate block # */該例中,0 號(hào) xad 描述文件開始的 495 個(gè)物理聚集塊。 xad_offset 字段包含 0,因?yàn)樵?xad 描述以邏輯偏移量 0 開始的字節(jié)。第二個(gè) xad,1 號(hào) xad,描述文件接下來(lái)的 22 個(gè)物理聚集塊。 xad_offset 字段包含 495,因?yàn)樵?xad 描述以邏輯偏移量 506880 (495 * 1024) 開始的字節(jié);前面的字節(jié)由 xad 0 描述。最后一個(gè) xad 描述文件的最后 500 塊。這里, xad_offset 字段是 517。請(qǐng)注意,對(duì)于
48、非稀疏文件,給定 xad 的 xad_offset 字段等于所有以前 xad 結(jié)構(gòu)長(zhǎng)度和(在本例中,517 = 495 + 22)。如果這一關(guān)系總是成立的,那么 xad_offset 字段就是冗余的,可以消除。然而,下一個(gè)例子顯示,對(duì)于稀疏文件, xad_offset 字段不是冗余的。 1041377 字節(jié)的稀疏文件: 考慮經(jīng)由以下 POSIX 風(fēng)格的操作而創(chuàng)建的文件: fd = create (newfile, blah blah blah);write (fd, hi, 2);lseek (fd, 1041374, 0);write (fd, bye , 3);該文件有以邏輯字節(jié)偏移量 0
49、 開始的兩字節(jié)數(shù)據(jù)(hi),還有以邏輯字節(jié)偏移量 1,041,374 開始的三字節(jié)數(shù)據(jù) (bye),并且在這兩者之間全為 0(稀疏的)。文件的長(zhǎng)度為 1041377 字節(jié)。通常,JFS 不分配物理磁盤空間以保存從不寫入文件的字節(jié)范圍。因此,將占用兩個(gè) xad 結(jié)構(gòu)來(lái)表示該文件:一個(gè)為包含 hi 數(shù)據(jù)的盤區(qū),一個(gè)為包含 bye 數(shù)據(jù)的盤區(qū):xad #0 :flag這里不討論offset 0 /* the beginning of the file */length 1 /* 1 1KB aggregate blocks */address xxxxx /* aggregate block # *
50、/xad #1:flag這里不討論offset 1016/* the beginning of the file */length 1 /* 1 1KB aggregate blocks */address yyyyy /* aggregate block*/在該例中,第一個(gè)盤區(qū)(xad 0)包含字節(jié) hi,緊接著是 1022 字節(jié) 0。最后一個(gè)盤區(qū)(xad 1)包含 990 字節(jié) 0,緊接著是 3 字節(jié) bye。1KB 盤區(qū)中剩余的 31 字節(jié)不是文件的組成部分。(它們與第一個(gè)例子中丟失成為內(nèi)部存儲(chǔ)碎片的 31 個(gè)字節(jié)相同)。請(qǐng)注意,該例中, xad_offset 字段是必需的;這是知道 x
51、ad 1 表示文件內(nèi)在無(wú)法預(yù)料的邏輯偏移量字節(jié)序列的唯一方法(也即,xad 1 的偏移量不等于 xad 0 的偏移量加長(zhǎng)度)。這是表示稀疏文件的方法。 inode 的 di_size 字段包含寫入的最后一個(gè)字節(jié)偏移值加 1。 連續(xù)分配的 16GB 的文件: xad 結(jié)構(gòu)中的長(zhǎng)度字段僅有 24 位長(zhǎng):因此,它能包含的最大值是 2(24)-1。如果聚集塊大小是 1KB(例如),那么一個(gè) xad 能夠表示的最大盤區(qū)是(2(24)-1)*2(10)=1KB,小于 16G。暗示這也是 xad 結(jié)構(gòu)能夠表示的最大盤區(qū)。因此,如果文件夠大的話,就算它在磁盤上是相連的,也需要多個(gè) xad 結(jié)構(gòu)來(lái)表示它。本例中
52、顯示了這樣一個(gè)連續(xù)分配的文件:一個(gè) 16G 文件,它從聚集塊號(hào) 12345 開始連續(xù)分配,獲取 16777216 個(gè) 1KB 的聚集塊(16G)。 xad #0 :flag這里不討論offset 0 /* the beginning of the file */length 16777215/* 1 1KB aggregate blocks */address 12345 /* aggregate block*/xad #1:flag這里不討論offset 16777215/* the beginning of the file */length 1 /* 1 1KB aggregate bl
53、ocks */address 16789560/* aggregate block # */在該例中,不論文件在磁盤上是否相連,要表示它至少需要兩個(gè) xad 結(jié)構(gòu),這是由于單個(gè)盤區(qū)的長(zhǎng)度限制。塊分配映射表塊分配映射表用來(lái)為整個(gè)聚集跟蹤分配或釋放的磁盤塊。由于聚集內(nèi)所有的文件集共享相同的磁盤塊池,在分配或釋放磁盤塊時(shí),聚集內(nèi)所有的文件集可使用該分配映射表。 塊分配映射表本身是聚集 inode 2 描述的文件。當(dāng)初始創(chuàng)建聚集時(shí),分配包括聚集空間的映射表數(shù)據(jù)塊。映射表將隨著聚集的擴(kuò)充或緊縮而相應(yīng)動(dòng)態(tài)地增大或縮小。塊分配映射表跟蹤是否每個(gè)個(gè)別的聚集塊被分配還是釋放。映射表的每頁(yè)長(zhǎng)度為 4K。映射表包含
54、三種類型的頁(yè):bmap 控制頁(yè)、dmap 控制頁(yè)和 dmap 頁(yè)。 每個(gè) dmap 包含表示每個(gè)聚集塊的一位。第 i 位表示第 i 個(gè)邏輯聚集塊的分配狀態(tài)。它由 struct dmap_t 的 jfs_dmap.h 文件定義。每個(gè) dmap 頁(yè)包括 8K 的聚集塊。 因?yàn)閴K分配映射表可能有許多 dmap 頁(yè),它們由 dmap 控制頁(yè)組織。這些頁(yè)改進(jìn)了查找空閑塊的大盤區(qū)的性能。聚集的大小將決定需要多少頁(yè)和多少層。至多有三層,它允許的聚集塊的最大尺寸是 2(43)。如果不是所有層都需要,塊映射表 inode 是每個(gè)沒有使用層的第一頁(yè)有“洞”的稀疏文件。JFS 使用提交策略確??刂茢?shù)據(jù)可靠更新??煽?/p>
55、更新意味著一旦系統(tǒng)出錯(cuò)時(shí),要維持一致的 JFS 結(jié)構(gòu)和資源分配狀態(tài)。為了保證塊分配映射表是一致狀態(tài),JFS 維護(hù) dmap 結(jié)構(gòu)中的兩張映射表,工作映射表和持續(xù)映射表。工作映射表記錄當(dāng)前分配狀態(tài)。持續(xù)映射表記錄提交的分配狀態(tài),由磁盤上找到的或 JFS 日志或提交的 JFS 事務(wù)內(nèi)的記錄描述的分配狀態(tài)組成。當(dāng)釋放聚集塊時(shí),首先更新永久映射表。當(dāng)分配聚集塊時(shí),首先更新工作映射表。位值為 0 表示空閑資源,值為 1 表示已分配資源。塊分配映射表的 dmap 控制頁(yè)包含與 dmap 結(jié)構(gòu)中樹相似的樹,除葉層包含 1024 個(gè)元素外。dmap 控制頁(yè)由 struct dmapctl_t 定義??稍?jfs_dmap.h.文件中找到它。 要注意,dmap 結(jié)構(gòu)中的這一字段是一個(gè)平面數(shù)組,但它表示圖中顯示的樹。樹跟蹤除最底層之外的每層上連續(xù)塊的最大號(hào)。樹的最底層,從樹 85 到樹 341,包含下面
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中醫(yī)考核試題及答案
- 浙江省溫州市龍灣中學(xué)2025屆生物高二下期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 浙江省亳州市2024-2025學(xué)年高二數(shù)學(xué)第二學(xué)期期末統(tǒng)考試題含解析
- 云南省宣威市第十二中學(xué)2025屆高二生物第二學(xué)期期末聯(lián)考模擬試題含解析
- 浙江省溫州市九校2025年高二下物理期末綜合測(cè)試試題含解析
- 住宅小區(qū)地下車庫(kù)車位租賃與物業(yè)管理服務(wù)合同
- 國(guó)有企業(yè)財(cái)務(wù)總監(jiān)任期責(zé)任與績(jī)效合同
- 《新能源車市場(chǎng)分析與創(chuàng)新銷售策略實(shí)施合同》
- 車輛購(gòu)置稅代繳合同示范文本
- 企業(yè)間技術(shù)成果保密及合作開發(fā)合同
- 2025年下半年廣東汕尾市委組織部招聘政府聘員擬聘用人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 關(guān)于Photoshop圖像處理的試題及答案分享
- 2025年社會(huì)調(diào)查與統(tǒng)計(jì)分析考試題及答案
- DBJ41-T311-2025 《人民防空節(jié)鎳型不銹鋼防護(hù)設(shè)備選用與安裝技術(shù)標(biāo)準(zhǔn)》
- 2025-2030年中國(guó)軍用機(jī)器人行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025高考化學(xué)復(fù)習(xí)新題速遞之有機(jī)合成(解答大題)(2025年4月)
- 2024年佛山市三水樂投控股有限公司招聘考試真題
- 新聞閱讀-2024年中考語(yǔ)文記敘文閱讀專項(xiàng)復(fù)習(xí)(原卷版)
- 2025-2030年電石項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030中國(guó)RPA(機(jī)器人流程自動(dòng)化)市場(chǎng)規(guī)模體量及趨勢(shì)前景研究報(bào)告
- 國(guó)家開放大學(xué)《Web開發(fā)基礎(chǔ)》形考任務(wù)實(shí)驗(yàn)1-5參考答案
評(píng)論
0/150
提交評(píng)論