不論哪一種文件系統,總是需要存儲數據。硬盤的最小存儲單位是扇區,數據所存儲的最小單位則不是扇區,因為用扇區來存儲效率就太低了。一個扇區只有512字節,而磁頭是一個扇區一個扇區地讀取,也就是說,如果文件是10MB,那么為了讀這個文件,磁頭必須要進行讀取20480次。這樣效率是極其低下的。
邏輯塊
為了提高效率,就有了邏輯塊(Block)的概念,也可以叫做數據塊。邏輯塊是在分區進行文件系統的格式化時所指定的"最小存儲單位",這個最小存儲單位是以扇區為基礎的,所以邏輯塊的大小總是扇區的2的n次方倍。此時,磁頭可以一次讀取一個塊,這樣效率可就高了!
邏輯塊的規劃是很有學問的,并不是越大越好,因為一個邏輯塊最多也只能容納一個文件(在Linux的ext2中),所以如果邏輯塊被規劃的太大,那么會很浪費磁盤空間。舉個例子,如果一個邏輯塊為4KB,而有一個文件只有0.1KB大小,而這個小文件仍然要占用一個邏輯塊,因此就會浪費3.9KB的空間。
所以,在規劃磁盤時,需要考慮到主機的用途。比如BBS主機,由于文章短小,文件較小,那么邏輯塊分配的小一點好。如果主機主要用在存儲大容量的文件,那么考慮到使用效率,還是邏輯塊大一點好!
磁盤的組成
我們可以把一個磁盤分成一個或多個分區。每個分區可以包含一個文件系統。
我們下面要描述一個分層細化的過程,請您集中精力來隨我思考:
1 磁盤是由一個一個分區組成的,即磁盤=分區+分區+分區…
2 每一個分區內都有一個文件系統,且一個分區內有且僅有一個文件系統。
3
每個分區內都依次包含這些內容:自舉塊(也叫引導塊),超級塊,柱面組0,柱面組1,…柱面組n。即分區=自舉塊+超級塊+柱面組(若干)
4
每個柱面組又包括了這些內容:超級塊副本,配置信息,i節點圖(記錄哪些i節點可用),塊位圖(記錄哪些塊是否可用),i節點(許多),數據塊(也叫邏輯塊)
好了,你應該可以根據1,2,3,4在腦海里構造出一張分層圖了,如果你把它畫出來,對你記憶i節點的概念會更有好處。
超級塊
超級塊(superblock)的作用是存儲文件系統的大小、空的和填滿的塊,以及它們各自的總數和其他諸如此類的信息。要使用一個分區來進行數據訪問,那么第一個要訪問的就是超級塊。所以,如果超級塊壞了,那磁盤也就基本沒救了。
i節點
下面要講到i節點,就不能不提提Linux的安全性。由于Linux操作系統是一個多用戶、多任務的環境,為了保護每個用戶所擁有數據的隱密性,就將每個文件分成了兩個部分來存儲:一個是文件的屬性,另一個則是文件的內容。
i節點(iinode)就是用來存儲文件的屬性的;而數據塊(邏輯塊)是用來存儲文件的內容的!
如果要格式化一個分區,就要指定inode的大小和塊的大小才行!更通俗的說,一個ext2文件系統是一定要包括inode表與塊區域這兩個部分的!
至于塊,我在前面提到過,它也叫邏輯塊,還叫數據塊,它是數據存儲的最小單位。
而inode"記錄文件屬性以及文件內容放置在哪一個塊內"的信息,更通俗的說,inode除了包含文件的屬性之外,還包括一個指針,這個指針就指向文件內容放置的數據塊的位置,好讓操作系統可以方便的去讀取文件內容。
在inode中一般包括了這樣一些文件屬性信息:
文件的擁有者和所屬用戶組;
文件的訪問權限設定;
文件的類型;
文件的訪問、修改等時間
文件的大小;
文件的各種標志,如SUID和SGID等;
指向文件內容數據塊的指針。
一個inode的大小通常為128字節。(在ext4中這個知識將被顛覆,ext4中的inode大小將擴展到256字節)
好,下面就來看看到底我們怎么利用inode來管理文件呢?
目錄
先來看看有關目錄操作的細節:
如果我們建立了一個目錄,那么系統會分配給該目錄一個inode和至少一個塊。這個inode就記錄該目錄的相關屬性,并將其中的指針指向分配的那個數據塊。而所分配的塊內則記錄了這個目錄下的相關文件(和子目錄)的關聯性,更通俗的說,目錄塊中存儲了一個包括三列的表,三列分別為:inode,文件名或目錄名,指向數據塊的指針。
我們用vi命令來查看一下一個目錄的內容到底是什么:(當然這只是用戶看到的,和文件系統的底層實現是不同的。)
"
============================================================================
" 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
雙引號開頭的是注釋部分,而后緊跟著四個項,前兩個是任何目錄都固有的"上級目錄"和"當前目錄",而后是一個隱藏目錄.git,最后是一個當前目錄下的文件roc.c。可見,一個目錄其實也是一個文件,只不過它其中不存儲用戶數據,而是存儲目錄下的文件和子目錄列表。
如果在Linux中新建一個普通文件,則系統會為該文件分配至少一個inode與相對于該文件大小的塊數量。例如,假設一個塊為4KB,要建一個100KB的文件,則Linux將分配一個inode與25個塊來存儲該文件。
有一點要特別!特別!特別!提醒的是:inode本身并不記錄文件名,而是記錄文件的相關的屬性(在上文提到過的那些屬性),文件名則記錄在目錄所屬的塊區域。正因為這個原因,使得如果Linux讀取一個文件的內容,就要先由根目錄/獲取該文件的上層目錄所在的inode,再由該目錄所記錄的的文件關聯性獲取該文件的inode,最后通過inode內提供的塊指針來獲取最終的文件內容。
鏈接計數
而當談到鏈接數的時候,這里我還要提出一些概念和幾個規律性的結論:
每個i節點中都存有一個鏈接計數,其值是指向該i節點的目錄項數。
只有當鏈接技術減少到0時,才可刪除該文件(也就是釋放該文件占有的數據塊)
能夠增加鏈接數的鏈接為硬鏈接。
軟鏈接也叫符號鏈接,它的inode的文件類型是S_IFLNK。它只是存儲了另一個文件的路徑和名稱而已。
任何一個葉目錄(不包含任何其他目錄的目錄)的鏈接計數總是2,數值2來自于命名該目錄的目錄項以及在該目錄中的.項。
父目錄中的每一個子目錄都會使該父目錄的鏈接計數增1。
精彩引文
最后給出csdn網上qxp網友的一段關于軟鏈接和硬鏈接的評論,很不錯:
我們知道unix文件大致可以分為這樣三部分:目錄(文件名),inode 和數據區。
對于復制來說,不僅僅創建了新的目錄項(文件名),新的inode,還復制了該文件的所有數據;
而硬連結則僅僅創建了新的目錄項,并且在目錄項中相應的inode編號被連結到相應的文件的inode編號,同時,該文件的inode引用計數加1;
這樣,你刪除原來的文件時候,文件數據并不會被刪除,因為inode結點引用計數>0,所以,通過硬連結還能繼續訪問。
換句話說,硬連接使得該文件存在另外一個別名,也就是另外一個入口。
順便說一下軟連結,就是符號連結,其實就相當于是windows下的快捷方式。
創建了一個新的目錄項,一個新的inode,只不過數據區里放的是被引用的文件路徑和名稱。
關于inode和目錄的一點優秀評論:一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一的元素對應。每個索引節點在數組中的索引號,稱為索引節點號。linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。
參考文獻
本文參考《鳥哥的Linux私房菜》和《UNIX高級環境編程》;
更多信息可以查看:
http://baike.baidu.com/view/1097021.htm
http://security.zdnet.com.cn/security_zone/2008/1218/1284126.shtml
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
