Linux 檔案系統精通指南

tolywang發表於2005-02-27

究竟什麼是“檔案系統”?Sheryl Calish 介紹了這個概念以及它的實際應用

儘管核心是 Linux 的核心,但檔案卻是使用者與作業系統互動所採用的主要工具。這對 Linux 來說尤其如此,這是因為在 UNIX 傳統中,它使用檔案 I/O 機制管理硬體裝置和資料檔案。  


        遺憾的是,新手通常會混淆介紹 Linux 檔案系統概念的術語。術語檔案系統 可以在 Linux 檔案編制中互換使用,用於指代幾個不同但相關的概念。除磁碟分割槽的具體例項外,檔案系統還指代資料結構以及分割槽中檔案的管理方法。

另新手更感困惑的是,該術語還用於指代系統中檔案的整體組織形式:目錄樹。此外,該術語還可以指代目錄樹中的每個子目錄,如在 /home 檔案系統中。某些人認為,這些目錄和子目錄不能稱作真正意義上的檔案系統,除非它們均駐留在各自的磁碟分割槽上。然而,其他人卻將其稱作檔案系統,這無疑又增添了困惑。

Linux 老手可以從上下文中理解這些術語的含義。而新手卻很難在一時半會兒就辨別出這樣的上下文。

本文的主要目標就是提供足夠的背景知識,以幫助您辨別此術語的上下文。在闡明檔案系統術語的細微差別的過程中,您還將學習如何將某些非常有用的相關工具從理論應用上升到實際應用。

本文主要介紹了 2.4 版 Linux 核心中的 Linux 磁碟分割槽和檔案管理系統特性。此外,還介紹了 2.6 版 Linux 核心中的新特性。

磁碟分割槽概述

Linux 和 UNIX 中的基本檔案儲存單元都是磁碟分割槽,即將一個或多個硬碟的邏輯劃分,作業系統將每個邏輯分割槽視為獨立的磁碟。檔案和檔案管理系統“居住”在磁碟分割槽中。Linux 將這些磁碟分割槽作為裝置處理,進而透過 /dev 目錄中的特殊檔案使用檔案 I/O 機制。

有兩種型別的裝置檔案:字元/原始。兩者之間的一個重要差別是,塊裝置被緩衝,而字元裝置因為沒有檔案管理系統,所以不被緩衝。在 (OCFS) 推出之前,使用原始裝置是提高 Oracle 資料檔案分割槽效能的常見方法。(在本文的後續部分,我們將詳細介紹原始裝置。)

儲存在磁碟最開始位置的分割槽表提供了該磁碟上分割槽的對映。可以使用 fdisk 命令檢視系統的分割槽表。

# fdisk -l

Disk /dev/hda:240 heads, 63 sectors, 1940 cylinders
Units = cylinders of 15120 * 512 bytes

Device Boot    Start       End    Blocks   Id  System
/dev/hda            1          286    2162128+   c     Win95 FAT32 (LBA)
/dev/hda2   *     288         1940   12496680    5     Extended
/dev/hda5         288          289      15088+  83     Linux
/dev/hda6         290          844    4195768+  83     Linux
/dev/hda7         845          983    1050808+  82     Linux swap
/dev/hda8         984         1816    6297448+  83     Linux
/dev/hda9        1817         1940     937408+  83     Linux

分割槽表中的名稱 /dev/hda 至 /dev/hdd 分別代表 IDE 驅動器 1 至 4,其中 hda 代表驅動器 1,hdb 代表驅動器 2,依此類推。驅動器內的分割槽用數字指代,因此 /dev/hda5 是第一個 IDE 驅動器上的第五個分割槽。對於 SCSI 驅動器,使用了類似的命名模式:/dev/sda to /dev/sdd。

第一至第四個分割槽保留給主分割槽,第五個及隨後的分割槽用於邏輯分割槽。因此,以上所示的分割槽表中有一個驅動器 hda,它包含一個主分割槽 hda1、一個擴充套件分割槽 hda2 和五個邏輯分割槽 /dev/hda5 至 /dev/hda9。以名稱 shmfs 列出的檔案系統表示根據 Linux 2.4 中的 POSIX 標準掛載為特殊檔案系統的共享記憶體檔案系統。

您可能已經注意到,在 fdisk 列表中 LBA 是括在括號中的。LBA 表示邏輯塊定址,它將硬碟的柱面、塊和扇區模式轉換為線性塊編號進行處理。

