Linux文件系統

1. 存儲設備分區

一個磁盤可以劃分為很多個扇區,每個扇區有512個字節,扇區是磁盤的基本存儲單元。將每個扇區編號,這樣磁盤就變為了一系列編了號的塊組合。一個磁盤主要包括引導塊,超級塊,i節點表,文件存儲區,進程對換區等。


  1. 引導塊。引導塊占用第0號物理塊,不屬于文件系統管轄;如果系統中有多個文件系統,只有跟文件系統才有引導程序放入引導塊中,其余文件系統都不使用引導塊。
  2. 超級塊。文件系統的第一個塊被稱為超級塊,這個塊存放的是文件系統本身的結構信息;比如超級塊記錄了每個區域的大小,存放未使用磁盤的信息等。
  3. i節點表。超級塊是下一個部分就是i節點表,每個文件對應一個i節點,每個文件都有一些屬性,如文件大小,所有者,創建時間等。這些信息存放在對應的i節點的結構中,所有的文件都具有相同大小的i節點,這些i節點組成一個i節點表,文件系統創建后,i節點的數目是有限的。所以一個文件系統能夠創建的文件也是有限的。
  4. 文件存儲區。文件系統的第3個部分是文件存儲區,文件的內容保存在這里,磁盤所有的塊大小都是一樣,如果文件大小超過一個塊的大小,則文件會存放在多個次磁盤塊中。
  5. 進程對換區。磁盤上會開辟一塊區域, 為對換區, 當內存中的進程需要擴大占用的內存空間, 而當前內存空間不足時, 則把某些不常用的進程暫時替換到對換區中, 在適用的時候又把他們換進 內存,解決內存不足和進程之間對內存的競爭問題。

2. 文件結構

大部分的Linux文件系統(如ext2、ext3)規定,一個文件由目錄項、inode和數據塊組成:目錄項記錄了文件的i節點號和文件名;i節點則包含了文件的基礎信息以及數據塊的指針;數據塊則包含文件的具體內容。

Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件。一個目錄文件的內容為目錄下所有文件的目錄項的列表,每個目錄項有i節點號和文件名組成。因此,通過目錄項即可知道文件的i節點,進而對文件內容進行訪問。

i節點中通常存放了一個文件的管理信息和一些基本的系統數據(如文件的長度、文件內容存放在磁盤上的位置等)。ls -i可以查看當前目錄下所有文件的i節點號;stat filename可以查看文件的系統信息,包括iNode。其結構如下:

struct dinode
{
 ushort di_mode;  /*文件類型+用戶權限*/
 short di_nlink;  /*文件鏈接數*/
 ushort di_uid;  /*屬主用戶id*/
 ushort di_gid;  /*屬主用戶組id*/
 off_t di_size;  /*文件大小*/
 char di_addr[40]; /*文件數據區起點地址*/
 time_t di_atime; /*最后訪問時間*/
 time_t di_mtime; /*最后修改時間*/
 time_t di_ctime; /*創建時間*/
}; 

i節點數據結構里面沒有文件名,那文件系統是如何管理文件名,i節點和文件內容之間的關系的呢?i節點號存儲在目錄入口的頭兩個字節中,是文件名字和其內容之間的唯一聯系。因此目錄中的文件名被稱為鏈,它把目錄層次結構中的名稱連接到它的i節點,同時也就鏈接到數據。同一個i節點號可以出現在多個目錄中,rm命令并不是真正刪除i節點,它刪除的是目錄入口或鏈。只有當鏈接到文件的最后的鏈消失后,系統才刪除i節點,也就是文件本身。

在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應的inode編號。當我們輸入$cat /var/test.txt時,Linux將在根目錄文件中找到var這個目錄文件的inode編號,然后根據inode合成var的數據。隨后,根據var中的記錄,找到text.txt的inode編號,沿著inode中的指針,收集數據塊,合成text.txt的數據。整個過程中,我們參考了三個inode:根目錄文件,var目錄文件,text.txt文件的inodes。

假設要創建一個新文件。該新文件占3個磁盤存儲塊。創建文件步驟如下:

  1. 內核先找到一塊空閑的i節點,內核找到空的i節點號為10,內核把文件信息記錄到其中,如文件大小,文件所有者,創建時間等。
  2. 存儲數據,即文件的內容存儲,由于該文件需要3個數據塊,內核從空閑的數據塊中找到3個數據塊,200,300,400。 將內容復制到這些塊中。
  3. 記錄分配情況,數據保存到3個數據塊中,必須記錄起來,以便下次查找。磁盤分配情況記錄在文件的i節點的磁盤序列列表中。
  4. 增加文件名和目錄。新文件的名字為hello.c,內核將文件的入口添加到目錄文件中,文件名和i節點號之間的對應關系,將文件名和文件屬性,內容聯系起來,找到文件名就找到文件的i節點號,通過i節點號就能夠找到文件的屬性和內容。

