在LINUX系統中有一個重要的概念:一切都是檔案。其實這是UNIX哲學的一個展現,而Linux是重寫UNIX而來,是以這個概念也就傳承了下來。在UNIX系統中,把一切資源都看作是檔案,包括硬體裝置。UNIX系統把每個硬體都看成是一個檔案,通常稱為裝置檔案,這樣使用者就可以用讀寫檔案的方式實作對硬體的通路。這樣帶來優勢也是顯而易見的:
實作了裝置無關性。
UNIX 權限模型也是圍繞檔案的概念來建立的,是以對裝置也就可以同樣處理了。
下面我們來詳細的了解Linux檔案系統的幾個要點。
一、 實體磁盤到檔案系統
我們知道檔案最終是儲存在硬碟上的。硬碟最基本的組成部分是由堅硬金屬材料制成的塗以磁性媒體的盤片,不同容量硬碟的盤片數不等。每個盤片有兩面,都可記錄資訊。盤片被分成許多扇形的區域,每個區域叫一個扇區,每個扇區可存儲128×2的N次方(N=0.1.2.3)位元組資訊。在DOS中每扇區是128×2的2次方=512位元組,盤片表面上以盤片中心為圓心,不同半徑的同心圓稱為磁道。硬碟中,不同盤片相同半徑的磁道所組成的圓柱稱為柱面。磁道與柱面都是表示不同半徑的圓,在許多場合,磁道和柱面可以互換使用,我們知道,每個磁盤有兩個面,每個面都有一個磁頭,習慣用磁頭号來區分。扇區,磁道(或柱面)和磁頭數構成了硬碟結構的基本參數,幫這些參數可以得到硬碟的容量,基計算公式為:
存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區位元組數
要點:
(1)硬碟有數個盤片,每盤片兩個面,每個面一個磁頭
(2)盤片被劃分為多個扇形區域即扇區
(3)同一盤片不同半徑的同心圓為磁道
(4)不同盤片相同半徑構成的圓柱面即柱面
(5)公式: 存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區位元組數
(6)資訊記錄可表示為:××磁道(柱面),××磁頭,××扇區
那麼這些空間又是怎麼管理起來的呢?unix/linux使用了一個簡單的方法。如圖所示。
圖1.jpg
它将磁盤塊分為以下三個部分:
1) 超級塊,檔案系統中第一個塊被稱為超級塊。這個塊存放檔案系統本身的結構資訊。比如,超級塊記錄了每個區域的大小,超級塊也存放未被使用的磁盤塊的資訊。
2) I-切點表。超級塊的下一個部分就是i-節點表。每個i-節點就是一個對應一個檔案/目錄的結構,這個結構它包含了一個檔案的長度、建立及修改時間、權限、所屬關系、磁盤中的位置等資訊。一個檔案系統維護了一個索引節點的數組,每個檔案或目錄都與索引節點數組中的唯一一個元素對應。系統給每個索引節點配置設定了一個号碼,也就是該節點在數組中的索引号,稱為索引節點号
3) 資料區。檔案系統的第3個部分是資料區。檔案的内容儲存在這個區域。磁盤上所有塊的大小都一樣。如果檔案包含了超過一個塊的内容,則檔案内容會存放在多個磁盤塊中。一個較大的檔案很容易分布上千個獨産的磁盤塊中。
二、 建立一個檔案的過程
我們從前面可以知道檔案的内容和屬性是分開存放的,那麼又是如何管理它們的呢?現在我們以建立一個檔案為例來講解。
在指令行輸入指令:
$ who > userlist
我們可以通過系統指令ls來檢視建立檔案userlist的資訊:(ls 指令後的i就表示列印i節點資訊)
圖2.jpg
當完成這個指令時。檔案系統中增加了一個存放指令who輸出内容的新檔案userlist,那麼這整個過程到底是怎麼回事呢?
檔案主要有屬性、内容以及檔案名三項。核心将檔案内容存放在資料區,檔案屬性存放在i-節點,檔案名存放在目錄中。圖2顯示了建立一個檔案的例子,假如這個新檔案要3 個存儲塊來存放内容。那麼整個個程大概如下:
圖3.jpg
建立成功一個檔案主要有以下四個步驟:
1) 存儲屬性 也就是檔案屬性的存儲,核心先找到一塊空的i-節點。圖3中。核心找到i-節點号921130。核心把檔案的資訊記錄其中。如檔案的大小、檔案所有者、和建立時間等
2) 存儲資料 即檔案内容的存儲,由于該檔案需要3個資料塊。是以核心從自由塊的清單中找到3個自由塊。圖3中分别為600、200、992,核心緩沖區的第一塊資料複制到塊600,第二和第三分别複制到922和600.
3) 記錄配置設定情況,資料儲存到了三個資料塊中。是以必須要記錄起來,以後再找到正确的資料。配置設定情況記錄在檔案的i-節點中的磁盤序号清單裡。這3個編号分别放在最開始的3個位置。
4) 添加檔案名到目錄,新檔案的名字是userlist 核心将檔案的入口(47,userlist)添加到目錄檔案裡。檔案名和i-節點号之間的對應關系将檔案名和檔案和檔案的内容屬性連接配接起來,找到檔案名就找到檔案的i-節點号,通過i-節點号就能找到檔案的屬性和内容。
三、 建立一個目錄的過程
前面說了建立一個檔案的大概過程,也了解檔案内容、屬性以及入口的儲存方式,那麼建立一個目錄時又是怎麼回事呢?
我現在test目錄使用指令mkdir 新增一個子目錄child:
圖4.jpg
從使用者的角度看,目錄child是目錄test的一個子目錄,那麼在系統中這層關系是怎麼實作的呢?實際上test目錄包含一個指向子目錄child的i-節點的連結,原理跟普通檔案一樣,因為目錄也是檔案。目錄在系統中的儲存方式和結構大概如下:
圖5.jpg
目錄其實也是檔案,隻是它的内容比較特殊。是以它的建立過程和檔案建立過程一樣,隻是第二步寫的内容不同。
1) 系統找到空閑的i-節點号887220,寫入目錄的屬性
2) 找到空閑的資料塊1002來存儲目錄的内容,隻是目錄的内容比較特殊,包含檔案名字清單,清單一般包含兩個部分:i-節點号和檔案名,這個清單其實也就是檔案的入口,建立的目錄至少包含三個目錄”.”和”..”其中”.”指向自己,”..”指向上級目錄,我們可以通過比較對應的i-節點号來驗證,887270 對應着上級目錄中的child對應的i-節點号
3) 記錄配置設定情況。這個和建立檔案完全不樣
4) 添加目錄的入口到父目錄,即在父目錄中的child入口。
一般都說檔案存放在某個目錄中,其實目錄中存入的隻是檔案在i-節點表的入口,而檔案的内容則存儲在資料區。圖3中,我們一般會說“檔案userlist在目錄test中”,其實這意味着目錄test中有一個指向i-節點921130的連結,這個連結所附加的檔案名為userlist,這也可以這樣了解:目錄包含的是檔案的引用,每個引用被稱為連結。檔案的内容存儲在資料塊。檔案的屬性被記錄在一個被稱為i-節點的結構中。I-節點的編号和檔案名關聯起來存在目錄中。
注意:其中“.”表示是目前目錄。而“..”是目前目錄的父目錄。但也有特殊情況:如我們檢視根目錄/的情況:
圖6.jpg
發現“.”和“..”都指向i-節點2。實際上當我們用mkfs建立一個檔案系統時,mkfs都會将根目錄的父目錄指向自己。是以根目錄下.和..指向同一個i-節點也不奇怪了。
四、 了解連結
連結分為兩種,1是硬連結,2是符号連結(也稱為軟連結)
1、 硬連結
硬連結(had link),是将目錄連結到檔案樹的指針,硬連結同時也是将檔案名和檔案本身連結起來的指針
我們現在進入目錄child:并輸入法以下指令
圖7.jpg
我們發現通過ln建立的連結檔案mylink對應的i-節點也是921130.和上一級目錄下的userlist指向的i-節點号是一樣的。由此我們可以知道mylink和../userlist其實是指向同一個i-節點号,也可以了解為這兩者其實是同一個檔案。
圖8.jpg
建立一個連結的步驟大概如下:
1) 通過原檔案的檔案名找到檔案的i-節點号
2) 添加檔案名關聯到目錄,新檔案的名字是mylink 核心将檔案的入口(921130,mylink)添加到目錄檔案裡。
和建立檔案的過程比較發現,連結少了寫檔案内容的步驟,完全相同的是把檔案名關聯到目錄這一步
現在.i- 節點号921130對應了兩個檔案名。連結數也會變成2個,檔案的内容并不會發生任何變化。前面我們已經講了:目錄包含的是檔案的引用,每個引用被稱為連結。是以連結檔案和原始檔案本質上是一樣的,因為它們都是指向同一個i-節點。由于此原因也就可以了解連結的下列特性:你改變其中任何一個檔案的内容,别的連結檔案也一樣是變化;另外如果你删除某一個檔案,系統隻會在所指向的i-節點上把連結數減1,隻有當連結數減為零時才會真正釋放i-節點。
硬連結有兩個特點:
1)不能跨檔案系統
2)不能對目錄
2、符号連結
另外還有一種符号連結,也稱“軟連結”,符号連結是通過檔案名引用檔案,而不是i-節點号,這和硬連結的原理完全是不同的,我們先看屬性:
圖9.jpg
發現通過ln –s 建立的軟連結mylink2的i-節點是1574059,和../userlist的不相同。軟連結的好處就是可以跨不同的檔案系統,而且可以連結目錄