VOOZH about

URL: https://read01.com/x2Rn2.html

⇱ Linux文件系統——全方位掌握 - 壹讀


Sunday, Apr 12, 2026

Linux文件系統——全方位掌握

2015/04/30 來源:CSDN博客

文件系統的特性

磁碟分區完畢後需要進行格式化,作業系統才能使用這個分區。

不同作業系統能夠使用的文件系統是不同的,例如:Windows98以前使用FAT/FAT16文件系統,Windows2000以後使用NTFS文件系統,Linux使用Ext2文件系統。在分區完成之後,要使得作業系統能夠識別文件系統,就需要進行格式化,把分區格式化成某一個作業系統能夠識別的文件系統。

一般來說,一個分區中裝一個文件系統,但是現在技術發展了,一個分區可以裝多個文件系統,也能將多個分區合併成一個文件系統。一個文件系統可以掛載到作業系統上。

文件系統的構成

一個文件由許多的屬性和文件本身的數據組成,文件系統會把同一個文件的兩種數據分別存放在inode和block中。此外,整個文件系統還有個super block,用於記錄整個文件系統的整體信息。

  • inode:記錄一個文件的所有屬性,以及這個文件所對應的block的號碼(一個文件對應一個inode)
  • block:存放文件的實際數據(若文件數據太大,則使用多個block存放)
  • super block:記錄文件系統的整體信息,包括:inode、block的數量、文件系統的使用量、剩餘量等。
Ext2文件系統讀取數據的過程

要訪問一個文件時,首先找到這個文件的inode,根據inode中的權限查看當前用戶是否有權力讀取這個文件;然後查看inode中block的位置,最後找到block,讀出數據。這種文件系統就叫做索引式文件系統,所以Linux的ext2文件系統就是索引式文件系統。

PS:U盤(快閃記憶體)一般使用FAT文件系統,而FAT文件系統並沒有inode,每個block中記錄著本文件下一個block的位置。所以FAT文件系統無法通過inode一次性將這個文件所有的block號碼讀取出來,而只能一個個地讀取block後才能知道下一個block的位置。所以如果同一個文件的block分散地太開,那麼讀取一個文件的時間就會很長,所以就有所謂的「碎片整理「,就是將同一個文件的block們儘量放到一起去。但Linux的ext2文件系統由於是索引式的,因此不太需要碎片整理。 關於Ext2文件系統的一些補充說明
  • 有些文件系統非常大,高達數百GB,那麼格式化後會有大量的inode和block,為了方便管理,文件系統對所有的inode和block進行分組,每一組叫做block group,每一組都有獨立的inode/block/super block。
  • data block數據塊是用來存儲文件實際數據的地方,只有1KB、2KB、3KB這三種。
  • 所有的inode和block在格式化的時候大小和數量就固定了,而且每一個block都有固定的編號,便於inode查找。
  • 文件系統支持的最大磁碟容量和單一文件容量是不一樣的;
block大小 1KB 2KB 4KB
最大單一文件容量 16GB 256GB 2T

一個block只能存放一個文件的數據,如果文件太大,則使用多個block存放,如果一個block放不滿,則剩下的就空著。

  • 每個block的大小要合理地選擇, 如果太大,會造成最後一個block中會有大量剩餘的空間;如果太小,那麼inode中就要記錄更多的block號碼,每次找block要耗時,所以這樣效率也不高。
  • 由於每個inode在格式化的時候大小就已經固定了,並且只有128bytes,並且每個文件僅能占用一個inode,因此,文件系統能夠創建的文件數與inode的數量有關。除此之外:
  • 當一個文件很大時,它的block太多,每個block號碼需要4byte,那麼inode記錄不下了怎麼辦?這時候將block號碼存在一個block中,inode僅僅需要記錄這個block的號碼即可,這就是一次間接索引。Linux的ext2文件系統最多支持3級間接索引。
  • super block記錄了整個文件系統的相關信息,是非常重要的,如果super block死掉了,那麼系統會花費大量時間去挽救他。
  • 一般super block的大小為1024bytes
  • 每個block group中都含有一個super block,由於一個文件系統中只能有一個super block,所以這些group中的super block都是一樣的,在第一個super block掛了的時候進行挽救用的。
  • File System Description文件系統描述說明:描述所有區段的起始和結束的block號碼,所有區段包括:superblock、data block、inodebitmap、bitmap。
  • block bitmap塊對照表:這個表記錄了哪些block是空的,從而創建一個文件的時候能夠快速分配空的block。
  • inode bitmap:這個與block bitmap類似,它記錄哪些inode是空的。
inode與目錄的關係

當我們在Linux的ext2下創建一個目錄時,文件系統會給我們分配一個inode和一個block。

其中,inode記錄該目錄的相關權限與屬性,並記錄該block的號碼。

而block中記錄的是這個目錄的名字、這個目錄下所有的文件名、以及這些文件所占用的inode號碼。

