在linux中,i節(jié)點(diǎn)時(shí)一個(gè)64字節(jié)長(zhǎng)的表;i節(jié)點(diǎn)中含有有關(guān)一個(gè)文件的信息,其中有文件大小、文件所有者、文件存取許可方式,以及文件為普通文件、目錄文件還是特別文件等,在i節(jié)點(diǎn)中最重要的一項(xiàng)是磁盤地址表。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux中i節(jié)點(diǎn)
i節(jié)點(diǎn)是一個(gè)64字節(jié)長(zhǎng)的表,含有有關(guān)一個(gè)文件的信息,其中有文件大小、文件所有者、文件存取許可方式,以及文件為普通文件、目錄文件還是特別文件等。
linux文件系統(tǒng)是Linux系統(tǒng)的心臟部分,提供了層次結(jié)構(gòu)的目錄和文件。文件系統(tǒng)將磁盤空間劃分為每1024個(gè)字節(jié)一組,稱為塊(也有用512字節(jié)為一塊的,如:SCOXENIX)。編號(hào)從0到整個(gè)磁盤的最大塊數(shù)。
全部塊可劃分為四個(gè)部分,塊0稱為引導(dǎo)塊,文件系統(tǒng)不用該塊;塊1稱為專用塊,專用塊含有許多信息,其中有磁盤大小和全部塊的其他兩部分的大小。從塊2開始是i節(jié)點(diǎn)表,i節(jié)點(diǎn)表中含有i節(jié)點(diǎn),表的塊數(shù)是可變的,后面將做討論。i節(jié)點(diǎn)表之后是空閑存儲(chǔ)塊(數(shù)據(jù)存儲(chǔ)塊),可用于存放文件內(nèi)容。
文件的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)是十分不同的,邏輯結(jié)構(gòu)是用戶敲入cat命令后所看到的文件,用戶可得到表示文件內(nèi)容的字符流。物理結(jié)構(gòu)是文件實(shí)際上如何存放在磁盤上的存儲(chǔ)格式。用戶認(rèn)為自己的文件是邊疆的字符流,但實(shí)際上文件可能并不是以邊疆的方式存放在磁盤上的,長(zhǎng)于一塊的文件通常將分散地存放在盤上。然而當(dāng)用戶存取文件時(shí),linux文件系統(tǒng)將以正確的順序取出各塊,給用戶提供文件的邏輯結(jié)構(gòu)。
當(dāng)然,在linux系統(tǒng)的某處一定會(huì)有一個(gè)表,告訴文件系統(tǒng)如何將物理結(jié)構(gòu)轉(zhuǎn)換為邏輯結(jié)構(gòu)。這就涉及到i節(jié)點(diǎn)了。
i節(jié)點(diǎn)是一個(gè)64字節(jié)長(zhǎng)的表,含有有關(guān)一個(gè)文件的信息,其中有文件大小、文件所有者、文件存取許可方式,以及文件為普通文件、目錄文件還是特別文件等。在i節(jié)點(diǎn)中最重要的一項(xiàng)是磁盤地址表。
該表中有13個(gè)塊號(hào)。前10個(gè)塊號(hào)是文件前10塊的存放地址。這10個(gè)塊號(hào)能給出一個(gè)至多10塊長(zhǎng)的文件的邏輯結(jié)構(gòu),文件將以塊號(hào)在磁盤地址表中出現(xiàn)的順序依次取得相應(yīng)的塊。當(dāng)文件長(zhǎng)于10塊時(shí)又怎樣呢?磁盤地址表中的第11項(xiàng)給出一個(gè)塊號(hào),這個(gè)塊號(hào)指出的塊中含有256個(gè)塊號(hào),至此,這種方法滿足了至多長(zhǎng)于266塊的文件(272384字節(jié))。如果文件大于266塊,磁盤地址表的第12項(xiàng)給出一個(gè)塊號(hào),這個(gè)塊號(hào)指出的塊中含有256個(gè)塊號(hào),這256個(gè)塊號(hào)的每一個(gè)塊號(hào)又指出一塊,塊中含256個(gè)塊號(hào),這些塊號(hào)才用于取文件的內(nèi)容。磁盤地址中和第13項(xiàng)索引尋址方式與第12項(xiàng)類似,只是多一級(jí)間接索引。
這樣,在linux系統(tǒng)中,文件的最大長(zhǎng)度是16842762塊,即17246988288字節(jié),有幸是Linux系統(tǒng)對(duì)文件的最大長(zhǎng)度(一般為1到2M字節(jié))加了更實(shí)際的限制,使用戶不會(huì)無意中建立一個(gè)用完整個(gè)磁盤區(qū)所有塊的文件。
inode
提到inode,我們不得不先介紹硬盤的整體結(jié)構(gòu)。硬盤中包含多個(gè)硬盤盤片,硬盤盤片為圓形,每個(gè)硬盤盤片都有一個(gè)可以讀寫的磁頭(Head),將這個(gè)磁頭固定,使硬盤盤片旋轉(zhuǎn)一周,所走軌跡就是磁道(Track)。硬盤內(nèi)所有盤片的相同磁道號(hào)的集合成為磁柱(Cylinder)。每一磁道被劃分成許多區(qū)域,每個(gè)區(qū)域叫一個(gè)扇區(qū)(Sector)。扇區(qū)是硬盤的最小存儲(chǔ)物理量,一個(gè)扇區(qū)的存儲(chǔ)容量大約是512字節(jié)(約0.5K)。
知道了硬盤的大體結(jié)構(gòu)之后,再來談?wù)勗趺催M(jìn)行硬盤分區(qū)。進(jìn)行硬盤分割的最小單位是磁柱,分割完之后自然就是格式化(format)。在Linux中進(jìn)行格式化必須考慮Block與inode,Block還好理解,它是磁盤可以記錄的最小單位,是由數(shù)個(gè)扇區(qū)組成,所以大小通常為n*512Bytes,例如4K。
那么inode是什么呢Block是記錄文件內(nèi)容的區(qū)域,inode則是記錄該文件的屬性及其放置在哪個(gè)Block之內(nèi)的信息。所以,每個(gè)文件都會(huì)占用一個(gè)inode。當(dāng)Linux系統(tǒng)要查找某個(gè)文件時(shí),它會(huì)先搜索inode table找到這個(gè)文件的屬性及數(shù)據(jù)存放地點(diǎn),然后再查找數(shù)據(jù)存放的Block進(jìn)而將數(shù)據(jù)取出。inode數(shù)量在一開始已被設(shè)定好,其設(shè)定方式通常是"硬盤大小/一個(gè)容量",這個(gè)容量比Block大一些較佳,例如剛才將Block設(shè)為4K,那么這個(gè)容量可以設(shè)為8K左右。所以,一塊1GB的硬盤如果以8K 大小劃分它的inode數(shù),則會(huì)有131072個(gè)inode。一個(gè)inode的大小為128Byte,這樣,我們就可以清楚地知道,一個(gè)分區(qū)被格式化為一個(gè)文件系統(tǒng)之后,基本上它一定會(huì)有inode table與數(shù)據(jù)區(qū)域兩大塊,一個(gè)用來記錄文件的屬性信息與該文件存放的Block塊,一個(gè)用來記錄文件的內(nèi)容。
創(chuàng)建一個(gè)文件后,會(huì)同時(shí)創(chuàng)建一個(gè)inode和一個(gè)block,inode存放的是文件的屬性信息,但是不包括文件名,并存放所對(duì)應(yīng)數(shù)據(jù)所在的block塊的地址的指針;block存放文件的數(shù)據(jù),每個(gè)block最多存放一個(gè)文件,而當(dāng)一個(gè)block存放不下的情況下,會(huì)占用下一個(gè)block。
linux里文件的文件名、文件屬性、文件內(nèi)容是分別存儲(chǔ)的:文件名存放在目錄項(xiàng)(即dentry)中,文件屬性存放在inode中,一般情況下,每個(gè)inode占用128Bity磁盤空間,文件內(nèi)容存放在數(shù)據(jù)塊中。
block塊可以用mkfs.ext3 -b來制定快的大小,每個(gè)block塊最多可存放一個(gè)文件,所以一般block塊的大小設(shè)置要根據(jù)我們服務(wù)器的應(yīng)用了設(shè)置,如果這個(gè)服務(wù)器較多用來存放一些多的小文件,那就可以把block塊的大小設(shè)置的小一些,不至于浪費(fèi)空間,而當(dāng)存放的都是大數(shù)據(jù)時(shí)就需要把block設(shè)置的大些,這樣可以減少對(duì)磁盤block的讀取次數(shù),也可以減少inode的記錄負(fù)擔(dān)。
block越大,inode越少,適合存儲(chǔ)大文件的文件系統(tǒng);block越小,inode越多,適合存儲(chǔ)文件多而小的文件系統(tǒng)。
系統(tǒng)運(yùn)行時(shí),inode和block會(huì)在修改后內(nèi)存與磁盤做一個(gè)同步,我們用ls -li列出來的內(nèi)容這是內(nèi)存中的暫存,所以有時(shí)候系統(tǒng)非正常的關(guān)機(jī)會(huì)導(dǎo)致block和inode的不同步問題。
推薦學(xué)習(xí):Linux視頻教程