在 Linux 中,分割槽分為主分割槽、擴充套件分割槽和邏輯分割槽。術語主分割槽 是先前 x86 系統上四個分割槽限制的遺留產物。與 DOS 和 Windows 不同,Linux 可以從主分割槽或邏輯分割槽啟動。用作邏輯分割槽佔位符的主分割槽稱作擴充套件分割槽。擴充套件分割槽本身擁有指向一個或多個邏輯分割槽(它們只是主分割槽的子分割槽)的分割槽表。在以上的 fdisk 列表中,hda2 就是一個擴充套件分割槽。

檔案管理系統概述

要使分割槽後的磁碟可用,必須在其上構建檔案系統。這種情況下,通常還將檔案系統稱作“分割槽型別”、“基於磁碟的檔案系統”和“檔案系統型別”。實際上,可以將這些檔案系統看作是檔案管理系統,這是因為該稱呼正體現了它們的功能:它們透過維護檔案上的後設資料,使系統上的檔案保持狀態一致。

Linux 專案的特點之一是需要實現與每個可用實用程式的多個樣式和首選設定的相容性,而這種相容性在可用檔案管理系統的選擇上體現得最為明顯。Linux 核心內部的虛擬檔案系統 (VFS) 實現了此選擇。VFS 採用了一組可由其他檔案管理系統使用的基本資料結構。這些資料結構是超級塊、inode、dentry(或目錄檔案)和資料塊。

每個分割槽都包含一個超級塊,用於維護分割槽中檔案系統上的資訊,包括一組在每個超級塊中唯一編號的 inode、空閒 inode 的數目以及 inode 總數、資料塊總數、空閒資料塊數和檔案系統的狀態。檔案系統的狀態有兩種:乾淨(當檔案處於未更改狀態時)和(當有未寫入磁碟的檔案系統更改時)。超級塊中的一個 inode 對應著一個檔案。

除檔名外,inode 包含了有關檔案的所有資訊,其中包括:

  • 地址
  • 型別
  • 大小
  • 所有者
  • 對檔案資料所在塊的引用
  • 檔案最後一次修改和訪問的時間戳。

可以使用以下命令檢視檔案的 inode:

$ ls -i

正如前面已經提到的,inode 只在超級塊中唯一編號,且每個分割槽只有一個超級塊,這就是硬連結無法跨越多個分割槽的原因。

檔名透過 dentry 物件(使用者看到的是目錄檔案)連結到一個 inode 編號。資料塊儲存實際的檔案資料。

Linux 支援任何具備 VFS 定義的基本函式集的檔案管理系統。對於像 vfat 這樣的檔案管理系統,Linux 專案提供了它自己的裝置驅動程式。

您可以從以下輸出中看到,不同的檔案管理系統可以存在於同一系統的不同分割槽上。

df -T
Filesystem    Type         1K Blocks    Used      Available   Use%   Mounted on
/dev/hda6     reiserfs     4195632      2015020   2180612     49%    /
/dev/hda5     ext2         14607        3778      10075        8%    /boot
/dev/hda9     reiserfs     937372       202368    735004      22%    /home
/dev/hda8     reiserfs     6297248      3882504   2414744     62%    /opt
shmfs         shm          256220       0         256220       0%    /dev/shm
/dev/hda1     vfat         2159992      1854192   305800      86%    /windows/C

當前,Oracle 使用者遇到的最常用的檔案管理系統是 ext2/ext3、ReiserFS(不受 Oracle 支援)和 OCFS。以下是非 Oracle 分割槽主要特性的彙總表。

特性ext2ext3ReiserFS3.6(不受 Oracle 支援)
最大分割槽大小4TB4TB16TB
最大檔案大小2GB-4GB2GB-4GB8TB
塊大小1KB-4KB1KB-4KB只有 4KB
日誌功能
崩潰後重新啟動非常快
用於恢復清除檔案的工具
崩潰後資料的狀態良好非常好一般
ACL 支援
穩定性優秀良好良好

由於 ext2 和 ReiserFS 均提供了使用者級安全性以及更高效的磁碟空間使用等特性,因此儘管至少 ext2 確實提供了碎片整理工具,但幾乎不需要這些工具。Ext2 是傳統的、事實上的標準 Linux 檔案管理系統。它是 Red Hat 版本 Linux 的預設檔案管理系統,而 ReiserFS 是 SUSE 的預設檔案管理系統。ext2/ext3 的最大檔案大小實際上取決於所選擇的塊大小和硬體體系結構。ext2 的許多特性之一是它允許由磁碟分割槽決定塊大小。ReiserFS 技術允許在磁碟分割槽中使用可變的檔案大小(這是因為它基於平衡樹技術而不是基於範圍),因此除日誌功能以外,高效的空間使用也是其設計所固有的。

