LINUX文件系統詳解linux
在LINUX系統中有一個重要的概念:一切都是文件。其實這是UNIX哲學的一個體現,而Linux是重寫UNIX而來,因此這個概念也就傳承了下來。在UNIX系統中,把一切資源都看做是文件,包括硬件設備。UNIX系統把每一個硬件都當作是一個文件,一般稱爲設備文件,這樣用戶就能夠用讀寫文件的方式實現對硬件的訪問。這樣帶來優點也是顯而易見的:數組
l 實現了設備無關性。spa
l UNIX 權限模型也是圍繞文件的概念來創建的,因此對設備也就能夠一樣處理了。命令行
下面咱們來詳細的瞭解Linux文件系統的幾個要點。unix
1、 物理磁盤到文件系統指針
咱們知道文件最終是保存在硬盤上的。硬盤最基本的組成部分是由堅硬金屬材料製成的塗以磁性介質的盤片,不一樣容量硬盤的盤片數不等。每一個盤片有兩面,均可記錄信息。盤片被分紅許多扇形的區域,每一個區域叫一個扇區,每一個扇區可存儲128×2的N次方(N=0.1.2.3)字節信息。在DOS中每扇區是128×2的2次方=512字 節,盤片表面上以盤片中心爲圓心,不一樣半徑的同心圓稱爲磁道。硬盤中,不一樣盤片相同半徑的磁道所組成的圓柱稱爲柱面。磁道與柱面都是表示不一樣半徑的圓,在 許多場合,磁道和柱面能夠互換使用,咱們知道,每一個磁盤有兩個面,每一個面都有一個磁頭,習慣用磁頭號來區分。扇區,磁道(或柱面)和磁頭數構成了硬盤結構 的基本參數,幫這些參數能夠獲得硬盤的容量,基計算公式爲: 索引
存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區字節數 資源
要點:test
(1)硬盤有數個盤片,每盤片兩個面,每一個面一個磁頭 原理
(2)盤片被劃分爲多個扇形區域即扇區
(3)同一盤片不一樣半徑的同心圓爲磁道
(4)不一樣盤片相同半徑構成的圓柱面即柱面
(5)公式: 存儲容量=磁頭數×磁道(柱面)數×每道扇區數×每扇區字節數
(6)信息記錄可表示爲:××磁道(柱面),××磁頭,××扇區
那麼這些空間又是怎麼管理起來的呢?unix/linux使用了一個簡單的方法。如圖所示。
圖1
它將磁盤塊分爲如下三個部分:
1) 超級塊,文件系統中第一個塊被稱爲超級塊。這個塊存放文件系統自己的結構信息。好比,超級塊記錄了每一個區域的大小,超級塊也存放未被使用的磁盤塊的信息。
2) I-切點表。超級塊的下一個部分就是i-節點表。每一個i-節點就是一個對應一個文件/目 錄的結構,這個結構它包含了一個文件的長度、建立及修改時間、權限、所屬關係、磁盤中的位置等信息。一個文件系統維護了一個索引節點的數組,每一個文件或目 錄都與索引節點數組中的惟一一個元素對應。系統給每一個索引節點分配了一個號碼,也就是該節點在數組中的索引號,稱爲索引節點號
3) 數據區。文件系統的第3個部分是數據區。文件的內容保存在這個區域。磁盤上全部塊的大小都同樣。若是文件包含了超過一個塊的內容,則文件內容會存放在多個磁盤塊中。一個較大的文件很容易分佈上千個獨產的磁盤塊中。
2、 建立一個文件的過程
咱們從前面能夠知道文件的內容和屬性是分開存放的,那麼又是如何管理它們的呢?如今咱們以建立一個文件爲例來說解。
在命令行輸入命令:
$ who > userlist
咱們能夠經過系統命令ls來查看新建文件userlist的信息:(ls 命令後的i就表示打印i節點信息)
圖2
當完成這個命令時。文件系統中增長了一個存放命令who輸出內容的新文件userlist,那麼這整個過程究竟是怎麼回事呢?
文件主要有屬性、內容以及文件名三項。內核將文件內容存放在數據區,文件屬性存放在i-節點,文件名存放在目錄中。圖2顯示了建立一個文件的例子,假如這個新文件要3 個存儲塊來存放內容。那麼整個個程大概以下:
圖3
建立成功一個文件主要有如下四個步驟:
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-節點號就能找到文件的屬性和內容。
3、 建立一個目錄的過程
前面說了建立一個文件的大概過程,也瞭解文件內容、屬性以及入口的保存方式,那麼建立一個目錄時又是怎麼回事呢?
我如今test目錄使用命令mkdir 新增一個子目錄child:
圖4
從用戶的角度看,目錄child是目錄test的一個子目錄,那麼在系統中這層關係是怎麼實現的呢?實際上test目錄包含一個指向子目錄child的i-節點的連接,原理跟普通文件同樣,由於目錄也是文件。目錄在系統中的保存方式和結構大概以下:
圖5
目錄其實也是文件,只是它的內容比較特殊。因此它的建立過程和文件建立過程同樣,只是第二步寫的內容不一樣。
1) 系統找到空閒的i-節點號887220,寫入目錄的屬性
2) 找到空閒的數據塊1002來存儲目錄的內容,只是目錄的內容比較特殊,包含文件名字列表,列表通常包含兩個部分:i-節點號和文件名,這個列表其實也就是文件的入口,新建的目錄至少包含三個目錄」.」和」..」其中」.」指向本身,」..」指向上級目錄,咱們能夠經過比較對應的i-節點號來驗證,887270 對應着上級目錄中的child對應的i-節點號
3) 記錄分配狀況。這個和建立文件徹底不樣
4) 添加目錄的入口到父目錄,即在父目錄中的child入口。
通常都說文件存放在某個目錄中,其實目錄中存入的只是文件在i-節點表的入口,而文件的內容則存儲在數據區。圖3中,咱們通常會說「文件userlist在目錄test中」,其實這意味着目錄test中有一個指向i-節點921130的連接,這個連接所附加的文件名爲userlist,這也能夠這樣理解:目錄包含的是文件的引用,每一個引用被稱爲連接。文件的內容存儲在數據塊。文件的屬性被記錄在一個被稱爲i-節點的結構中。I-節點的編號和文件名關聯起來存在目錄中。
注意:其中「.」表示是當前目錄。而「..」是當前目錄的父目錄。但也有特殊狀況:如咱們查看根目錄/的狀況:
圖6
發現「.」和「..」都指向i-節點2。實際上當咱們用mkfs建立一個文件系統時,mkfs都會將根目錄的父目錄指向本身。因此根目錄下.和..指向同一個i-節點也不奇怪了。
4、 理解連接
連接分爲兩種,1是硬連接,2是符號連接(也稱爲軟連接)
一、 硬連接
硬連接(had link),是將目錄連接到文件樹的指針,硬連接同時也是將文件名和文件自己連接起來的指針
咱們如今進入目錄child:並輸入法如下命令
圖7
咱們發現經過ln創建的連接文件mylink對應的i-節點也是921130.和上一級目錄下的userlist指向的i-節點號是同樣的。由此咱們能夠知道mylink和../userlist實際上是指向同一個i-節點號,也能夠理解爲這二者實際上是同一個文件。
圖8
建立一個連接的步驟大概以下:
1) 經過原文件的文件名找到文件的i-節點號
2) 添加文件名關聯到目錄,新文件的名字是mylink 內核將文件的入口(921130,mylink)添加到目錄文件裏。
和建立文件的過程比較發現,連接少了寫文件內容的步驟,徹底相同的是把文件名關聯到目錄這一步
如今.i- 節點號921130對應了兩個文件名。連接數也會變成2個,文件的內容並不會發生任何變化。前面咱們已經講了:目錄包含的是文件的引用,每一個引用被稱爲連接。因此連接文件和原始文件本質上是同樣的,由於它們都是指向同一個i-節點。因爲此緣由也就能夠理解連接的下列特性:你改變其中任何一個文件的內容,別的連接文件也同樣是變化;另外若是你刪除某一個文件,系統只會在所指向的i-節點上把連接數減1,只有當連接數減爲零時纔會真正釋放i-節點。
硬連接有兩個特色:
1)不能跨文件系統
2)不能對目錄
2、符號連接
另外還有一種符號連接,也稱「軟連接」,符號連接是經過文件名引用文件,而不是i-節點號,這和硬連接的原理徹底是不一樣的,咱們先看屬性:
圖9
發現經過ln –s 建立的軟連接mylink2的i-節點是1574059,和../userlist的不相同。軟連接的好處就是能夠跨不一樣的文件系統,並且能夠連接目錄