Linux中文件系統簡介

一塊新磁盤投入使用時,需要進行分區和格式化。磁盤的分區可以看成是一個“物理”的操作。而分區完成後還需要進行格式化,格式化就是將磁盤定義爲合適的文件系統,以便操作系統可以理解。(一般情況下,一個分區是一個單獨的文件系統,但也不一定。)

每個文件都有數據信息,也有文件本身的屬性信息(如所有者、所屬的組、創建時間、權限等)。在文件系統的設定裏,數據和屬性是放在不同的位置的。

一般的文件系統裏都包括block(主要是存放真正的文件內容,各block有不同的編號,從0開始編號)、inode(存放文件都放在哪些個block裏,同時還有權限等屬性信息)、superblock(存放文件系統已用了多少、inode編號用了多少、block用了多少等信息)。

如果一個分區太大的話,一般還會將之分成不同的block group,每個group裏有自己的inode/block/superblock信息(每個分區的第一個扇區都是boot sector,而一塊磁盤的第一個分區放的是MBR)。

嚴格來說,每一個block group都包含以下6個部分:

Data Block此部分放置的是文件的內容(而不是屬性)。Linux支持每一個Block可以爲1k、2k或4k的大小,可以根據自己的系統的情況在格式化的時候選擇不同的block大小。每一個block都有編號。

Inode Table此部分放置的文件的屬性,包括權限、幾個不同的時間、所有者、所屬組、大小以及該文件所對應的block的編號。需要注意的是,每個inode大小固定爲128byte,而每個文件都只會佔用一個inode。系統在讀取的時候,會先找到inode,分析權限,權限合適時,纔會去找block中的數據。

一個文件只會佔用一個inode。而一個文件根據內容的大小,可以放在一個block裏或分放在多個block裏。但一個block最多能放一個文件,也就是說,如果block的大小爲4k,但文件才1k,那麼該block會浪費3k的空間。

承上,一個inode爲128byte,而inode每記錄一個block號碼需要用掉4byte。照這樣計算,一個inode最多隻能記錄32個block號碼,也就是說,文件最大隻能是4k*32=128k,更何況這128byte裏除了記錄號碼還要記錄文件的屬性信息。那麼對於大文件,系統採用了將inode區域劃分爲權限區、12個直接記錄區、一個間接記錄區、一個雙間接記錄區和一個三間接記錄區的方法來解決。

直接記錄區就是直接寫入的block號碼。而間接記錄區是記錄了一個block號碼,此block並沒有寫文件數據,而寫的也是block號碼(相當於從block區域‘借’來了block當作了inode)。此時,假設當前文件系統的block大小爲1k,那麼此1k大小的block就可以寫入1k/4byte=256筆記錄,即可以再對應256個block。同理,雙間接,可以再對應256*256個block,三間接可以對應256*256*256個block。這樣的話,使用12個直接、1個間接、1個雙間接、1個三間接,對於block大小爲1k的文件系統來說,就能最多表示16GB的文件了。

SuperBlock存放的是該文件系統整體情況,包括block與inode的總量、未使用與已使用的量等。(SuperBlock可能並不是每個block group都有,可能就第一個block group纔有)。

Filesystem Discription是對整個文件系統的描述,包括每個block group的開始號碼、結束號碼等。

block bitmap記錄的是哪些block已使用,哪些未使用。

inode bitmap記錄的是哪些inode已使用,哪些未使用。

block bitmap和inode bitmap記錄都是使用或未使用的具體編號,而superblock裏記錄的只是一個總量和使用率等總體概念。

inode table存放的是權限等屬性,而block存放的真實的數據,這兩塊叫做數據存放區;而inode bitmap存放的是當前這個分區裏有哪些inode還未用,block bitmap裏存放的是有哪些block還未用,superblock裏存放的整個分區的使用情況等,故這三個區域可以叫做數據中介區。

格式化的時候,block都是從0開始編號。並且後續對文件系統的所有描述都是根據此編號進行的。在一個block group中,假設inode tabe佔用了34--44這11個block,由於每個inode是128字節,而每個block假設是4k,那麼此11個block裏可以存儲4k/128字節=32個inode。

df命令,即disk free,是用來查看磁盤的使用情況的,也可以列出當前系統的掛載情況;dumpe2fs(dump ext2/ext3 file system的簡寫)可以看出當前系統的inode、block等信息。

當新建一個目錄時,系統會給該目錄分配一個inode,並給該目錄分配一個block。inode會記錄該目錄的權限等屬性信息,並記錄inode對應的block編號。而該block裏會記錄該目錄下的文件信息,如文件名和文件佔用的inode信息。如果文件太多,而1個block盛不下的話,系統還會自動分配多個block給目錄使用。

這樣的話,當我們查找一個文件時,先找到所屬目錄的inode,然後找到目錄的block,然後找到文件的inode,查看權限符合時,纔去查找文件inode所記錄的block編號,找到文件的block。需要注意的是,文件的inode裏面並不記錄文件名,文件名是在所屬目錄的block裏記錄的。

新建一個文件的時候,會自動分配一個inode,同時會根據文件的大小來給它分配block數量。

每個filesystem的頂層inode編號都是2,因此,對於Linux系統中不同的掛載點來說,當ls -id的時候,會發現這幾個目錄的inode編號都是2.(具體有幾個掛載點,是在安裝系統時進行分區時設定的)。

clip_image001

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章