日誌檔案管理系統(如 ext3 和 ReiserFS)記錄對檔案系統後設資料:inode、空閒塊分配對映、inode 對映等的更改。當系統崩潰時,可以透過此方式檢查日誌以獲得最近修改的後設資料,從而確保快速恢復檔案系統。此功能對大型系統尤其重要。如果沒有此功能,則在出現硬體故障後,對於 ext2 等檔案系統,需要在重新啟動時執行 fsck 工具。對於大型檔案系統,此過程可能要花費幾個小時。

當然,記錄日誌需要付出一定的代價,即需要在處理時間和恢復之間尋求一個平衡。對於 ext3,可以選擇日誌記錄模式,這些模式允許在尋求上述平衡時做出某些自主決定。journal 模式(記錄所有檔案系統資料,包括資料塊和後設資料)是最安全但也是最慢的模式。預設模式(稱作 orderd)只記錄後設資料,但在寫後設資料之前先將資料塊寫入磁碟,從而在快速恢復和快速效能之間取得折衷。最快的模式是 writeback 模式,該模式只記錄後設資料。在此模式中,可能會丟失檔案資料,但檔案系統自身的完整性將得到維護。

在編寫本文件期間,Reiser4 剛好已經發布。同 ReiserFS3.6 一樣,ReiserFS4 只記錄後設資料。與 ReiserFS3.6 不同的是,它基於新的舞蹈樹演算法,此演算法似乎比平衡樹演算法更快。它還可以擴充套件到使用無數個 CPU,而且在磁碟寫入時具有內建加密和壓縮功能。

OCFS 是 Oracle 真正應用程式叢集 (RAC)、配置檔案和資料庫檔案的指定檔案管理系統。其他檔案(甚至是 Oracle 軟體檔案)將在 ext2/ext3 或 ReiserFS 上獲得更好的效能。

當前,就檔案管理系統的選擇來講,共同的見解是,除少數情況外,ext2、ext3 和 ReiserFS 之間的效能基本相當。然而在各種系統的擁護者之間卻爆發了激烈的爭論。ReiserFS 由於能夠處理可變的檔案大小,因此更適用於具有許多小檔案的系統。當然,如果您正要或計劃在 Linux 上執行 Oracle RAC,則可能需要為 Oracle 資料檔案和配置檔案安裝 OCFS 或使用自動儲存管理 (ASM)。

除了最常見的 ext2/ext3 和 ReiserFS 檔案系統以外,Linux 還支援其他本地檔案系統,包括 IBM 的 jsf 和 SGI 的 xfs。對傳統 UNIX 檔案系統的支援包括 SYSV、BSD、Solaris、Next 和 Veritas VxFS。在各個級別支援的其他檔案系統包括

  • Microsoft 的 fat、ntfs、vfat、fat32
  • IBM 的 hpfs (OS/2)
  • Apple 的 Macintosh hfs
  • Amiga 的 affs
  • Acorn 磁碟檔案系統 adfs

請注意,Oracle 不支援某些檔案系統,因此在使用這些檔案系統時風險自負。

Linux 核心 2.6 版中最重要的新特性是訪問控制列表 (ACL)。ACL 允許為一個或多個使用者列表或使用者組授予對單個檔案的使用許可權。其他新特性包括:

  • 對 CD-ROM 上使用的 ISO 9660 檔案系統的增強支援
  • 可以儲存在檔案系統中的預設掛載選項
  • 用於加速檔案搜尋的索引目錄
  • 對 Windows 的邏輯磁碟管理器(動態磁碟)的支援
  • 能夠將 ntfs 掛載為讀/寫,但寫仍處於試驗狀態
  • 對 fat12(舊 DOS 檔案系統)的增強支援

處理分割槽和檔案系統的工具

要新增一個新磁碟或調整現有磁碟的大小,您需要使用 fdiskcfdisk。儘管 cfdisk 表面上更易於使用,但 fdisk 已被證實最適用於磁碟分割槽。以下是有關使用 Linux 版本 fdisk 的幾個原則,幫助您瞭解其可能得到的結果。

首先,以超級使用者身份用裝置名稱呼叫 fdisk

# fdisk /dev/hda

The number of cylinders for this disk is set to 1940.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help):m

