歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux系統的文件系統詳解

Linux系統文件系統:

1、文件系統介紹
文件系統是linux的一個十分基礎的知識,同時也是學習linux的必備知識。
本文將站在一個較高的視圖來了解linux的文件系統,主要包括了linux磁盤分區和目錄、掛載基本原理、文件存儲結構、軟鏈接硬鏈接、和常見目錄的介紹。相信有了這些知識對於深入的學習linux會有一定的幫助。
Linux文件管理從用戶的層面介紹了Linux管理文件的方式。Linux有一個樹狀結構來組織文件。樹的頂端為根目錄(/),節點為目錄,而末端的葉子為包含數據的文件。當我們給出一個文件的完整路徑時,我們從根目錄出發,經過沿途各個目錄,最終到達文件。我們可以對文件進行許多操作,比如打開和讀寫。在Linux文件管理相關命令中,我們看到許多對文件進行操作的命令。它們大都基於對文件的打開和讀寫操作。
2、Linux文件常見的目錄
Linux發行版本之間的差別很少,差別主要表現在系統管理的特色工具以及軟件包管理方式的不同。目錄結構基本上都是一樣的。Windows的文件結構是多個並列的樹狀結構,最頂部的是不同的磁盤(分區),如:C,D,E,F等。
Linux的文件結構是單個的樹狀結構.可以用tree命令進行展示(默認沒有安裝)。
每次安裝系統的時候我們都會進行分區,Linux下磁盤分區和目錄的關系如下:
① 任何一個分區都必須掛載到某個目錄上。
② 目錄是邏輯上的區分。分區是物理上的區分。
③ 磁盤Linux分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操作。
④ 根目錄是所有Linux的文件和目錄所在的地方,需要掛載上一個磁盤分區。
以下是我們可能存在的一種目錄和分區關系:

