引子 目前,UNIX的文件系統(tǒng)有很多種實現(xiàn),例如UFS(基于BSD的UNIX文件系統(tǒng))、ext3、ext4、ZFS和Reiserfs等等。 不論哪一種文件系統(tǒng),總是需要存儲數(shù)據(jù)。硬盤的最小存儲單位是扇區(qū),數(shù)據(jù)所存儲的最小單位則不是扇區(qū),因為用扇區(qū)來存儲效率就太低了。一個扇區(qū)只有512字節(jié),而磁頭是一個扇區(qū)一個扇區(qū)地讀取,也就是說,如果文件是10MB,那么為了讀這個文件,磁頭必須要進行讀取20480次。這樣效率是極其低下的。
邏輯塊 為了提高效率,就有了邏輯塊(Block)的概念,也可以叫做數(shù)據(jù)塊。邏輯塊是在分區(qū)進行文件系統(tǒng)的格式化時所指定的“最小存儲單位”,這個最小存儲單位是以扇區(qū)為基礎(chǔ)的,所以邏輯塊的大小總是扇區(qū)的2的n次方倍。此時,磁頭可以一次讀取一個塊,這樣效率可就高了! 邏輯塊的規(guī)劃是很有學(xué)問的,并不是越大越好,因為一個邏輯塊最多也只能容納一個文件(在Linux的ext2中),所以如果邏輯塊被規(guī)劃的太大,那么會很浪費磁盤空間。舉個例子,如果一個邏輯塊為4KB,而有一個文件只有0.1KB大小,而這個小文件仍然要占用一個邏輯塊,因此就會浪費3.9KB的空間。 所以,在規(guī)劃磁盤時,需要考慮到主機的用途。比如BBS主機,由于文章短小,文件較小,那么邏輯塊分配的小一點好。如果主機主要用在存儲大容量的文件,那么考慮到使用效率,還是邏輯塊大一點好! 磁盤的組成 我們可以把一個磁盤分成一個或多個分區(qū)。每個分區(qū)可以包含一個文件系統(tǒng)。 我們下面要描述一個分層細化的過程,請您集中精力來隨我思考: 1 磁盤是由一個一個分區(qū)組成的,即磁盤=分區(qū)+分區(qū)+分區(qū)… 2 每一個分區(qū)內(nèi)都有一個文件系統(tǒng),且一個分區(qū)內(nèi)有且僅有一個文件系統(tǒng)。 3 每個分區(qū)內(nèi)都依次包含這些內(nèi)容:自舉塊(也叫引導(dǎo)塊),超級塊,柱面組0,柱面組1,…柱面組n。即分區(qū)=自舉塊+超級塊+柱面組(若干) 4 每個柱面組又包括了這些內(nèi)容:超級塊副本,配置信息,i節(jié)點圖(記錄哪些i節(jié)點可用),塊位圖(記錄哪些塊是否可用),i節(jié)點(許多),數(shù)據(jù)塊(也叫邏輯塊) 好了,你應(yīng)該可以根據(jù)1,2,3,4在腦海里構(gòu)造出一張分層圖了,如果你把它畫出來,對你記憶i節(jié)點的概念會更有好處。 超級塊 超級塊(superblock)的作用是存儲文件系統(tǒng)的大小、空的和填滿的塊,以及它們各自的總數(shù)和其他諸如此類的信息。要使用一個分區(qū)來進行數(shù)據(jù)訪問,那么第一個要訪問的就是超級塊。所以,如果超級塊壞了,那磁盤也就基本沒救了。 i節(jié)點 下面要講到i節(jié)點,就不能不提提Linux的安全性。由于Linux操作系統(tǒng)是一個多用戶、多任務(wù)的環(huán)境,為了保護每個用戶所擁有數(shù)據(jù)的隱密性,就將每個文件分成了兩個部分來存儲:一個是文件的屬性,另一個則是文件的內(nèi)容。 i節(jié)點(iinode)就是用來存儲文件的屬性的;而數(shù)據(jù)塊(邏輯塊)是用來存儲文件的內(nèi)容的! 如果要格式化一個分區(qū),就要指定inode的大小和塊的大小才行!更通俗的說,一個ext2文件系統(tǒng)是一定要包括inode表與塊區(qū)域這兩個部分的! 至于塊,我在前面提到過,它也叫邏輯塊,還叫數(shù)據(jù)塊,它是數(shù)據(jù)存儲的最小單位。 而inode“記錄文件屬性以及文件內(nèi)容放置在哪一個塊內(nèi)”的信息,更通俗的說,inode除了包含文件的屬性之外,還包括一個指針,這個指針就指向文件內(nèi)容放置的數(shù)據(jù)塊的位置,好讓操作系統(tǒng)可以方便的去讀取文件內(nèi)容。 在inode中一般包括了這樣一些文件屬性信息:
一個inode的大小通常為128字節(jié)。(在ext4中這個知識將被顛覆,ext4中的inode大小將擴展到256字節(jié)) 好,下面就來看看到底我們怎么利用inode來管理文件呢? 目錄 先來看看有關(guān)目錄操作的細節(jié): 如果我們建立了一個目錄,那么系統(tǒng)會分配給該目錄一個inode和至少一個塊。這個inode就記錄該目錄的相關(guān)屬性,并將其中的指針指向分配的那個數(shù)據(jù)塊。而所分配的塊內(nèi)則記錄了這個目錄下的相關(guān)文件(和子目錄)的關(guān)聯(lián)性,更通俗的說,目錄塊中存儲了一個包括三列的表,三列分別為:inode,文件名或目錄名,指向數(shù)據(jù)塊的指針。 我們用vi命令來查看一下一個目錄的內(nèi)容到底是什么:(當(dāng)然這只是用戶看到的,和文件系統(tǒng)的底層實現(xiàn)是不同的。) " ============================================================================ " Netrw Directory Listing (netrw v109) " /rocrocket/PSB/home/git27 " Sorted by name " Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$ " Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec " ============================================================================ ../ ./ .git/ roc.c 雙引號開頭的是注釋部分,而后緊跟著四個項,前兩個是任何目錄都固有的“上級目錄”和“當(dāng)前目錄”,而后是一個隱藏目錄.git,最后是一個當(dāng)前目錄下的文件roc.c??梢姡粋€目錄其實也是一個文件,只不過它其中不存儲用戶數(shù)據(jù),而是存儲目錄下的文件和子目錄列表。 如果在Linux中新建一個普通文件,則系統(tǒng)會為該文件分配至少一個inode與相對于該文件大小的塊數(shù)量。例如,假設(shè)一個塊為4KB,要建一個100KB的文件,則Linux將分配一個inode與25個塊來存儲該文件。 有一點要特別!特別!特別!提醒的是:inode本身并不記錄文件名,而是記錄文件的相關(guān)的屬性(在上文提到過的那些屬性),文件名則記錄在目錄所屬的塊區(qū)域。正因為這個原因,使得如果Linux讀取一個文件的內(nèi)容,就要先由根目錄/獲取該文件的上層目錄所在的inode,再由該目錄所記錄的的文件關(guān)聯(lián)性獲取該文件的inode,最后通過inode內(nèi)提供的塊指針來獲取最終的文件內(nèi)容。 鏈接計數(shù) 而當(dāng)談到鏈接數(shù)的時候,這里我還要提出一些概念和幾個規(guī)律性的結(jié)論: 每個i節(jié)點中都存有一個鏈接計數(shù),其值是指向該i節(jié)點的目錄項數(shù)。 只有當(dāng)鏈接技術(shù)減少到0時,才可刪除該文件(也就是釋放該文件占有的數(shù)據(jù)塊) 能夠增加鏈接數(shù)的鏈接為硬鏈接。 軟鏈接也叫符號鏈接,它的inode的文件類型是S_IFLNK。它只是存儲了另一個文件的路徑和名稱而已。 任何一個葉目錄(不包含任何其他目錄的目錄)的鏈接計數(shù)總是2,數(shù)值2來自于命名該目錄的目錄項以及在該目錄中的.項。 父目錄中的每一個子目錄都會使該父目錄的鏈接計數(shù)增1。 精彩引文 最后給出csdn網(wǎng)上qxp網(wǎng)友的一段關(guān)于軟鏈接和硬鏈接的評論,很不錯: 我們知道unix文件大致可以分為這樣三部分:目錄(文件名),inode 和數(shù)據(jù)區(qū)。 對于復(fù)制來說,不僅僅創(chuàng)建了新的目錄項(文件名),新的inode,還復(fù)制了該文件的所有數(shù)據(jù); 而硬連結(jié)則僅僅創(chuàng)建了新的目錄項,并且在目錄項中相應(yīng)的inode編號被連結(jié)到相應(yīng)的文件的inode編號,同時,該文件的inode引用計數(shù)加1; 這樣,你刪除原來的文件時候,文件數(shù)據(jù)并不會被刪除,因為inode結(jié)點引用計數(shù)>0,所以,通過硬連結(jié)還能繼續(xù)訪問。 換句話說,硬連接使得該文件存在另外一個別名,也就是另外一個入口。 順便說一下軟連結(jié),就是符號連結(jié),其實就相當(dāng)于是windows下的快捷方式。 創(chuàng)建了一個新的目錄項,一個新的inode,只不過數(shù)據(jù)區(qū)里放的是被引用的文件路徑和名稱。 結(jié)尾PS ps:其實寫這篇文章的目的,是為了在另一篇文章中更好的講解ln命令,到時會給出大家那篇文章的一個鏈接。 ps2:關(guān)于inode和目錄的一點優(yōu)秀評論:一個文件系統(tǒng)維護了一個索引節(jié)點的數(shù)組,每個文件或目錄都與索引節(jié)點數(shù)組中的唯一的元素對應(yīng)。每個索引節(jié)點在數(shù)組中的索引號,稱為索引節(jié)點號。linux文件系統(tǒng)將文件索引節(jié)點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節(jié)點號結(jié)合在一起的一張表,目錄中每一對文件名稱和索引節(jié)點號稱為一個連接。 |
|
來自: rookie > 《技術(shù)帖》