日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

转:ext2文件系统详解

發布時間:2024/10/14 windows 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:ext2文件系统详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

第一部分磁盤的物理組成

磁盤的基本概念:
扇區為最小的物理存儲單位,每個扇區為512字節。
將扇區組成一個圓,那就是柱面,柱面是分區的最小單位。
第一個扇區很重要,里面有硬盤主引導記錄(Masterbootrecord,MBR)及分區表,其中MBR占有446字節,分區表占有64字節。分區結構體如下的結構體如下:

struct partition{u8 drive; // 0x80u8 head;u8 sector;u8 cylinder;u8 sys_type; //分區類型 5為擴展分區u8 end_head; u8 end_sector;u8 end_cylinder;u32 start_sector; //起始扇區開始計數的第n個扇區u32 nr_sectors; //分區中的扇區個數 }


各種接口的磁盤在Linux中的文件名
①/dev/sd[a-p][1-15]:為SCSI,SATA,USB,Flash等接口的磁盤文件名;
②/dev/hd[a-d][1-63]:為IDE接口的磁盤文件名。

磁盤分區是告訴操作系統“我這塊磁盤在此分區可以訪問的區域是A柱面到B柱面之間的塊”,這樣操作系統就知道它可以在所指定的塊內進行文件數據的讀、寫、查找等操作。磁盤分區即指定分區的起始與結束柱面。
而指定分區的柱面范圍記錄在第一個扇區的分區表中。因為分區表只有64字節(每個分區項占用16個字節,這16個字節中存有活動狀態標志、文件系統標識、起止柱面號、磁頭號、扇區號、隱含扇區數目(4個字節)、分區總扇區數目(4個字節)等內容。),所以最多只能記錄4條分區的記錄,這四條記錄稱為主分區擴展分區。擴展分區還可以再分出邏輯分區。擴展分區最多只能有一個(操作系統限制),主分區和邏輯分區的內容可以被格式化,而擴展分區不能格式化。
注:MBR分區方案無法支持超過2TB容量的磁盤。因為這一方案用4個字節存儲分區的總扇區數,最大能表示2的32次方的扇區個數,按每扇區512字節計算,每個分區最大不能超過2TB。磁盤容量超過2TB以后,分區的起始位置也就無法表示了。
一個磁盤可以劃分成多個分區,每個分區必須先用格式化工具(如mkfs命令)格式化成某種格式的文件系統,然后才能存儲文件,格式化過程中會在磁盤上寫一些管理存儲布局的信息。一個分區只能格式化成一個文件系統

文件系統特性
我們都知道磁盤分區完畢后還需要進行格式化(format),之后操作系統才能夠使用這個分區。 為什么需要進行『格式化』呢?這是因為每種操作系統所配置的文件屬性/權限并不相同, 為了存放這些文件所需的數據,因此就需要將分區進行格式化,以成為操作系統能夠利用的『文件系統格式(filesystem)』。
傳統的磁盤與文件系統之應用中,一個分區就是只能夠被格式化成為一個文件系統,所以我們可以說一個 filesystem 就是一個 partition。但是由于新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術可以將一個分區格式化為多個文件系統(例如LVM),也能夠將多個分區合成一個文件系統(LVM, RAID)! 所以說,目前我們在格式化時已經不再說成針對 partition 來格式化了, 通常我們可以稱呼一個可被掛載的數據為一個文件系統而不是一個分區。
那么文件系統是如何運行的呢?這與操作系統的文件數據有關。較新的操作系統的文件數據除了文件實際內容外, 通常含有非常多的屬性,例如 Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、群組、時間參數等)。 文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至于實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。

每個 inode 與 block 都有編號,至于這三個數據的意義可以簡略說明如下:

superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量, 以及文件系統的格式與相關信息等;
inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的 block 號碼;
block:實際記錄文件的內容,若文件太大時,會占用多個 block 。

ext2文件系統

文件系統中存儲的最小單元是塊(block),一個塊的大小是在格式化時確定的。啟動塊(Boot Block)的大小為1KB,由PC標準規定,用來存儲磁盤分區信息和啟動信息,任何文件系統都不能修改啟動塊。
啟動塊之后才是ext2文件系統的開始,ext2文件系統將整個分區劃分成若干個同樣大小的塊組(Block Group)。
在整體的規劃當中,文件系統最前面有一個啟動扇區(boot sector),這個啟動扇區可以安裝啟動管理程序, 這是個非常重要的設計,因為如此一來我們就能夠將不同的啟動管理程序安裝到個別的文件系統最前端,而不用覆蓋整顆硬盤唯一的 MBR, 這樣也才能夠制作出多重引導的環境啊!至于每一個區塊群組(block group)的六個主要內容說明如后:

