Linux 文件系統相關的基本概念


本文介紹 Linux 文件系統相關的基本概念。

硬盤的物理組成

盤片
硬盤其實是由單個或多個圓形的盤片組成的,按照盤片能夠容納的數據量,分為單盤(一個硬盤里面只有一個盤片)或多盤(一個硬盤里面有多個盤片)的硬盤。下面是一張盤片的示意圖(此圖來自互聯網):

磁道和柱面
硬盤中有磁頭在盤片上讀寫數據,磁頭固定在機械臂上,機械臂上有多個磁頭(每個盤片的兩側各一個)。當磁頭固定不動時(假設機械手臂不動),盤片轉一圈所畫出來的圓就是磁道(track)。所有盤片上相同半徑的那個磁道就組成了柱面(cylinder)。柱面是磁盤分區是的最小單位。

扇區
由圓心向外畫直線,可以將磁道再划分為扇區,扇區就是盤片上最小的讀寫單位。通常情況下,一個扇區的大小為 512 個字節。因此可以使用下面的公式計算磁盤的容量:
柱面數 * 磁頭數 * 扇區數 * 512 字節

磁盤分區

為什么要對硬盤進行分區呢?
因為我們必須要告訴操作系統:這塊硬盤可以訪問的區域是從 A 柱面到 B 柱面。如此一來,操作系統才能控制硬盤磁頭去 A-B 范圍內的柱面上訪問數據。如果沒有告訴操作系統這些信息,它就無法在磁盤上存取數據。所以對磁盤分區的要點是:記錄每一個分區的起始與結束柱面
實際上,分區時指定的開始和結束位置是柱面上的扇區(sector):

下圖是通過 fdisk 命令查看到的磁盤分區信息:

那么,這些分區的信息(起始柱面與結束柱面)被存放在了哪里呢?答案是磁盤的主引導區(Master Boot Recorder, MBR)。MBR 在一塊硬盤的第 0 軌上,這也是計算機啟動之后要去使用硬盤時必須讀取的第一個區域。 這個區域內記錄了硬盤里所有分區的信息即磁盤分區表,以及啟動時可以寫入引導程序的位置。因此 MBR 對於硬盤來說至關重要,如果它壞掉了,這塊磁盤也就壽終正寢了。下面是磁盤分區表的示意圖(此圖來自互聯網):

文件系統

在告知系統分區所在的起始與結束柱面后,需要將分區格式化為操作系統能夠識別的文件系統。每個操作系統能夠識別的文件系統並不相同,比如 Windows 系統在默認的情況下就無法識別 Linux 的文件系統,所以要針對操作系統來格式化分區。可以簡單的認為每個分區就是一個文件系統。

邏輯塊
不論哪種文件系統,目的都是為了存儲數據。前面提到,硬盤的最小讀寫單位是扇區,而現實中數據的讀寫單位並不是扇區的大小,原因是使用扇區的大小為單位來讀寫數據的效率實在是太低了。因為一個扇區只有 512 個字節,而磁頭是一個扇區一個扇區的讀取數據,也就是說,如果文件有 10M,那么讀取這個文件磁頭就要進行 20480 次讀取操作(I/O)。
為了提升效率,就有了邏輯塊(Block)的概念。邏輯塊是在分區進行文件系統的格式化時所指定的"最小存儲單位",這個最小存儲單位以扇區的大小為基礎(因為扇區為硬盤的最小物理存儲單位),大小為扇區大小的 2ⁿ 倍。此時,磁頭一次可以讀取一個邏輯塊。指定邏輯塊的大小為 4KB(即由連續的 8 個扇區構成的一個塊),那么,同樣讀取一個 10M 的文件,磁頭要讀取的次數則大幅下降為 2560 次,這樣就大大提高了文件的讀取效率。
需要注意的是,邏輯塊也並不是越大越好。因為一個邏輯塊最多僅能容納一個文件(這里指 Linux 的 ext2 文件系統)。這有什么問題呢?舉例來說,假如邏輯塊的大小為 4KB,有一個文件大小為 0.1KB,這個小文件將占用掉一個塊的空間。也就是說,該塊雖然可以容納 4KB 的容量,然而由於文件只占用了 0.1KB,實際上剩下的 3.9KB 空間就不能再被使用了(完全浪費掉了)。所以好的方式是根據實際的使用場景來設置邏輯塊的大小。

在分區上創建文件系統時,可以指定文件系統的邏輯塊大小:

上面命令中我們指定的邏輯塊大小為 1024 B,也就是兩個扇區的大小。我們還可以通過 tune2fs 查看現有文件系統邏輯塊的大小:

這里需要區分三個概念:
扇區、邏輯塊和頁
塊設備中最小的尋址單元是扇區。
邏輯塊是文件系統的一種抽象--只能基於塊來訪問文件系統。內核執行的所有磁盤操作都是按照塊進行的(但是所有設備的 I/O 必須以扇區為單位進行操作)。對塊的要求有:必須是扇區大小的 2 的整數倍;不能超過頁的大小。
內核把內存的物理頁作為內存的管理單位,因為從磁盤讀取的數據最終都會被保存在內存中,所以系統優化的結果是不允許文件系統中的邏輯塊超過內存頁的大小。可以通過下面的命令查看系統中頁的大小:

$ getconf PAGESIZE

超級塊
分區完成后,每個分區會被格式化為一個文件系統。而每個文件系統開始位置的那個塊就稱為超級塊(superblock)。超級塊會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。
也就是說,要使用一個分區(或文件系統)來進行數據訪問時,第一個要經過的就是超級塊。所以,如果超級塊損壞了,這個分區上的數據也就丟掉了。

inode
Linux 操作系統的文件數據除了文件實際內容外,通常含有非常多的屬性,例如文件權限(rwx)與文件屬性(擁有者、群組、時間參數等)。文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 datablock 區塊中。

block
實際記錄文件的內容,若文件太大時,會占用多個 block。

每個文件都會占用一個 inode,inode 內則有文件數據放置的 block 號碼。下面是 inode、block 數據存取的示意圖(此圖來自互聯網):

這種數據存取的方法我們稱為索引式文件系統(indexed allocation)。

掛載點
在 Linux 系統中,文件系統被安裝在一個特定的掛載點(一個普通的目錄)上,所有的已安裝文件系統都作為根文件系統樹的枝葉出現在系統中。與這種單一、統一的樹形成鮮明對照的就是 Windows 系統的表現,它們以字母命名文件系統,比如我們常見的 C 盤、D 盤。

參考:
《鳥哥的私房菜》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM