可能玩Linux的朋友都知道fstab這個文件,如果煤胠inux,熟悉linux的一些核心配置文件是必要的,而fstab則是其中之一。這個文件描述系統中各種文件系統的信息,應用程序讀取這個文件,然後根據其內容進行自動掛載的工作。因此,我們需要理解其中的內容,了解它如何與 mount命令配合工作,並能夠針對自己的情況進行修改。
作為系統配置文件,fstab通常都位於/etc目錄下,它包括了所有分區和存儲設備的信息,以及它們應該掛載到哪裡,以什麼樣子的方式掛載。如果遇到一些類似於無法掛載你的windows分區阿,無法使用你的光驅阿,無法對某個分區進行寫入操作阿什麼的,那麼基本上可以斷定,你的fstab內容有問題了。也就是說,你可以通過修改它來搞定這些問題,而不用去論壇冰天雪地裸體跪求答案了。
說了半天,/etc/fstab其實就是一個文本文件,用gedit或者vi都可以打開,當然,前提是root權限。在這個文件中,每個文件系統(包括分區或者設備)用一行來描述,在每一行中,用空格或TAB符號來分隔各個字段,文件中以*開頭的行是注釋信息。Fstab文件中的紀錄的排序十分重要。因為 fsck,mount或umount等程序在做它們的工作時會按此順序進行本。下面進行詳細的講解,本文假設讀者已經有掛載文件系統和分區的基礎知識。
在講解之前要說一下,每個人所使用的系統情況都是不同的,包括硬件種類,所用系統等,因此fstab文件肯定是有所差異的。但是其基本結構,如上所述,都不會變。所以我們先以一個fstab內容作為模板進行講解。
首先請看下面這個例子:
/dev/hda2 / ext2 defaults 1 1 /dev/hdb1 /home ext2 defaults 1 2 /dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0 /dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0 proc /proc proc defaults 0 0 /dev/hda1 swap swap pri=42 0 0
這些看起來毫無意義的字符代表了什麼?在對應相應分區或者存儲設備信息的每一行中,每一列又是什麼意思?先大體講一下,第一列表示設備的名稱,第二列表示該設備的掛載點,第三列是文件系統,第四列是掛載選項,第五列是dump選項(用一個數字表示),第六列(接下來的數字)表示文件系統檢查選項。好了,接下來,就要詳細介紹這些參數的具體含義了。
第一、二列:設備和默認掛載點
說實話,第一列和第二列的內容是最簡單最直接的,它們的作用就是告訴mount命令,我想掛載什麼分區或者什麼設備,以及我所希望的掛載點在哪裡。在fstab中為某一個設備指定的掛載點是其默認掛載點,也就是當你在掛載目錄的時候沒有手工指定其他目錄的話,系統就將該設備掛載到這個目錄。大多數 Linux發行版都會為掛載點創建專門的目錄,大多數是在/mnt下,但是一些發行版(比如SUSE或者ubuntu)是在/media下。筆者使用的是 ubuntu,所以示例信息中也是用的/media目錄。
按照我們給出的fstab示例,如果你敲入命令
$ mount /dev/fd0
你的軟驅就將掛載到/media/floppy,因為這是你告訴系統的軟驅默認掛載點。如果沒有這個信息,當你敲入mount命令時,mount會感到很困惑:該死的,你想讓我把這玩意掛載到哪裡去呢?當然,如果你看fstab中發行版給你指定的默認掛載點不順眼,也可以自由修改它,修改成任何一個你希望的目錄都可以。如果還不存在,就首先創建這個目錄。要知道,fstab是不會把所有工作都給你包干的哦。
另外,有一些分區和存儲設備是在Linux系統啟動的時候就自動掛載的,比如,讓我們看看剛才列出來的fstab示例信息,有兩行是這樣的:
/dev/hda2 / ext2 defaults 1 1 /dev/hdb1 /home ext2 defaults 1 2
正如剛才我們講到的那樣,這兩行表示/dev/hda2默認掛載到/根目錄,而 /dev/hdb1則默認掛載到/home目錄,。這些工作在你Linux系統啟動的時候就會通過讀取fstab自動完成,否則的話……想象你會遭受什麼樣的折磨吧,所有的程序都在/根目錄下,而你卻無法使用,因為你沒有掛載/根目錄!恩,我保證,這將是一次讓人沮喪的系統使用經歷。
除了顯示的使用設備名,你可以使用設備的UUID或設備的卷標簽,例如,你可以在這個字段寫成“LABAL=root或“UUID= 3e6be9de- 8139-11d1-9106-a43f08d823a6,這將使系統更具伸縮性。例如,如果你的系統添加或移除了一個SCSI硬盤,這有可以改變你的設備名,但它不會修改你的卷標簽。
對於NFS mount操作,這個字段應該包含host:dir格式的信息,例如:knuth.aeb.nl:/,對於進程文件系統procfs,使用proc.
第三列:文件系統類型
fstab中的第三列指示了設備或者分區的文件系統類型。它支持很多種類的文件系統,我們在這裡只介紹最為常用的。如果想了解你的kernel目前支持哪些文件系統,可以查看/proc/filesystems的內容。如果這個字段定義為swap,這條紀錄將關聯到一個用於交換目的的文件或分區。如果這個字段定義為ignored,這行將被忽略。這對於顯示目前沒有使用的分區非常有用。
ext2 和 ext3: Linux下的Ext2文件系統,是 GNU/Linux 系統中標准的文件系統,其特點為存取文件的性能極好,對於中小型的文件更顯示出優勢,這主要得利於其簇快取層的優良設計。至於Ext3文件系統,它屬於一種日志文件系統,是對ext2系統的擴展。日志式文件系統的優越性在於,它會將整個磁盤的寫入動作完整記錄在磁盤的某個區域上,以便有需要時可以回朔追蹤。由於詳細紀錄了每個細節,故當在某個過程中被中斷時,系統可以根據這些記錄直接回朔並重整被中斷的部分,而不必花時間去檢查其他的部分,故文件系統檢測不一致時,重整的工作速度相當快,幾乎不需要花時間。
reiserfs: ReiserFS是一個非常優秀的文件系統。也是最早用於Linux的日志文件系統之一,其機制比Ext3要先進得多,風雷小弟一直使用的就是它,很多發行版現在也把它作為默認文件系統了。可惜其作者前段時間出事了……具體情況就不說了,也不知道下一代reiserfs4還能不能出來,因為ext4都有了。
swap: Swap,即交換區,把它想象成虛擬內存就行了。
vfat 和 ntfs:一看就知道是Windows分區格式了,呵呵。98,me等系統都是使用的vfat,也就是最流行的fat32格式,而NT系列則多使用 NTFS,當然也不是固定的,因此2000或者XP系統要具體情況具體分析。當初Linux對NTFS的寫入支持不好,所以大多數資料都建議用戶使用 vfat格式,但是現在支持已經很好了,即使不重新編譯內核,也可以通過ntfs-3g來進行寫入支持(具體方法請參考這篇文章),因此不用太在意這個了。
auto:當然,這不是一個文件系統類型。auto只是表示,文件系統的類型將被自動檢測。在上面的示例中,你會發現軟驅和光驅的文件系統類型都是auto,為什麼呢?因為它們的文件系統類型隨時都可能改變,比如軟驅,優盤這種設備,可能今天是vfat格式,明天你就把它格式化成了ntfs,因此,最明智的做法就是告訴系統,我沒法確定這東西的當前類型,還是你自己檢測吧。
udf: 由於刻錄光驅越來越流行,現在很多發行版自帶的fstab中,光驅的文件格式類型是UDF,UDF是Universal Disc Format的縮寫,與ISO 9660格式相容。它采用標准的封裝寫入技術(PW,Packet Writing)將CD-R/CD-RW當作硬盤使用,用戶可以在光盤上修改和刪除文件。利用UDF格式進行刻錄時,刻錄軟件將數據打包,並在內存中臨時建立一個特殊文件目錄表,同時接管系統對光盤的訪問。
iso9660: 很多光驅也使用的這個選項。ISO9660是一種描述適合CD盤片的電腦文件結構的國際標准。采用此標准的盤片可以在不同的操作系統上使用,如MAC和Windows.
第四列:掛載選項
fstab中的第四列表示設備或者分區所需要的掛載選項。這一列也是fstab中最復雜最容易出錯的一列,當然,只要你能知道一些最常用的選項是什麼意思,就可以讓你從頭疼中解脫出來。如果要把可用的選項一項一項介紹……恩,我估計我會寫到明天,所以,我還是只是分析最常用的一些選項,如果你想知道更多的東西,還是求助於man吧。
auto 和 noauto: 這是控制設備是否自動掛載的選項。auto是默認選擇的選項,這樣,設備會在啟動或者你使用mount -a命令時按照fstab的內容自動以亍H绻悴幌M庋褪褂胣oauto選項,如果這樣的話,你就只能明確地通過手工來掛載設備。
user 和 nouser:這是一個非常有用的選項,user選項允許普通用戶也能掛載設備,而nouser則只允許root用戶掛載。nouser是默認選項,這也是讓很多 Linux新手頭疼的東西,因為他們發現沒有辦法正常掛載光驅,Windows分區等。如果你作為普通身份用戶遇到類似問題,或者別的其他問題,就請把 user屬性增加到fstab中。
exec 和 noexec: exec允許你執行對應分區中的可執行二進制程序,同理,noexec的作用剛好相反。如果你擁有一個分區,分區上有一些可執行程序,而恰好你又不願意,或者不能在你的系統中執行他們,就可以使用noexec屬性。這種情況多發生於掛載Windows分區時。exec是默認選項,理由很簡單,如果 noexec變成了你/根分區的默認選項的話……
ro: 以只讀來掛載文件系統