Linux 文件系統精通指南

 


作者:Sheryl Calish

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

儘管內核是 Linux 的核心,但文件卻是用戶與操作系統交互所採用的主要工具。這對 Linux 來說尤其如此,這是因爲在 UNIX 傳統中,它使用文件 I/O 機制管理硬件設備和數據文件。

遺憾的是,新手通常會混淆介紹 Linux 文件系統概念的術語。術語 文件系統 可以在 Linux 文件編制中互換使用,用於指代幾個不同但相關的概念。除磁盤分區的具體實例外,文件系統還指代數據結構以及分區中文件的管理方法。

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

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

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

本文主要介紹了 2.4 版 Linux 內核中的 Linux 磁盤分區和文件管理系統特性。此外,還介紹了 2.6 版 Linux 內核中的新特性。

磁盤分區概述

Linux 和 UNIX 中的基本文件存儲單元都是磁盤分區,即將一個或多個硬盤的邏輯劃分,操作系統將每個邏輯分區視爲獨立的磁盤。文件和文件管理系統“居住”在磁盤分區中。 Linux 將這些磁盤分區作爲設備處理,進而通過 /dev 目錄中的特殊文件使用文件 I/O 機制。

有兩種類型的設備文件: 字符/原始 。兩者之間的一個重要差別是,塊設備被緩衝,而字符設備因爲沒有文件管理系統,所以不被緩衝。在 Oracle 集羣文件系統 (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 分區主要特性的彙總表。

特性 ext2 ext3 ReiserFS3.6(不受 Oracle 支持)
最大分區大小 4TB 4TB 16TB
最大文件大小 2GB-4GB 2GB-4GB 8TB
塊大小 1KB-4KB 1KB-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 文件系統)的增強支持

處理分區和文件系統的工具

要添加一個新磁盤或調整現有磁盤的大小,您需要使用 fdisk cfdisk 。儘管 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 )命令顯示分區表。使用 n new 命令可創建新分區;使用 w write 命令可把新分區表寫入磁盤。輸入新命令後, 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 中的 t type 命令更改分區類型。可以使用 l list 命令取得 fdisk 的可用分區類型。以下是可用類型的部分列表:

ID System
82 Linux swap
83 Linux
85 Linux extended
8e Linux LVM

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

重新組織分區和文件管理系統

由於每個分區都包含各自的文件管理系統,因此調整分區大小涉及調整文件管理系統和分區的大小。因此,可用 的重新分區工具取決於所用文件管理系統的類型。對於 ext2/ext3 系統,有一些可以選擇將 resize2fs 與 fdisk、GNU Parted 或 Partition Magic 結合使用。對於 ReiserFS,只能將 cfdisk resize_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 和軟盤驅動器,通常只需單擊相應圖標即可。

更多的資源

Linux 技術中心

OCFS

ReiserF/SReiser4

Ext2fs 主頁

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

 

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

要拆下軟盤或 CD-ROM,您需要在拆下它之前使用以下命令將其卸載

 

$ umount /media/floppy

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

結論

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

在本文的第 2 部分中,我們將介紹集羣文件系統,其中包括 OCFS。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章