//通過增加-i參數,可以查看文件所占用的inode號碼//PS:最前面的數字就是inode號碼ls -li total24606624drwx------+ 8 chaibozhou staff 272 4 28 08:31 Desktop606608drwx------+ 15 chaibozhou staff 510 4 26 20:14 Documents606610drwx------+ 60 chaibozhou staff 2040 4 29 20:37 Downloads606612drwx------@ 52 chaibozhou staff 1768 4 30 12:38 Libraryinode與文件的關係

當我們創建一個文件時,文件系統會分配一個inode和相對於文件大小的一些block。例如一個block為4KB,我們創建了一個100KB的文件,那麼需要分配一個inode和25個block;但Linux的ext2文件系統只有12個直接索引,所以還需要一個間接索引的block來存放該文件block的號碼。

文件的讀取過程

假設讀取/etc/passwd這個文件:

  1. 根據掛載點信息找到/dev/hdc2根目錄inode,也就是號碼為2的inode。(根目錄的inode號碼是2)。然後根據inode中的權限信息判斷當前用戶是否有權限訪問當前目錄;然後找到跟目錄對應的block號碼。
  2. 根目錄的block中存放著根目錄下所有文件和文件夾的名字和inode號碼;找到etc文件夾的inode號碼。
  3. 讀取該inode中的權限,判斷當前用戶是否有權限進入該目錄;讀取inode中的block號;到block 中查找passwd對應的inode號。
  4. 讀取該inode中權限並判斷,再讀取inode中block號碼,最後讀取block中的數據即可。
文件系統大小與磁碟讀寫性能的關係

當一個文件很大,需要很多的block,而這些block又存放的比較離散,這時磁碟讀寫性能就很低了。

如果由於文件系統的空閒block較為離散,即使是存一些小文件,仍然需要磁頭大量的移動,這時候就考慮將所有數據拷出來,然後格式化整個文件系統,再將數據拷回去。

如果文件系統太大,一個文件的block存放的位置很遠,那麼磁頭要移動大量的位置來讀取一個文件,此時效率就低了;也就是說,文件系統的大小不是越大越好的。 Ext2/3文件系統創建文件的過程

文件的創建過程

a)首先判斷該用戶對於新文件所在的目錄是否具有w和x權限,若有的話才能創建。

PS:因為目錄的w權限代表能夠創建、刪除、重命名、移動文件;x權限代表能夠cd到目錄中去。

b)根據inode bitmap找到沒有使用的inode號碼,把文件的屬性寫進去;

c)根據block bitmap找到沒有使用的block,將文件的數據寫進去,並更新inode,將block的號碼寫進去;

d)更新inode bitmap和block bitmap,更新super block。(更新中間數據)

數據的不一致性

inode和block被稱為數據的存放區域,super block、block bitmap、inode bitmap稱為中間數據(metadata)。如果在文件創建的過程中,因不明原因導致中斷,數據已經寫入inode和data block,但是更新中間數據的工作還沒有做完,此時就會出現meta data和實際數據存放區產生了不一致。

解決數據的不一致的方法——日誌文件系統

a)預備:當要寫入一個文件時,先在日誌文件中記錄某個文件準備要寫入的信息;

b)實際寫入:開始寫入文件的權限、屬性和數據;然後更新中間meta data。

c)結束:完成數據記錄與meta data更新之後,在日誌記錄塊中完成對該文件的記錄。

有了日誌文件的記錄,萬一哪個文件在創建過程中發生異常,那麼系統直接查看日誌文件,看看哪一個文件有預備記錄,但沒有結束記錄,然後僅對有問題的文件進行一致性檢查即可,無需對整個文件系統進行檢查,這樣就能夠實現快速恢復文件系統了。

異步處理

要處理一個文件,必須要把它全部放到內存中;那麼當處理一個很大的文件的時候,如果頻繁地要求作業系統將文件保存到外存,那麼我們系統會出現卡頓,等待文件寫入外存。為了避免寫入外存時候的等待,我們就引入了異步處理方式。

一個文件在內存中,如果沒有對他進行修改,那麼它的狀態是clean,系統不會把它寫入外存;若我們對文件進行了修改,那麼它的狀態就變成了dirty,此時我們繼續對文件進行操作,只不過系統會在後台不定時地將dirty狀態的文件寫入外存;也就是說,我們的操作和文件寫入外存是並行的,去除了我們的等待時間。

  • 我們可以手動調用sync,強迫內存中狀態為dirty的文件寫回外存中去(就相當於我們使用ctrl+s,如果不自己按的話,系統會不定時地自動把數據寫回外存)
  • 如果正常關機,系統會調用sync將內存中的數據寫回外存
  • 如果非正常關機,系統來不及將數據寫回外存,因此重啟的時候系統會花很多時間進行磁碟檢驗,甚至可能導致文件系統的損壞(不會引起磁碟的損壞)
掛載點

每個文件系統都有獨立的inode、block、super block等信息,每個文件系統都必須連接到系統的目錄樹上才能夠被使用。我們將文件系統連接到目錄樹上的動作叫做掛載,就好像果子掛到樹上去。

PS:掛載點一定得是目錄,這個目錄是進入這個文件系統的入口。

