硬碟是用來儲存資料的,可以將其想象成櫃子,只不過櫃子是用來儲存衣物的。新買來的硬碟,通常要對其進行分割區並格式化,分割區就如同把一個大櫃按照要求分割成幾個小櫃子(組合衣櫃);格式化就好比在每個小櫃子中打入隔斷,決定每個隔斷的大小和位置,然後在櫃門上貼上標籤,標籤中寫清楚每件衣服儲存的隔斷的位置和這件衣服的一些特性(比如衣服是誰的,衣服的顏色、大小等)。
很多初學者認為,對硬碟進行格式化,只是清除了硬碟中的資料,其實不然,格式化過程中還向硬碟中寫入了檔案系統。因為不同的作業系統,管理系統中檔案的方式也不盡相同(給檔案設定的屬性和許可權也不完全一樣),因此,為了使硬碟有效存放當前系統中的檔案資料,就需要將硬碟進行格式化,令其使用和作業系統一樣(或接近)的檔案系統格式。
各作業系統使用的檔案系統並不相同,例如,Windows 98 以前的微軟作業系統使用 FAT(FAT16)檔案系統,Windows 2000 以後的版本使用 NTFS 檔案系統,而 Linux 的正統檔案系統是 Ext2。
既然格式化的真實目的是為了寫入檔案系統,那麼,Linux 中的檔案系統到底是什麼,又是如何運作的呢?
早期的 Linux 使用 Ext2 檔案系統格式,CentOS 5.x 預設使用 Ext3,本教學中所用的 CentOS 6.x 預設使用 Ext4,而目前最新的 CentOS 7.x 預設使用 xfs 格式。
由於 xfs 檔案系統不是這裡的重點,因為有關 xfs 檔案系統,這裡不做深入介紹,感興趣的讀者可自行搜尋相關資料。
Ext4 是 Ext3(Ext2) 檔案系統的升級版,在效能、伸縮性和可靠性方面進行了大量改進,變化可以說是翻天覆地的,比如:
-
向下相容 Ext3;
-
最大 1EB 檔案系統和 16TB 檔案;
-
無限數量子目錄;
-
Extents 連續資料塊概念;
-
多塊分配、延遲分配、持久預分配;
-
快速 FSCK、紀錄檔校驗、無紀錄檔模式、線上碎片整理、inode 增強、預設啟用 barrier 等;
不同的檔案系統,其運作模式和作業系統的檔案資料有關。拿 Linux 作業系統中的檔案為例,檔案資料不僅包括檔案中的內容,還包含非常多的檔案屬性,例如檔案的 rwx 許可權以及檔案所有者、所屬組、建立時間等。
通常情況下,檔案系統會將檔案的實際內容和屬性分開存放:
-
檔案的屬性儲存在 inode 中(i 節點)中,每個 inode 都有自己的編號。每個檔案各占用一個 inode。不僅如此,inode 中還記錄著檔案資料所在 block 塊的編號;
-
檔案的實際內容儲存在 block 中(資料塊),類似衣櫃的隔斷,用來真正儲存衣物。每個 block 都有屬於自己的編號。當檔案太大時,可能會占用多個 block 塊。
-
另外,還有一個 super block(超級塊)用於記錄整個檔案系統的整體資訊,包括 inode 和 block 的總量、已經使用量和剩餘量,以及檔案系統的格式和相關資訊等。
由此我們可以推斷出,只要能找到檔案 inode 所在的位置,自然就能知道這個檔案存放資料的 block 號,從而找到檔案的實際資料。整個過程如圖 1 所示。
圖 1 檔案系統的資料存取示意圖