Linux ext2檔案系統小結

來源:互聯網
上載者:User

本文來源:http://learn.akae.cn/media/ch29s02.html 有修改

 

1.ext2檔案系統整體布局

一個磁碟可以劃分成多個分區,每個分區必須先用格式化工具(例如某種mkfs命令)格式化成某種格式的檔案系統,然後才能隱藏檔,格式化的過程會在磁碟上寫一些管理儲存布局的資訊。是一個磁碟分割格式化成ext2檔案系統後的儲存布局。

檔案系統中儲存的最小單位是塊(Block),一個塊究竟多大是在格式化時確定的,例如mke2fs-b選項可以設定塊大小為1024、2048或4096位元組,這些 blocks 被聚在一起分成幾個大的 block group。每個 block group 中有多少個 block 是固定的。而中啟動塊(Boot Block)的大小是確定的,就是1KB,啟動塊是由PC標準規定的,用來儲存磁碟分割資訊和啟動資訊,任何檔案系統都不能使用啟動塊。啟動塊之後才是ext2檔案系統的開始,ext2檔案系統將整個分區劃成若干個同樣大小的塊組(Block Group),每個塊組都由以下部分組成

 

1).超級塊(Super Block)

描述整個分區的檔案系統資訊,例如塊大小、檔案系統版本號碼、上次mount的時間等等。超級塊在每個塊組的開頭都有一份拷貝。

 

2).塊組描述符表(GDT,Group Descriptor Table)

由很多塊組描述符組成,整個分區分成多少個塊組就對應有多少個塊組描述符。每個塊組描述符(Group Descriptor)儲存一個塊組的描述資訊,例如在這個塊組中從哪裡開始是inode表,從哪裡開始是資料區塊,閒置inode和資料區塊還有多少個等等。和超級塊類似,塊組描述符表在每個塊組的開頭也都有一份拷貝,這些資訊是非常重要的,一旦超級塊意外損壞就會丟失整個分區的資料,一旦塊組描述符意外損壞就會丟失整個塊組的資料,因此它們都有多份拷貝。通常核心只用到第0個塊組中的拷貝,當執行e2fsck檢查檔案系統一致性時,第0個塊組中的超級塊和塊組描述符表就會拷貝到其它塊組,這樣當第0個塊組的開頭意外損壞時就可以用其它拷貝來恢複,從而減少損失。

 

3).塊位元影像(Block Bitmap)

一個塊組中的塊是這樣利用的:資料區塊儲存所有檔案的資料,比如某個分區的塊大小是1024位元組,某個檔案是2049位元組,那麼就需要三個資料區塊來存,即使第三個塊只存了一個位元組也需要佔用一個整塊;超級塊、塊組描述符表、塊位元影像、inode位元影像、inode表這幾部分儲存該塊組的描述資訊。那麼如何知道哪些塊已經用來隱藏檔資料或其它描述資訊,哪些塊仍然空閑可用呢?塊位元影像就是用來描述整個塊組中哪些塊已用哪些塊閒置,它本身佔一個塊,其中的每個bit代表本塊組中的一個塊,這個bit為1表示該塊已用,這個bit為0表示該塊空閑可用。

為什麼用df命令統計整個磁碟的已用空間非常快呢?因為只需要查看每個塊組的塊位元影像即可,而不需要搜遍整個分區。相反,用du命令查看一個較大目錄的已用空間就非常慢,因為不可避免地要搜遍整個目錄的所有檔案。

與此相聯絡的另一個問題是:在格式化一個分區時究竟會划出多少個塊組呢?主要的限制在於塊位元影像本身必須只佔一個塊。用mke2fs格式化時預設塊大小是1024位元組,可以用-b參數指定塊大小,現在設塊大小指定為b位元組,那麼一個塊可以有8b個bit,這樣大小的一個塊位元影像就可以表示8b個塊的佔用情況,因此一個塊組最多可以有8b個塊,如果整個分區有s個塊,那麼就可以有s/(8b)個塊組。格式化時可以用-g參數指定一個塊組有多少個塊,但是通常不需要手動指定,mke2fs工具會計算出最優的數值。

 

4).inode位元影像(inode Bitmap)

和塊位元影像類似,本身佔一個塊,其中每個bit表示一個inode是否空閑可用

 

5).inode表(inode Table)

我們知道,一個檔案除了資料需要儲存之外,一些描述資訊也需要儲存,例如檔案類型(常規、目錄、符號連結等),許可權,檔案大小,建立/修改/訪問時間等,也就是ls -l命令看到的那些資訊,這些資訊存在inode中而不是資料區塊中。每個檔案都有一個inode,一個塊組中的所有inode組成了inode表。