每個塊組的組成
1)超級塊(Super Block)描述整個分區的文件系統信息,如inode/block的大小、總量、使用量、剩余量,以及文件系統的格式與相關信息。超級塊在每個塊組的開頭都有一份拷貝(第一個塊組必須有,后面的塊組可以沒有)。 為了保證文件系統在磁盤部分扇區出現物理問題的情況下還能正常工作,就必須保證文件系統的super block信息在這種情況下也能正常訪問。所以一個文件系統的super block會在多個block group中進行備份,這些super block區域的數據保持一致。
超級塊記錄的信息有:

1、block 與 inode 的總量(分區內所有Block Group的block和inode總量);
2、未使用與已使用的 inode / block 數量;
3、block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes);
4、filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息;
5、一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。

struct ext2_super_block {__u32 s_inodes_count;__u32 s_blocks_count;__u32 s_r_blocks_count;__u32 s_free_blocks_count;__u32 s_free_inodes_count;__u32 s_first_data_block;__u32 s_log_block_size;__u32 s_log_clusters_size;__u32 s_log_block_per_group ;__u32 s_log_clusters_per_group ;__u32 s_log_inodes_per_group;__u32 s_mtime;__u32 s_wtime;__u16 s_mnt_count;__s16 s_max_mnt_count;__u16 s_magic; ...__u16 s_inode_size; }

每個區段與 superblock 的信息都可以使用 dumpe2fs 這個命令查詢
2)塊組描述符表(GDT,Group Descriptor Table)由很多塊組描述符組成,整個分區分成多個塊組就對應有多少個塊組描述符。
每個塊組描述符存儲一個塊組的描述信息,如在這個塊組中從哪里開始是inode Table,從哪里開始是Data Blocks,空閑的inode和數據塊還有多少個等等。塊組描述符在每個塊組的開頭都有一份拷貝。

struct ext2_group_desc {__u32 bg_block_bitmap; /* Blocks bitmap block */__u32 bg_inode_bitmap; /* Inodes bitmap block */__u32 bg_inode_table; /* Inodes table block */__u16 bg_free_blocks_count; /* Free blocks count */__u16 bg_free_inodes_count; /* Free inodes count */__u16 bg_used_dirs_count; /* Directories count */__u16 bg_flags;__u32 bg_exclude_bitmap_lo;/* Exclude bitmap for snapshots */__u16 bg_block_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+bitmap)LSB */__u16 bg_inode_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+bitmap)LSB */__u16 bg_itable_unused; /* Unused inodes count */__u16 bg_checksum; /* crc16(s_uuid+grouo_num+group_desc)*/ };


3)塊位圖(Block Bitmap)用來描述整個塊組中哪些塊已用哪些塊空閑。塊位圖本身占一個塊,其中的每個bit代表本塊組的一個block,這個bit為1代表該塊已用,為0表示空閑可用。假設格式化時block大小為1KB,這樣大小的一個塊位圖就可以表示1024*8個塊的占用情況,因此一個塊組最多可以有10248個塊。
4)inode位圖(inode Bitmap)和塊位圖類似,本身占一個塊,其中每個bit表示一個inode是否空閑可用。 Inode bitmap的作用是記錄block group中Inode區域的使用情況,Ext文件系統中一個block group中可以有16384個Inode,代表著這個Ext文件系統中一個block group最多可以描述16384個文件。
5)inode表(inode Table)由一個塊組中的所有inode組成。一個文件除了數據需要存儲之外,一些描述信息也需要存儲,如文件類型,權限,文件大小,創建、修改、訪問時間等,這些信息存在inode中而不是數據塊中。inode表占多少個塊在格式化時就要寫入塊組描述符中。 在Ext2/Ext3文件系統中,每個文件在磁盤上的位置都由文件系統block group中的一個Inode指針進行索引,Inode將會把具體的位置指向一些真正記錄文件數據的block塊,需要注意的是這些block可能和Inode同屬于一個block group也可能分屬于不同的block group。我們把文件系統上這些真實記錄文件數據的block稱為Data blocks。
Inode Table和單個Inode 結構

inode記錄的文件數據至少有:(都是文件屬性與權限描述信息)

該文件的訪問模式(rwx)
該文件的所有者與組(owner/group)
該文件的大小
該文件創建或狀態改變的時間(ctime)
最近一次的讀取時間(atime)
最近修改內容的時間(mtime)
定義文件特性的標志(flag),如SetUID等
該文件真正內容的指向(Pointer)

Ext2/Ext3文件系統中,采用Inode指針和Data block地址進行直接/間接關聯的方式記錄文件數據。一個Inode指針要么不對應任何文件的Data block,要么對應一個文件的一個或者多個Data block。在Ext3文件系統中一個Inode指針的長度為4字節,按照一個字節8個bit計算Ext3文件系統中的Inode指針支持32位Data block尋址(2 ^ 32個地址);到了Ext4文件系統,雖然它不再使用Inode指針,但同樣有地址索引的概念,并且長度擴展到了6字節,那么按照一個字節8個bit計算,Ext4文件系統中的索引支持48位Data block尋址(2 ^ 48個地址)。所以如果按照單個Data block記錄4KB數據大小來計算,Ext3文件系統支持的最大理論總容量就是:2 ^ 32 *4KB / 1024 / 1024 / 1024 = 16TB,而Ext4文件系統支持的最大理論總容量就是 2 ^ 48 *4KB / 1024 / 1024 / 1024 = 1,048,576TB = 1024 *1024TB。

Ext2/Ext3文件系統的Inode信息存放在block group的Inode Table區域,這個區域的默認大小為512個block,那么再根據文件系統中單個Inode的大小就可以得到每個block group所管理的Inode總數。例如當單位Inode的大小為256字節,得出每個block group所管理的Inode總數為 512 **4096字節 / 256字節 = 8192(Ext4文件系統);當Inode的大小為128字節,得出每個block group所管理的Inode總數為 512 * 4096字節 / 128字節 = 16384 (Ext3文件系統)

inode 的數量與大小也是在格式化時就已經固定了,除此之外 inode 還有些什么特色呢?

每個 inode 大小均固定為 128 bytes;
每個文件都僅會占用一個 inode 而已;
承上,因此文件系統能夠創建的文件數量與 inode 的數量有關;
系統讀取文件時需要先找到 inode,并分析 inode 所記錄的權限與用戶是否符合,若符合才能夠開始實際讀取 block 的內容。

我們約略來分析一下 inode / block 與文件大小的關系好了。inode 要記錄的數據非常多,但偏偏又只有 128bytes 而已, 而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每個 block 為 4K 時, 那么至少也要十萬筆 block 號碼的記錄呢!inode 哪有這么多可記錄的信息?為此我們的系統很聰明的將 inode 記錄 block 號碼的區域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區。這是啥?我們將 inode 的結構畫一下好了。

數據塊尋址:(ext2是索引式文件系統(indexed allocation))

一個inode占128字節,其中60個字節用于指向存放文件內容的數據塊指針。每個指針4字節,那么有15個指針。最后3個指針用分級間接尋址。
假設block為1KB。

12個直接指向,可以有12條記錄。
一級間接尋址:1024/4=256,可以有256條記錄。
二級間接尋址,可以有256* 256條記錄。
三級間接尋址,可以有256 * 256 *256條記錄。
所以對于1KB的塊大小最大可以表示(256^3 +256^2+256+12)*1KB≈16GB的文件。

6)數據塊(Data Block)是用來放置文件內容數據的地方。根據不同的文件類型有以下幾種情況:
對于普通文件,文件的數據存儲在數據塊中。
對于目錄,該目錄下的所有文件名和目錄名存儲在所在目錄的數據塊中,除了文件名外,ls -l命令看到的其它信息保存在該文件的inode中。
對于符合鏈接,如果目標路徑名較短則直接保存在inode中,如果較長則分配一個數據塊來保存。
設備文件、FIFO和socket等特殊文件沒有數據塊。

data block 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄啦。 不過要注意的是,由于 block 大小的差異,會導致該文件系統能夠支持的最大磁盤容量與最大單一文件容量并不相同。 因為 block 大小而產生的 Ext2 文件系統限制如下:
Block 大小 1KB 2KB 4KB
最大單一文件限制 16GB 256GB 2TB
最大文件系統總容量 2TB 8TB 16TB

你需要注意的是,雖然 Ext2 已經能夠支持大于 2GB 以上的單一文件容量,不過某些應用程序依然使用舊的限制, 也就是說,某些程序只能夠捉到小于 2GB 以下的文件而已,這就跟文件系統無關了!

