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