inode表佔多少個塊在格式化時就要決定並寫入塊組描述符中,mke2fs格式化工具的預設策略是一個塊組有多少個8KB就分配多少個inode。由於資料區塊佔了整個塊組的絕大部分,也可以近似認為資料區塊有多少個8KB就分配多少個inode,換句話說,如果平均每個檔案的大小是8KB,當分區存滿的時候inode表會得到比較充分的利用,資料區塊也不浪費。如果這個分區存的都是很大的檔案(比如電影),則資料區塊用完的時候inode會有一些浪費,如果這個分區存的都是很小的檔案(比如原始碼),則有可能資料區塊還沒用完inode就已經用完了,資料區塊可能有很大的浪費。如果使用者在格式化時能夠對這個分區以後要儲存的檔案大小做一個預測,也可以用mke2fs-i參數手動指定每多少個位元組分配一個inode。

 

6).資料區塊(Data Block)

根據不同的檔案類型有以下幾種情況

  • 對於常規檔案,檔案的資料存放區在資料區塊中。

  • 對於目錄,該目錄下的所有檔案名稱和目錄名儲存在資料區塊中,注意檔案名稱儲存在它所在目錄的資料區塊中,除檔案名稱之外,ls -l命令看到的其它資訊都儲存在該檔案的inode中。注意這個概念:目錄也是一種檔案,是一種特殊類型的檔案。

  • 對於符號連結,如果目標路徑名較短則直接儲存在inode中以便更快地尋找,如果目標路徑名較長則分配一個資料區塊來儲存。

  • 裝置檔案、FIFO和socket等特殊檔案沒有資料區塊,裝置檔案的主裝置號和次裝置號儲存在inode中。

 

2.資料區塊定址

如果一個檔案有多個資料區塊,這些資料區塊很可能不是連續存放的,應該如何定址到每個塊呢?實際上,根目錄的資料區塊是通過其inode中的索引項目Blocks[0]找到的,事實上,這樣的索引項目一共有15個,從Blocks[0]Blocks[14],每個索引項目佔4位元組。前12個索引項目都表示塊編號,例如上面的例子中Blocks[0]欄位儲存著24,就表示第24個塊是該檔案的資料區塊,如果塊大小是1KB,這樣可以表示從0位元組到12KB的檔案。如果剩下的三個索引項目Blocks[12]Blocks[14]也是這麼用的,就只能表示最大15KB的檔案了,這是遠遠不夠的,事實上,剩下的三個索引項目都是間接索引。

索引項目Blocks[12]所指向的塊並非資料區塊,而是稱為間接定址塊(Indirect Block),其中存放的都是類似Blocks[0]這種索引項目,再由索引項目指向資料區塊。設塊大小是b,那麼一個間接定址塊中可以存放b/4個索引項目,指向b/4個資料區塊。所以如果把Blocks[0]Blocks[12]都用上,最多可以表示b/4+12個資料區塊,對於塊大小是1K的情況,最大可表示268K的檔案。如所示,注意檔案的資料區塊編號是從0開始的,Blocks[0]指向第0個資料區塊,Blocks[11]指向第11個資料區塊,Blocks[12]所指向的間接定址塊的第一個索引項目指向第12個資料區塊,依此類推。

從可以看出,索引項目Blocks[13]指向兩級的間接定址塊,最多可表示(b/4)2+b/4+12個資料區塊,對於1K的塊大小最大可表示64.26MB的檔案。索引項目Blocks[14]指向三級的間接定址塊,最多可表示(b/4)3+(b/4)2+b/4+12個資料區塊,對於1K的塊大小最大可表示16.06GB的檔案。

可見,這種定址方式對於訪問不超過12個資料區塊的小檔案是非常快的,訪問檔案中的任意資料只需要兩次讀盤操作,一次讀inode(也就是讀索引項目)一次讀資料區塊。而訪問大檔案中的資料則需要最多五次讀盤操作:inode、一級間接定址塊、二級間接定址塊、三級間接定址塊、資料區塊。實際上,磁碟中的inode和資料區塊往往已經被核心緩衝了,讀大檔案的效率也不會太低。

 

3.檔案和目錄操作的系統函數(這裡面的"(n)"應該表示參數的個數)

1).stat(2)函數讀取檔案的inode,然後把inode中的各種檔案屬性填入一個struct stat結構體傳出給調用者。stat(1)命令是基於stat函數實現的。stat需要根據傳入的檔案路徑找到inode,假設一個路徑是/opt/file,則尋找的順序是:

  • 讀出inode表中第2項,也就是根目錄的inode,從中找出根目錄資料區塊的位置

  • 從根目錄的資料區塊中找出檔案名稱為opt的記錄,從屬記錄中讀出它的inode號

  • 讀出opt目錄的inode,從中找出它的資料區塊的位置

  • opt目錄的資料區塊中找出檔案名稱為file的記錄,從屬記錄中讀出它的inode號

  • 讀出file檔案的inode