舉例來說:假設有三個掛載點/、/boot、/home,他們對應的設備文件分別是:/dev/hdc2,/dev/hdc1,/dev/hdc3,那麼查看這三個目錄的inode號碼可以發現:

2drwxr-xr-x23root wheel312232222:18/2drwxr-xr-x4root wheel142232422:18/boot2drwxr-xr-x6root wheel12232522:18/home

他們的inode號碼都是2,說明他們都是文件系統的根目錄,但是它們的其他數據都是不一樣的,說明他們不是同一個文件,所以他們三個人來自三個不同的文件系統。

如果inode號碼一致,並且其他屬性都相同,則可以判斷他們是同一個文件,就像/,/.,/..

文件系統的簡單操作
  • 獲取磁碟容量 df/du

    a)df:獲取整個文件系統的磁碟使用量
df//不添加參數,顯示所有的文件系統,以1KB為單位Filesystem512-blocksUsed Available Capacity iused ifree%iused Mountedon/dev/disk197438924810823781686563943212%1359372510820492911%/devfs3633630100%6280100%/devmap-hosts000100%00100%/netmapauto_home000100%00100%/home
  • Filesystem:這一列是各個磁碟設備的名字,表示這個文件系統在哪個分區
  • 512-blocks:代表下面block是以512KB為單位的,代表block的個數
  • Used:使用掉的磁碟空間
  • Available:剩下的磁碟空間
  • Capacity:剩下磁碟空間的百分比
  • iused:使用了多少磁碟空間
  • ifree:
  • %iused :使用掉空間的百分比
  • Mounted on:掛載點的名字,也就是磁碟掛載的目錄

    PS:df主要是針對整個文件系統,因此讀取的是super block中的數據,所以它顯示的非常快。

    PS:我們需要特別留意根目錄的剩餘量,因為所有的數據都是從根目錄衍生而來的,因此當根目錄的剩餘量為0時,那你的系統問題就很大了。

    b)du:獲取某個目錄的容量

du [option] 文件/目錄 -a:列出所有的目錄和文件的容量,要是不寫這個參數默認只是列出文件的容量而已。-n:以人們較為容易的格式顯示容量-s:列出目標目錄的總容量,而不列出個別的目錄容量-S:列出目錄總容量,但不包括子目錄-k:容量以KB顯示-m:容量以MB顯示//PS:若這個命令不帶任何參數則列出當前目錄的容量,單位是1KB。

連接文件 ln

Linux下的連接文件有兩種,一種是類似於Windows下的快捷方式,稱為符號連接;另一種稱為硬連接。

a)硬連接(實際連接)

我們知道,目錄的block中存放的是這個目錄下的所有文件名和他們的inode號碼,也就是說,文件名只與目錄有關,而文件的內容是通過目錄block中記錄的inode號碼來找到的。

硬連接就是新建一個文件名,連接到某inode號碼。就是兩個不同的文件名,但是指向同一個inode。

經過了硬連接的文件,如果刪除其中一個文件,那麼還有另外一個文件名指向這個文件,這個文件的block仍然是存在的。此外,不論通過哪個文件名修改文件,由於兩個文件名都是指向同一個文件內容,所以兩個文件的內容都會發生變化。

使用硬連接設置文件連接時,磁碟空間的inode和block的數目都不會發生變化。只是某個目錄的block下多了一個連接文件名的inode號碼而已。

硬連接不能跨文件系統。

硬連接只能連接兩個文件,而不能連接兩個目錄。

b)符號連接(快捷方式)

再新建一個文件,只不過這個新文件會讓數據的讀取指向它連接的那個文件名。由於只是利用了文件的內容作為指向的操作,所以當原文件被刪除之後,再打開連接文件酒會提示「文件無法打開「。

由於符號文件會創建一個新的獨立的文件,所以它會用掉inode和block。

由於硬連接無法連接到目錄,所以一般是符號連接比較常用。

符號文件的一個顯著特性:

//表示chai是一個符號連接文件,它指向/home/shixv,而硬連接是不會有->這個符號的。/chai->/home/shixv//將目標文件指向原文件ln [option] 原文件 目標文件 -s:不加參數就是硬連接,加了s就是符號連接-f:force模式,如果目標文件存在,直接把它覆蓋//權限後面的數字就代表連接到這個inode上的連接文件個數drwxr-xr-x31root wheel112232122:18.drwxr-xr-x31root wheel112232122:18..
  • 新建目錄時連接數的變化

    新建一個目錄/chai實際上會產生三個目錄,分別是:/chai,/chai/.,/chai/..。

    /chai,/chai/.都表示該目錄,/chai/..表示上層目錄。

    所以新建一個目錄後,上層目錄的連接數會+1,新建目錄的連接數是2。
您可能感興趣
免責聲明:本文內容來源于CSDN博客,文章觀點不代表壹讀立場,如若侵犯到您的權益,或涉不實謠言,敬請向我們提出檢舉
最新文章 / 服務條款 / 私隱保護 / DMCA / 聯絡我們

壹讀/READ01.COM