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

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

硬盤的物理組成

盤片
硬盤實際上是由單個或多個圓形的盤片組成的,按照盤片可以容納的數據量,分爲單盤(一個硬盤裏面只有一個盤片)或多盤(一個硬盤裏面有多個盤片)的硬盤。下面是一張盤片的示意圖(此圖來自互聯網):優化

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

扇區
由圓心向外畫直線,能夠將磁道再劃分爲扇區,扇區就是盤片上最小的讀寫單位。一般狀況下,一個扇區的大小爲 512 個字節。所以可使用下面的公式計算磁盤的容量:
柱面數 * 磁頭數 * 扇區數 * 512 字節操作系統

磁盤分區

爲何要對硬盤進行分區呢?
由於咱們必需要告訴操做系統:這塊硬盤能夠訪問的區域是從 A 柱面到 B 柱面。如此一來,操做系統才能控制硬盤磁頭去 A-B 範圍內的柱面上訪問數據。若是沒有告訴操做系統這些信息,它就沒法在磁盤上存取數據。因此對磁盤分區的要點是:記錄每個分區的起始與結束柱面
實際上,分區時指定的開始和結束位置是柱面上的扇區(sector):code

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

那麼,這些分區的信息(起始柱面與結束柱面)被存放在了哪裏呢?答案是磁盤的主引導區(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 空間就不能再被使用了(徹底浪費掉了)。因此好的方式是根據實際的使用場景來設置邏輯塊的大小。get

在分區上建立文件系統時,能夠指定文件系統的邏輯塊大小:io

上面命令中咱們指定的邏輯塊大小爲 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 系統中,文件系統被安裝在一個特定的掛載點(一個普通的目錄)上,全部的已安裝文件系統都做爲根文件系統樹的枝葉出如今系統中。與這種單1、統一的樹造成鮮明對照的就是 Windows 系統的表現,它們以字母命名文件系統,好比咱們常見的 C 盤、D 盤。

參考:
《鳥哥的私房菜》

相關文章
相關標籤/搜索