一、概述
Linux支持數量眾多的本地文件系統類型和幾種通過網絡訪問遠程磁盤的文件系統,分析/proc/filesystems文件的內容即可找出當前Linux內核提供了對哪些文件系統的支持。
要在內核中增加對任意此類文件系統的支持都是相當簡單的,只需在構造新的內核時選中相應的配置選項即可。例如,對於makexconfig來說,只需在它的Filesystems下面選中想要的文件系統類型。如果你是為了從其他環境將磁盤移入Linux系統才需要增加文件系統類型,而且該磁盤原先的系統環境使用與Linux不同的分區表格式,則應當記住還必須啟用相應的分區類型支持(通過Partition Types設置)。
當前,ext2文件系統(即second extended filesystem)是Linux默認直接支持的文件系統。ext2文件系統和其他現代Unix使用的文件系統非常相似,但更接近於BSD系統所用的Berkeley Fast Filesystem。ext2文件系統的最大容量是4 TB,但目前它的最大文件大小被Linux內核限制為2 GB。
ext2的核心是兩個內部數據結構,即superblock和inode。superblock是一個包含文件系統重要信息的表格,比如標簽、大小、inode的數量等,它是對文件系統結構的基礎性的、全局性的描述。因此,沒有了superblock的文件系統將不再可用。由於這個原因,文件系統中不同位置存放著superblock的多個副本。
inode是基本的文件級數據結構,文件系統中的每一個文件都可以在其中一個inode中找到其描述。inode描述的文件信息包括:文件的創建和修改時間,文件大小,實際存放文件數據的塊列表,等等。對於較大的文件,塊列表可能包含附加數據塊列表的磁盤位置(稱為間接塊),甚至有可能出現二重或三重的間接塊列表。文件名字通過目錄項(Directory Entry)關聯到inode,目錄項由“文件名字-inode”對構成。
Linux提供了大量用於創建和管理文件系統的工具。接下來我們將以新增磁盤(或分區)為線索,介紹各種要用到的工具。盡管完成這一任務的過程並不復雜,但這些操作還得在Linux命令行進行,這是因為大多數圖形界面的工具在這方面的支持非常有限。
把磁盤/分區加入到Linux系統
在Linux文件系統中增加新的磁盤或者分區是相當簡單的,其步驟如下:
把磁盤接入計算機
如有必要,對磁盤進行分區(fdisk或者cfdisk)
確定和新磁盤/分區關聯的設備文件(MAKEDEV)
在分區上創建文件系統(mkfs)
檢查文件系統是否存在一致性錯誤(fsck)
裝配新文件系統(mount)
在文件系統配置文件(/etc/fstab)中設定文件系統的啟動時行為和其他選項
在日常使用中,必要時修改文件系統的特征和選項(tune2fs)
二、確定設備文件以及創建分區
1、確定設備文件
為新加入的物理磁盤(或磁盤分區)創建文件系統之前,首先必須知道該磁盤具體的設備名字。我們可以用好幾種方法來找出它的設備名字。例如,可以通過dmesg命令分析啟動日志(通過管道傳送給grep,並搜索[hs]d[a-z]);如果已經用syslog截取,則可以查看日志文件。另外,大多數Linux發行版都默認啟用/proc文件系統,如果你也使用了它,則可以分析/proc/partitions文件,查看系統認可的所有磁盤分區的清單。
有時我們需要手工為磁盤創建設備文件,但這種情況極其罕見。設備文件可以用/dev目錄下面的MAKEDEV腳本創建。例如,下面的命令將為第六個SCSI磁盤創建設備文件:
# cd /dev; MAKEDEV sdf
2、創建分區
確定磁盤的設備文件之後,接下來就要用fdisk之類的工具將磁盤分區。下面我們使用的是cfdisk,這是一個大多數Linux發行版都提供的仿圖形界面工具。輸入cfdisk命令並在參數中指定目標磁盤即可啟動該工具:
# cfdisk /dev/sdf
磁盤分區工具cfdisk
cfdisk的主窗口顯示的是一個描述當前磁盤分區布局的表格,表格的各列依次表示:分區名字,分區的標記,分區的類型,分區的標簽(如存在的話),以及以兆計的分區大小。用上、下箭頭鍵可以在表格內移動表示選中的橫條。
適用於當前選中項目的命令顯示在屏幕的下方,這些命令既可以用左、右箭頭鍵訪問,也可以用命令名字的首字母訪問。例如,在上圖中,cfdisk命令作用於磁盤的第一個分區,用於設定分區類型的Type命令是當前處於激活狀態的命令(當然,該命令還沒有執行)。
對於包含未分區空間的磁盤,分區列表最後一項的FS Type將顯示為Free Space。如果選中了該項,cfdisk將顯示一個New命令。New命令用於創建新的分區。
執行New命令時cfdisk會要求輸入其他一些參數,比如分區大小。創建新的分區之後,我們可以用其他cfdisk命令來定義該分區的附屬特征。
用cfdisk修改好分區定義之後,可以用Write命令保存更新後的分區表,用Quit命令直接退出cfdisk則表示忽略所有已經作出的改動。只要對磁盤分區表作了任何實質性的改動(即,不僅僅指定分區標簽或改變分區類型),則在繼續處理之前應當重新啟動系統。
3、技巧:分區位置對性能的影響
如果新增磁盤的系統中I/O性能極其重要,而且該磁盤又必須分成多個分區,仔細地規劃一下分區的位置將顯著地改善系統性能。
例如,如果某個文件系統中隨機I/O訪問居多(比如,文件系統中保存了大型的數據庫,或大量的小文件),則將該分區放在磁盤的物理中心是有好處的。這是因為隨機I/O性能受到磁盤搜索時間的限制,將磁頭移動距離減到最小將明顯地提高I/O訪問速度。
因此,假設該隨機訪問分區的容量占總容量的一半,要想特別照顧該分區的I/O性能,可以創建三個分區,其容量分別為磁盤總容量的1/4、1/2和1/4。
三、創建文件系統
接下來是用mkfs命令創建文件系統(或者,更精確地說是用mke2fs命令。mkfs是一個統一的前端工具,為所有不同文件系統類型的創建命令提供)。如下例所示,該命令最簡單的形式是通過-t參數指定文件系統的類型,然後加上創建該文件系統的分區。下面這個命令在第二個SCSI磁盤的第二個分區上創建一個ext2文件系統:
# mkfs -t ext2 /dev/sdb2
# mke2fs /dev/sdb2
上面的第二個命令是直接使用mke2fs時的等價命令。部分mke2fs參數的說明可在本節後面找到。
下面也是一個mke2fs命令,它在一個計劃用於從大量化學模擬計算湊合出文件的分區上創建一個文件系統:
# mke2fs -L scratch -c -q
-m 2 -N 1000 /dev/hdc1
該命令在檢查第三個IDE磁盤第一個分區的壞塊之後創建了一個文件系統,設置其標簽為“scratch”,只保留百分之二的空間,只創建1000個inode。對於本例設想的情形來說創建1000個inode是合理的,這是因為該文件系統中文件和目錄的數量永遠不會超過100。當然,當該假設不成立時會出現問題。
mke2fs的參數
-L label
指定分區的標簽(最長11個字符)。
-b size
文件系統的塊大小,以字節計,默認值1024。塊是文件系統分配磁盤空間的單位。
-c
在創建文件系統之前檢查分區的壞塊。
-m percent
指定保留的文件系統空間百分比,這部分空間只能由root訪問。默認值是磁盤的百分之五,這是傳統Unix默認值的一半。在今天普遍使用大容量磁盤的情況下,即使是這個百分比也值得再加斟酌,比如可以將它降低到百分之二或者三。
-i ratio
指定每個inode的字節數,即為每個指定大小的字節塊創建一個inode。默認值是4096,這個值所創建的inode通常超過實際可能用到的,但一般沒有必要改變它,因為節省下來的磁盤空間非常有限。另外,用“-N 數字”可以顯式地指定創建inode的數量。
-v -q
分別表示詳細輸出或簡略輸出
四、檢查文件系統
接下來是用fsck工具檢查新文件系統。這這裡我們通過fsck的參數指定目標文件系統,並加上-f和-y選項(參見下面關於fsck參數的說明)。此時,fsck將對文件系統進行一致性檢查,比較文件系統數據結構內眾多互相交叉引用的條目。
fsck能夠查出並修正文件系統結構方面的問題,比如標記為空閒的磁盤塊實際上正被使用(或相反),inode裡面錯誤的鏈接計數(意味著存在丟失的或者多余的目錄項),以及inode合計大小值和實際占用數據塊總數的不一致,等等。
正因為如此,fsck能夠確保文件系統定義數據結構的一致性。但應注意這僅限於文件系統結構,對於丟失的或損壞的數據來說它是無能為力的。
1、fsck的參數
-f 即使磁盤看起來無需檢查也強制執行。默認情況下,只有當文件系統“骯髒”時才需要進行檢查。或者說,只有當文件系統沒有正確卸載(dismount)、或者使用了一定的時間、系統重新啟動一定次數後才需要進行檢查。
-p 整理文件系統,自動修正所有可以安全地更正且不會導致數據丟失的問題。
-y 對所有問題回答yes。它的效果是:自動修正所有發現的問題,即使那些可能導致數據丟失的問題也要修正。
-b block 指定文件系統備用superblock的位置。在極其罕見的情況下,即當主superblock被損壞而文件
fsck能夠查出並修正文件系統結構方面的問題,比如標記為空閒的磁盤塊實際上正被使用(或相反),inode裡面錯誤的鏈接計數(意味著存在丟失的或者多余的目錄項),以及inode合計大小值和實際占用數據塊總數的不一致,等等。
正因為如此,fsck能夠確保文件系統定義數據結構的一致性。但應注意這僅限於文件系統結構,對於丟失的或損壞的數據來說它是無能為力的。
1、fsck的參數
-f 即使磁盤看起來無需檢查也強制執行。默認情況下,只有當文件系統“骯髒”時才需要進行檢查。或者說,只有當文件系統沒有正確卸載(dismount)、或者使用了一定的時間、系統重新啟動一定次數後才需要進行檢查。
-p 整理文件系統,自動修正所有可以安全地更正且不會導致數據丟失的問題。
-y 對所有問題回答yes。它的效果是:自動修正所有發現的問題,即使那些可能導致數據丟失的問題也要修正。
-b block 指定文件系統備用superblock的位置。在極其罕見的情況下,即當主superblock被損壞而文件