除此之外 Ext2 文件系統的 block 還有什么限制呢?有的!基本限制如下:

原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
每個 block 內最多只能夠放置一個文件的數據;
承上,如果文件大于 block 的大小,則一個文件會占用多個 block 數量;
承上,若文件小于 block ,則該 block 的剩余容量就不能夠再被使用了(磁盤空間會浪費)。
如上第四點所說,由于每個 block 僅能容納一個文件的數據而已,因此如果你的文件都非常小,但是你的 block 在格式化時卻選用最大的 4K 時,可能會產生一些容量的浪費喔!我們以底下的一個簡單例題來算一下空間的浪費吧!

例題:
假設你的Ext2文件系統使用 4K block ,而該文件系統中有 10000 個小文件,每個文件大小均為 50bytes, 請問此時你的磁盤浪費多少容量?
答:
由于 Ext2 文件系統中一個 block 僅能容納一個文件,因此每個 block 會浪費『 4096 - 50 = 4046 (byte)』, 系統中總共有一萬個小文件,所有文件容量為:50 (bytes) x 10000 = 488.3Kbytes,但此時浪費的容量為:『 4046 (bytes) x 10000 = 38.6MBytes 』。想一想,不到 1MB 的總文件容量卻浪費將近 40MB 的容量,且文件越多將造成越多的磁盤容量浪費。

什么情況會產生上述的狀況呢?例如 BBS 網站的數據啦!如果 BBS 上面的數據使用的是純文本文件來記載每篇留言, 而留言內容如果都寫上『如題』時,想一想,是否就會產生很多小文件了呢?

好,既然大的 block 可能會產生較嚴重的磁盤容量浪費,那么我們是否就將 block 大小訂為 1K 即可? 這也不妥,因為如果 block 較小的話,那么大型文件將會占用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能導致文件系統不良的讀寫效能。

所以我們可以說,在您進行文件系統的格式化之前,請先想好該文件系統預計使用的情況。 以鳥哥來說,我的數值模式仿真平臺隨便一個文件都好幾百 MB,那么 block 容量當然選擇較大的!至少文件系統就不必記錄太多的 block 號碼,讀寫起來也比較方便啊!

ext2寫入過程
Linux操作系統為了加快I/O操作過程,當有文件需要寫入文件系統時Linux操作系統并不會立刻將文件數據實際寫入data block,而是存儲到一個內存區塊中。如果您通過top命令或者Free命令,就可以看到這個名叫cache memory的內存區塊。

[root@lab-backup ~]# freetotal used free shared buffers cached Mem: 3805272 3662628 142644 508 1758376 1491128 -/+ buffers/cache: 413124 3392148 Swap: 3948540 0 3948540

無論是Ext2文件系統還是Ext3文件系統又或者是Ext4文件系統,寫入cache memory區塊的這個過程是不會改變的。以上示例效果中還有一個叫做buffers memory的內存區塊,這個區塊緩存了文件系統的部分Inode信息,這樣保證了操作系統不會隨時到文件系統上尋找Inode——優化文件系統的讀性能。cache memory區塊和buffers memory區塊由操作系統自行管理,它們只會使用當前沒有被應用程序占用的空閑內存。當應用程序請求新的內存區塊且空閑內存不夠時,操作系統會釋放部分cache memory區塊或者buffers memory區塊。后文我們講解Linux下的Page Cache技術時,還會對這部分知識進行詳細講解。當cache memory區塊寫滿或者到達一個等待時間后,操作系統就會正式開始向文件系統寫數據了。

在Ext2文件系統中,完成文件寫入的過程可以簡要的進行如下描述:首先文件系統會在收到文件寫入請求后根據算法尋找一個還沒有使用的Inode,這個算法過程根據不同文件系統小版本和Linux內核版本的不同而有所變化,但尋找原則都是一樣的,即盡可能為文件尋找連續的inode和data block。上文已經提到Ext文件系統中,每一個block group都有Block bitmap區域和Inode bitmap區域分別用于記錄block group中的block和Inode的使用情況。在尋找Inode的這個步驟中,block group的Block bitmap、Inode bitmap區域還不會被寫入任何變化,block group的Group description table區域也不會被寫入任何變化。