可以透過使用 p(或 print)命令顯示分割槽表。使用 nnew 命令可建立新分割槽;使用 wwrite 命令可把新分割槽表寫入磁碟。輸入新命令後,fdisk 需要知道您要建立邏輯分割槽還是主分割槽:

Command (m for help):n
Command action
l   logical (5 or over)
p   primary partition (1-4)
l
No free sectors available

Command (m for help):

您可以看到,如果沒有任何空閒空間(如上所示),則您將收到以上訊息。但如果有空閒空間,則 fdisk 需要知道您想要的分割槽號。如果輸入“p”(代表主分割槽),則您將需要做出以下選擇。

Partition number (1-4):

對於邏輯分割槽,您將需要做出以下選擇

Partition number (5 or over):

然後,您可以輸入新分割槽的起始柱面號。fdisk 將推薦一個預設編號,如下所示:

First cylinder (1-1940, default 1):1

您可以選擇接受此編號。接下來,您需要輸入最後一個柱面或分割槽大小:

Last cylinder or +sizeM or +sizeK(1-1940), default 5721:1G

此刻,fdisk 將假設這是一個常規 Linux 分割槽(由分割槽表“ID”列中的十六進位制數字 83 標識)。可以使用 fdisk 中的 ttype 命令更改分割槽型別。可以使用 llist 命令取得 fdisk 的可用分割槽型別。以下是可用型別的部分列表:

IDSystem
82Linux swap
83Linux
85Linux extended
8eLinux LVM

必須注意,在您執行 write 命令之前,您在 fdisk 中執行的任何操作都將是臨時的—如果您出於任何原因要離開 fdisk,則這確實很有好處。

重新組織分割槽和檔案管理系統

由於每個分割槽都包含各自的檔案管理系統,因此調整分割槽大小涉及調整檔案管理系統和分割槽的大小。因此,可用的重新分割槽工具取決於所用檔案管理系統的型別。對於 ext2/ext3 系統,有一些可以選擇將 resize2fs 與 fdisk、GNU Parted 或 Partition Magic 結合使用。對於 ReiserFS,只能將 cfdiskresize_resiszerfs 搭配使用,這是因為 GNU Parted 對於 ReiserFS 來說仍需改進。

resize2fs 和 resize_reiserfs 都可以調整檔案管理系統的大小,並要求使用單獨的分割槽大小調整程式 — fdisk 或 cfdisk。我本人曾使用過 GNU Parted 對 ext2 分割槽進行重新分割槽。這是一個相當容易使用的程式。GNU Parted 對 ReiserFS 的支援將來會變得更穩健。Partition Magic 是一個用於 DOS 和 Windows 的商業程式,但如果從它附帶的啟動軟盤或 CD-ROM 執行,則可以用於 Linux ext2/ext3 分割槽。

儘管實際的命令取決於您所要更改到的系統,但更改檔案管理系統的一般過程涉及

  • 備份分割槽上的檔案
  • 刪除分割槽中的檔案
  • 如果使用的是 fdisk,則可能刪除一個分割槽以便為兩個更小的分割槽留出空間
  • 使用相應的命令生成新檔案系統。例如,要建立 ext2 檔案系統,您可以使用

$ mke2fs /dev/hda5  15088
 
_ ..I

可以隨意指定塊計數,如以上命令中的 15,088。以上事件序列的唯一例外是使用以下命令從 ext2 系統移植到 ext3 系統

$tune2fs -j /dev/hda3

但仍應進行備份。

掛載分割槽

僅當具有超級使用者許可權的使用者掛載了分割槽,分割槽才在 Linux 中可用。對於 /etc/fstab 檔案中列出的 Linux 分割槽,系統啟動時會自動掛載。對於 CD-ROM 和軟盤驅動器,通常只需單擊相應圖示即可。

可與掛載選項結合使用的選項取決於檔案管理系統。例如,您可以按如下方式指定 ext3 日誌選項:

$ mount -t ext3 -o data=journaled /dev/hda9 /home

要拆下軟盤或 CD-ROM,您需要在拆下它之前使用以下命令將其解除安裝

$ umount /media/floppy

在 Linux 2.4 之前,一個檔案系統只能掛載一次。而現在,不限制檔案系統的掛載次數。

結論

Linux 檔案系統是一個多方面的概念。本討論旨在作為根據您自己的需要對它的有用性和合意性進行進一步研究的基礎。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84304/,如需轉載,請註明出處,否則將追究法律責任。

相關文章