3. 硬鏈接與軟鏈接

一般情況下,文件名和inode號是"一一對應"關系,每個inode號對應一個文件名。但是,Linux系統允許多個文件名指向同一個inode號。這意味著,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問。這種情況就被稱為"硬鏈接"(hard link)。

ln命令可以創建硬鏈接,語法為:

ln source_file target_file

運行上面這條命令以后,源文件與目標文件的inode號相同,都指向同一個inode。inode信息中有一項叫做"鏈接數",記錄指向該inode的文件名總數,這時就會增加1。反過來,刪除一個文件名,就會使得inode節點中的"鏈接數"減1。當這個值減到0,表明沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

這里順便說一下目錄文件的"鏈接數"。創建目錄時,默認會生成兩個目錄項:"."和".."。前者的inode號就是當前目錄的inode號,等同于當前目錄的"硬鏈接";后者的inode號就是當前目錄的父目錄的inode號,等同于父目錄的"硬鏈接"。所以,任何一個目錄的"硬鏈接"總數,總是等于2加上它的子目錄總數(含隱藏目錄),這里的2是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接"。

除了硬鏈接以外,還有一種特殊情況。文件A和文件B的inode號雖然不一樣,但是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。因此,無論打開哪一個文件,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。l類似于windows系統中的快捷方式。

這意味著,文件A依賴于文件B而存在,如果刪除了文件B,打開文件A就會報錯:"No such file or directory"。這是軟鏈接與硬鏈接最大的不同:文件A指向文件B的文件名,而不是文件B的inode號碼,文件B的inode"鏈接數"不會因此發生變化。

ln -s命令可以創建軟鏈接,語法為:

ln -s source_file target_file

4. 文件權限

每個文件具有3種權限信息,讀、寫和執行;此外,還可以為不同的訪問者賦予不同的權限,有文件所有者、同組用戶和其他人三種權限組。ls -l可以在輸出其他信息的同時,也輸出權限信息。

例子:-rw-r--r--
-:文件類型(-:文件;d:目錄;l:軟鏈接文件)
文件只有三種權限:(r:讀;w:寫;x:執行)
rw-(u所有者);r--(g所屬組);r--(o其他人)

chmod命令用于改變文件的權限,權限可以用兩種方式表示:八進制數或符號。符號描述可以說明權限的相對改變,但八進制數更加容易使用。在八進制模式下通過給讀權限賦值4,給寫權限賦值2,給執行權限賦值1來改變權限。和ls中一樣,3個數字分別說明文件所有者、組成員和其他成員的權限。

例子:
chmod 754 junk 
給文件所有者賦予讀、寫和執行的權限(4+2+1),組成員讀和執行權限(4+1),其他成員讀權限(4)

除了超級用戶,就只有文件所有者本人才可以改變一個文件的權限,而不考慮權限本身是什么。

5. 目錄層次

因為linux是一個多用戶系統,制定一個固定的目錄規劃有助于對系統文件和不同的用戶文件進行統一管理。但就是這一點讓很多從windows轉到linux的初學者感到頭疼。\為根目錄,在根目錄有很多重要的目錄,其名稱和功能如下所示:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • inode是什么 理解inode,要從文件儲存說起。文件儲存在硬盤上,硬盤的最小存儲單位叫做"扇區"(Sector...
    狗尾巴草敗了閱讀 704評論 0 0
  • 1 Linux文件系統基礎知識 1.1 文件結構 Linux使用標準的目錄結構,在Linux安裝的時候,安裝程序就...
    瘋狂小王子閱讀 556評論 0 2
  • 學到linux上的軟連接和硬鏈接,不得不了解inode,要想知道inode,不得不了解一些文件系統,至少是Linu...
    ThinkerWalker閱讀 7,750評論 1 11
  • 一個基本的計算機系統由“硬件”和“軟件”組成,一臺Linux設備,主要的組成如下圖所示: 一般情況下,我們所說的L...
    時待吾閱讀 1,681評論 0 16
  • 姓名:鄺念君 學號:14020150024 【嵌牛導讀】:EXT3,EXT4,BTRFS和XFS是現在最常見的四個...
    nianjun閱讀 1,612評論 0 0