接下來Ext2文件系統就要向硬件層正式寫入數據了,這個步驟還包括建立Inode和data block的關聯信息。最后當文件系統相對空閑的情況下,文件系統才會更新block group中的Block bitmap、Inode bitmap和Group description table區域。正常情況下這種操作過程并沒有太大的問題,因為文件系統隨時都清楚哪些Block bitmap、Inode bitmap被真正使用了,哪些Block bitmap、Inode bitmap是被使用但還沒有來得及更改狀態。當文件系統正常關閉時Ext2文件系統會設置一個校驗標記Valid bit=1,表示本次文件系統的操作正常結束。

但是如果當文件系統因為各種原因異常關閉時(例如斷電)這個標記的值就為0,那么問題就來了。因為哪些已經被使用但還沒有來得及被標示的Block bitmap、Inode bitmap區域,和真實的使用情況就存在誤差了。雖然操作系統下次啟動時會對整個文件系統進行掃描試圖恢復操作(主要目的是恢復Block bitmap、Inode bitmap和真實事情情況的一致性),但是操作系統并不保證一致性被全部恢復。這樣看來Ext2文件系統的寫入過程至少存在一下幾個問題:

由于data block塊的寫入操作和Block bitmap、Inode bitmap區域的更新過程是分開進行的,所以當系統異常關閉時Ext2文件系統并不能保證Block bitmap、Inode bitmap的狀態和真實的block使用情況完全一致。所以才會有系統重啟時試圖恢復磁盤一致性的修復操作。

Ext2文件系統對于大文件的讀寫性能并不好,這是因為當文件特別大時,Ext2文件系統會啟用三級間接指針和四級間接指針建立Inode和data block的聯系。雖然當data block size為4KB時單個文件的大小可達4TB,但是因為存儲大文件時會啟用二級、三級甚至四級間接指針,這大大增加了文件系統上的索引查找時間。所以這種多級索引的思路除了可以增加單個文件容量外,對提升大文件的讀寫性能實際上并沒有太多幫助。

另外Ext2文件系統在向data block寫入文件數據時,將以data block size(默認為4KB)為單位依次向硬件層提交數據,這就是為什么在其它設置不變的情況下,如果將Ext2文件系統的data block size格式化為8KB,會增加一定的磁盤讀寫性能的原因。

Ext3日志模式
以上小節中提到的Ext2文件系統的明顯問題中,最嚴重的應該還是文件系統異常情況下Block bitmap、Inode bitmap可能出現的一致性問題。所以Ext3文件系統在基本保持Ext2文件系統組織結構的前提下,使用索引日志的思路來解決Ext2文件系統上的數據一致性問題。

Ext3文件系統又被稱為日志文件系統,它在Ext2文件系統的基礎上做的主要改動就是,在正式寫入data block數據并建立Inode索引前,通過在磁盤上的某塊固定位置寫入一段日志數據的方式建立這兩個操作過程的關系,并根據后續操作進行日志數據的保留/刪除,以達到保持操作一致性的目的。這樣一來,即使文件系統上一次異常關閉,當文件系統再次啟動時也不需要再進行整個文件系統Inode和data block掃描了,只需要重新加載日志數據文件系統就可以知道上一次異常關閉時還有哪些Block bitmap、Inode bitmap沒有處理完。

Ext3文件系統支持三種日志模式,他們在數據一致性和I/O性能上有所區別:

journal日志模式

在這種模式下,當文件系統正式開始進行磁盤操作前會在磁盤的上專門的日志區域創建這個文件的副本,包括這個文件的Inode和data block完整信息,副本創建完成后才會按照正常的寫入過程進行文件寫入。當寫入操作正常完成后,文件系統會刪除日志區域的文件副本。這樣一來當文件系統發生異常并重啟后,e2fsck檢測程序會掃描日志區域中的副本:如果發現文件副本本身就不完整,則會丟棄這部分副本。如果發現文件副本是完整的,則會繼續完成正式文件的寫入過程,最后刪除文件副本。很顯然journal日志模式會增加單個文件的磁盤操作次數,所以journal日志模式是三種日志模式中速度最慢的一種。但是journal日志模式卻可以做到最完整的數據一致性要求。

ordered日志模式