Q:如何查看分區和目錄及使用情況?
– fdisk查看硬盤分區表
– df:查看分區使用情況
– du: 查看文件占用空間情況
Q: 為什麼要分區,如何分區?
– 可以把不同資料,分別放入不同分區中管理,降低風險。
– 大硬盤搜索范圍大,效率低
– 磁盤配合只能對分區做設定
– /home /var /usr/local經常是單獨分區,因為經常會操作,容易產生碎片。
3.文件類型
Linux下面的文件類型主要有:
a) 普通文件:C語言元代碼、SHELL腳本、二進制的可執行文件等。分為純文本和二進制。
b) 目錄文件:目錄,存儲文件的唯一地方。
c) 鏈接文件:指向同一個文件或目錄的的文件。
d) 特殊文件:與系統外設相關的,通常在/dev下面。分為塊設備和字符設備。
可以通過ls –l, file, stat幾個命令來查看文件的類型等相關信息。
4、存儲設備分區
文件系統的最終目的是把大量數據有組織的放入持久性(persistant)的存儲設備中,比如硬盤和磁盤。這些存儲設備與內存不同。它們的存儲能力具有持久性,不會因為斷電而消失;存儲量大,但讀取速度慢。觀察常見存儲設備。最開始的區域是MBR,
MBR(分為三個部分)
446字節(bootloader 引導加載器(是個程序))引導某個分區的加載的
46個字節(分區表)標識分區信息 每16個字節標識一個分區(所以只能劃分4個主分區)
2個字節(魔數)magic number 作用標記MBR是否有效(常見的55AA
用於Linux開機啟動(參考下列簡短總結Linux開機啟動過程)。
電腦開機--》BIOS(是一段程序)中的數據對計算機的健康狀態的自身檢查
將這段程序映射到內存最開始的那個段中(內存分為三段 BIOS段和內核空間和用戶空間)
根據BIOS中設定的啟動次序去尋找啟動設備的MBR
BOIS中設置的啟動順序去啟動對應的系統:設置的種類有:硬盤,光盤,U盤(winPE安裝系統的時候設置設備的啟動順序--》U盤先啟動)
找到上述的設備種類進行加載,把BootLoader加載到內存中(BIOS就退出了,把指令交給bootLoader)--》讀取分區表(64個字節)--》在分區中找到系統內核,把操作系統的內核讀進內存中進行解析--》把控制權交給內核--》內核啟動自身--》內核根據配置找到文件系統的位置--》啟動文件系統。
剩余的空間可能分成數個分區(partition)。每個分區有一個相關的分區表(Partition table),記錄分區的相關信息。這個分區表是儲存在分區之外的。分區表說明了對應分區的起始位置和分區的大小。

我們在Windows系統常常看到C分區、D分區等。Linux系統下也可以有多個分區,但都被掛載在同一個文件系統樹上。
數據被存入到某個分區中。一個典型的Linux分區(partition)包含有下面各個部分:

分區的第一個部分是啟動區(Boot block),它主要是為計算機開機服務的。Linux開機啟動後,會首先載入MBR(MBR:主引導記錄
在磁盤的第0盤面0磁道0扇區,大小512個字節)
,不屬於任何文件系統,是全局的,獨立於任何文件系統
隨後MBR從某個硬盤的啟動區加載程序。該程序負責進一步的操作系統的加載和啟動。為了方便管理,即使某個分區中沒有安裝操作系統,Linux也會在該分區預留啟動區。
啟動區之後的是超級區(Super block)。它存儲有文件系統的相關信息,包括文件系統的類型,inode的數目,數據塊的數目。
隨後是多個inodes,它們是實現文件存儲的關鍵。在Linux系統中,一個文件可以分成幾個數據塊存儲,就好像是分散在各地的龍珠一樣。為了順利的收集齊龍珠,我們需要一個“雷達”的指引:該文件對應的inode。每個文件對應一個inode。這個inode中包含多個指針,指向屬於該文件各個數據塊。當操作系統需要讀取文件時,只需要對應inode的"地圖",收集起分散的數據塊,就可以收獲我們的文件了。
最後一部分,就是真正儲存數據的數據塊們(data blocks)了。
5、文件系統
系統分區完成後,將要將分區格式化文件系統(文件系統是個管理軟件,存到磁盤分區的某個位置,文件系統不是整個分區)但是文件系統上的數據是在這個分區上的,所以說文件系統是一個管理軟件。
文件系統把磁盤分為兩片:元數據存儲區(metadata)(inode位圖、塊位圖、inode條目等等)、數據存儲區(數據存儲區又分為多個邏輯存儲單元叫做磁盤塊(是邏輯概念))
任何文件系統中的數據分為數據和元數據(metadata)。數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特征的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分布信息(inode...)等等。但是元數據中★不包含文件名★文件名存放在磁盤塊上的
6、文件存儲結構
Linux正統的文件系統(如ext2、ext3)一個文件由目錄項、inode和數據塊組成。
目錄項:包括文件名和inode節點號。
Inode:又稱文件索引節點,是文件基本信息的存放地和數據塊指針存放地。
數據塊:文件的具體內容存放地。
Linux正統的文件系統(如ext2、3等)將硬盤分區時會劃分出目錄塊、inode Table區塊和data block數據區域。一個文件由一個目錄項、inode和數據區域塊組成。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。
文件存儲結構大概如下:

其中目錄項的結構如下(每個文件的目錄項存儲在改文件所屬目錄的文件內容裡):

其中文件的inode結構如下(inode裡所包含的文件信息可以通過stat
filename查看得到):

inode簡介
上面我們看到了存儲設備的宏觀結構。我們要深入到分區的結構,特別是文件在分區中的存儲方式。文件是文件系統對數據的分割單元。文件系統用目錄來組織文件,賦予文件以上下分級的結構。在硬盤上實現這一分級結構的關鍵,是使用inode來虛擬普通文件和目錄文件對象。
在Linux文件管理中,我們知道,一個文件除了自身的數據之外,還有一個附屬信息,即文件的元數據(metadata)。這個元數據用於記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數據並不包含在文件的數據中,而是由操作系統維護的。事實上,這個所謂的元數據就包含在inode中。我們可以用$ls
-l filename來查看這些元數據。正如我們上面看到的,inode所占據的區域與數據塊的區域不同。每個inode有一個唯一的整數編號(inode number)表示。
在保存元數據,inode是“文件”從抽象到具體的關鍵。正如上一節中提到的,inode儲存由一些指針,這些指針指向存儲設備中的一些數據塊,文件的內容就儲存在這些數據塊中。當Linux想要打開一個文件時,只需要找到文件對應的inode,然後沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。

數據塊在1, 32, 0, ...
inode並不是組織文件的唯一方式。最簡單的組織文件的方法,是把文件依次順序的放入存儲設備,DVD就采取了類似的方式。但果有刪除操作,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理。
復雜的方式可以使用鏈表,每個數據塊都有一個指針,指向屬於同一文件的下一個數據塊。這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行。如果想隨機存取,那麼必須遍歷鏈表,直到目標位置。由於這一遍歷不是在內存進行,所以速度很慢。
FAT系統是將上面鏈表的指針取出,放入到內存的一個數組中。這樣,FAT可以根據內存的索引,迅速的找到一個文件。這樣做的主要問題是,索引數組的大小與數據塊的總數相同。因此,存儲設備很大的話,這個索引數組會比較大。
inode既可以充分利用空間,在內存占據空間不與存儲設備相關,解決了上面的問題。但inode也有自己的問題。每個inode能夠存儲的數據塊指針總數是固定的。如果一個文件需要的數據塊超過這一總數,inode需要額外的空間來存儲多出來的指針。
inode事例
在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應的inode編號。當我們輸入$cat /var/test.txt時,Linux將在根目錄文件中找到var這個目錄文件的inode編號,然後根據inode合成var的數據。隨後,根據var中的記錄,找到text.txt的inode編號,沿著inode中的指針,收集數據塊,合成text.txt的數據。整個過程中,我們參考了三個inode:根目錄文件,var目錄文件,text.txt文件的inodes。
在Linux下,可以使用$stat filename,來查詢某個文件對應的inode編號。


在存儲設備中實際上存儲為右圖
當我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然後根據inode的指針,把數據塊組合起來,放入內存供進一步的處理。當我們寫入一個文件時,是分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然後選取空白的數據塊,讓inode的指針指像這些數據塊,並放入內存中的數據。
7、軟連接、硬鏈接
軟鏈接和硬鏈接是我們常見的兩種概念:
硬連接:直接指向同一個inode的不同路徑彼此之間稱為硬鏈接是給文件一個副本,同時建立兩者之間的連接關系。修改其中一個,與其連接的文件同時被修改。如果刪除其中[color=red]任意一個[/color]其余的文件將不受影響。
軟連接:也叫符號連接,他只是對源文件在新的位置建立一個“快捷(借用一下wondows常用詞)”,指向另一個路徑(是一個字符串),最終訪問文件的權限是以哪個文件權限為准,所以,當源文件刪除時,符號連接的文件將成為無源之水->僅僅剩下個文件名了,當然刪除這個連接,也不會影響到源文件,但對連接文件的使用、引用都是直接調用源文件的。
具體關系可以看下圖:

從圖上可以看出硬鏈接和軟鏈接的區別:
1:硬鏈接原文件和新文件的inode編號一致。而軟鏈接不一樣。
2:對原文件刪除,會導致軟鏈接不可用,而硬鏈接不受影響。
3:對原文件的修改,軟、硬鏈接文件內容也一樣的修改,因為都是指向同一個文件內容的。
硬鏈接:
1、只能對文件創建,不能應用於目錄
2、不能跨文件系統
3、創建硬鏈接會增加文件系統被鏈接的次數
符號鏈接:
1、可應用於目錄
2、可以跨文件系統
3、不會增加被鏈接文件的鏈接次數
4、其大小為指定的路徑所包含的字符個數
上述圖片和大量內容來自:http://www.cnblogs.com/vamei http://www.cnblogs.com/vamei/p/3506566.html http://www.iteye.com/topic/816268
出於對原創博客作者的尊重,如有轉載的請保留這段聲明
Copyright © Linux教程網 All Rights Reserved