還有另外兩個類似stat的函數:fstat(2)函數傳入一個已開啟的檔案描述符,傳出inode資訊,lstat(2)函數也是傳入路徑傳出inode資訊,但是和stat函數有一點不同,當檔案是一個符號連結時,stat(2)函數傳出的是它所指向的目標檔案的inode,而lstat函數傳出的就是符號連結檔案本身的inode。

 

2).access(2)函數檢查執行當前進程的使用者是否有許可權訪問某個檔案,傳入檔案路徑和要執行的訪問操作(讀/寫/執行),access函數取出檔案inode中的st_mode欄位,比較一下存取權限,然後返回0表示允許訪問,返回-1表示錯誤或不允許訪問。

 

3).chmod(2)fchmod(2)函數改變檔案的存取權限,也就是修改inode中的st_mode欄位。這兩個函數的區別類似於stat/fstatchmod(1)命令是基於chmod函數實現的。

 

4).chown(2)/fchown(2)/lchown(2)改變檔案的所有者和組,也就是修改inode中的UserGroup欄位,只有超級使用者才能正確調用這幾個函數,這幾個函數之間的區別類似於stat/fstat/lstatchown(1)命令是基於chown函數實現的。

 

5).utime(2)函數改變檔案的訪問時間和修改時間,也就是修改inode中的atimemtime欄位。touch(1)命令是基於utime函數實現的。

 

6).truncate(2)ftruncate(2)函數把檔案截斷到某個長度,如果新的長度比原來的長度短,則後面的資料被截掉了,如果新的長度比原來的長度長,則後面多出來的部分用0填充,這需要修改inode中的Blocks索引項目以及塊位元影像中相應的bit。這兩個函數的區別類似於stat/fstat

 

7).link(2)函數建立永久連結,其原理是在目錄的資料區塊中添加一條新記錄,其中的inode號欄位和原檔案相同。symlink(2)函數建立一個符號連結,這需要建立一個新的inode,其中st_mode欄位的檔案類型是符號連結,原檔案的路徑儲存在inode中或者分配一個資料區塊來儲存。ln(1)命令是基於linksymlink函數實現的。

 

8).unlink(2)函數刪除一個連結。如果是符號連結則釋放這個符號連結的inode和資料區塊,清除inode位元影像和塊位元影像中相應的位。如果是永久連結則從目錄的資料區塊中清除一條檔案名稱記錄,如果當前檔案的永久連結數已經是1了還要刪除它,就同時釋放它的inode和資料區塊,清除inode位元影像和塊位元影像中相應的位,這樣就真的刪除檔案了。unlink(1)命令和rm(1)命令是基於unlink函數實現的。

 

9).rename(2)函數改變檔案名稱,需要修改目錄資料塊中的檔案名稱記錄,如果原檔案名稱和新檔案名稱不在一個目錄下則需要從原目錄資料塊中清除一條記錄然後添加到新目錄的資料區塊中。mv(1)命令是基於rename函數實現的,因此在同一分區的不同目錄中移動檔案並不需要複製和刪除檔案的inode和資料區塊,只需要一個改名操作,即使要移動整個目錄,這個目錄下有很多子目錄和檔案也要隨著一起移動,移動操作也只是對頂級目錄的改名操作,很快就能完成。但是,如果在不同的分區之間移動檔案就必須複製和刪除inode和資料區塊,如果要移動整個目錄,所有子目錄和檔案都要複製刪除,這就很慢了。

 

10)readlink(2)函數讀取一個符號連結所指向的目標路徑,其原理是從符號連結的inode或資料區塊中讀出儲存的資料,這就是目標路徑。

 

11).mkdir(2)函數建立新的目錄,要做的操作是在它的父目錄資料塊中添加一條記錄,然後分配新的inode和資料區塊,inode的st_mode欄位的檔案類型是目錄,在資料區塊中填兩個記錄,分別是...,由於..表示父目錄,因此父目錄的永久連結數要加1。mkdir(1)命令是基於mkdir函數實現的。

 

12).rmdir(2)函數刪除一個目錄,這個目錄必須是空的(只包含...)才能刪除,要做的操作是釋放它的inode和資料區塊,清除inode位元影像和塊位元影像中相應的位,清除父目錄資料塊中的記錄,父目錄的永久連結數要減1。rmdir(1)命令是基於rmdir函數實現的。

 

13).opendir(3)/readdir(3)/closedir(3)用於遍曆目錄資料塊中的記錄。opendir開啟一個目錄,返回一個DIR *指標代表這個目錄,它是一個類似FILE *指標的控制代碼,closedir用於關閉這個控制代碼,把DIR *指標傳給readdir讀取目錄資料塊中的記錄,每次返回一個指向struct dirent的指標,反覆讀就可以遍曆所有記錄,所有記錄遍曆完之後readdir返回NULL。結構體struct dirent的定義如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.