ordered日志模式是Ext3/Ext4文件系統默認的日志模式。這種模式比 journal日志模式快了許多,因為ordered日志模式下Ext文件系統的日志區域并沒有真正記錄文件的真實數據,不會發生一個文件的多次讀寫過程。當文件系統為新文件確定了Inode和block區域后,這些Inode、Block bitmap、Inode bitmap等索引信息將會首先保存到文件系統的日志區域,并形成一個事務單位。當文件數據被完整寫入磁盤對應的block后,文件系統才會將日志區域的Inode信息和block信息提交到對應的block group中,完成整個寫入過程。當文件系統發生異常并重啟后,e2fsck檢測程序會掃描日志區域中的副本:如果發現還有事務單位沒有被提交,那么磁盤上對應的block位置上的信息將被清除,以保持文件信息一致性。

writeback日志模式

這是一種異步日志模式,文件系統的日志區域雖然也記錄將寫入磁盤的新文件的Inode、Block bitmap、Inode bitmap等索引信息。但是和ordered日志模式不同的是,這些日志信息記錄過程和文件數據的寫入過程沒有先后關聯,并且也不存在“提交”的概念。當文件系統發生異常并重啟后,e2fsck檢測程序也不會按照日志區域的數據狀態進行一致性修復。writeback日志模式在大多數情況下能夠提供最佳的Ext3/Ext4文件系統性能,因為日志功能幾乎是關閉的。

從以上三種Ext3文件系統日志模式的簡述中,可以發現的Ext3日志并不保證數據不丟失。實際上保證數據不丟失并不是Ext3日志的目標,而保證數據一致性才是Ext3日志的主要目標。為了達到這個目標,日志數據甚至會主動丟棄無法復原的副本數據。

設置文件系統日志級別
本小節介紹如何查看和設置Ext3/Ext4文件系統的日志模式。首先為了確定當前文件系統是否開啟了日志模式,可以使用dumpe2fs命令進行查看:

# dumpe2fs /dev/sdb2 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: 0e94b563-8348-4056-8770-67fa34e2b903 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype ...... Journal backup: inode blocks Journal features: (none) 日志大小: 128M Journal length: 32768 Journal sequence: 0x00000001 Journal start: 0 ...... 以下的block group信息可以忽略

可以看到Filesystem features選項中有一個has_journal關鍵信息標識,這表示當前文件系統已經開啟了日志功能。如果沒有看到這個標記,則說明文件系統本身還沒有開啟日志功能——這種情況下Ext3文件系統就和Ext2文件系統沒有太大區別了。

以下命令可以開啟Ext3/Ext4文件系統的日志功能:

# tune2fs -O has_journal /dev/sdb2 tune2fs 1.41.12 (17-May-2010) Creating journal inode: done

以下命令可以關閉Ext3/Ext4文件系統的日志功能:

# tune2fs -O ^has_journal /dev/sdb2 tune2fs 1.41.12 (17-May-2010)

但必須注意這并不表示指定了具體的日志模式,在開啟了文件系統日志功能的情況下讀者可以在使用mount進行具體掛載時指定日志模式。如下所示:

mount -o data=journal /dev/sdb2 /mnt/hgfs/

以上命令的data參數部分可以換成ordered、writeback和journal,代表文件系統支持的三種日志模式。設置完成后文件一同也完成了掛載。但是怎么檢查日志模式設置是否成功呢?讀者可以通過dmesg命令查看Linux系統的內核日志,在日志的最后一行會有最近一次的掛載信息,類似如下:

# dmesg ...... EXT3-fs (sdb2): using internal journal EXT3-fs (sdb2): mounted filesystem with journal data mode SELinux: initialized (dev sdb2, type ext3), uses xattr

可以看到內核日志信息的最后一行信息說明最近完成的內核變動操作,是按照journal日志模式掛載sdb2分區。當然內核日志信息包含了很多無用的信息,讀者還可以通過以下命令索引出需要查看的信息:

# dmesg | grep -B 1 "mounted filesystem" ...... sd 2:0:0:0: [sda] Attached SCSI disk EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: -- Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: -- EXT3-fs (sdb2): using internal journal EXT3-fs (sdb2): mounted filesystem with journal data mode ......

當然最終我們還是要實現磁盤的永久掛載,這是就需要更改Linux操作系統中的/etc/fstab文件了。如果讀者使用的是文件系統默認的ordered日志模式,則不需要在/etc/fstab文件中進行額外的設置。但如果不是這樣的話,讀者在設置/etc/fstab文件時,就要在其中的options列說明文件系統使用的日志模式。類似如下所示:

# vim /etc/fstab ...... /dev/sdb2 /mnt/hgfs ext3 data=journal 0 0 ......

總結

以上是生活随笔為你收集整理的转:ext2文件系统详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。