Linux 管理員手冊(cè)(3)
安裝和升級(jí)系統(tǒng)時(shí),需要對(duì)硬盤做很多工作。必須在硬盤上做文件系統(tǒng),使文件能存在其上,并為系統(tǒng)不同的部分保留空間。
本章說明所有這些初始化工作。通常,一旦你建立了系統(tǒng),就不必再做這些工作(除了使用軟盤)。如果你要增加一個(gè)新硬盤或更好地調(diào)整你的硬盤的使用,那么可能回到這一章。
管理磁盤的基本任務(wù)有:
格式化磁盤。這為磁盤進(jìn)入使用做一些工作,比如檢查壞扇區(qū)。(現(xiàn)在多數(shù)硬盤無須格式化。)
給硬盤分區(qū),如果想用于互相不干擾的幾件事。分區(qū)的一個(gè)原因是要在一個(gè)硬盤上存不同的操作系統(tǒng)。另一個(gè)原因是將用戶文件和系統(tǒng)文件分開,以簡(jiǎn)化備份并在系統(tǒng)崩潰時(shí)有助于保護(hù)系統(tǒng)文件。
在每個(gè)磁盤或分區(qū)上建立合適類型的文件系統(tǒng),然后文件就可以在其上產(chǎn)生和存取。在你建立文件系統(tǒng)前,磁盤對(duì)Linux沒有意義。
將不同的文件系統(tǒng)安裝起來形成一個(gè)單獨(dú)的樹結(jié)構(gòu),按需要可以自動(dòng)或手工完成。 (手工安裝的文件系統(tǒng)通常還要手工unmount)
5章包括虛擬內(nèi)存和磁盤cache的信息,使用磁盤應(yīng)該知道這些。
本章說明對(duì)硬盤、軟盤、CDROM和磁帶機(jī)應(yīng)該知道什么。
2種設(shè)備
UNIX及Linux,識(shí)別2類設(shè)備:隨機(jī)存取的塊設(shè)備(如磁盤)和字符設(shè)備(如磁帶和串行線),有些是串行的,有些是隨機(jī)存取的。文件系統(tǒng)支持的每種看來是個(gè)設(shè)備文件。當(dāng)讀寫設(shè)備文件時(shí),數(shù)據(jù)與設(shè)備聯(lián)系。這樣沒有必要為存取設(shè)備編制特別的程序(程序不直接獲取中斷或讀取串口),例如,發(fā)送文件到打印機(jī),只需:
$ cat filename > /dev/lp1
$
文件內(nèi)容就被打印了(當(dāng)然,文件必須是打印機(jī)能理解的格式)。當(dāng)然,因?yàn)椴粦?yīng)該讓多人同時(shí)cat文件到同一打印機(jī),一般用特定的程序發(fā)送文件去打印(通常是lpr )。這個(gè)程序能確保同時(shí)只有一個(gè)文件被打印,并自動(dòng)在完成后發(fā)送下一個(gè)。多數(shù)設(shè)備有類似需要。實(shí)際上,根本很少需要關(guān)心設(shè)備文件。
因?yàn)樵O(shè)備被視為文件系統(tǒng)中的文件(在/dev 目錄中),很容易看到存在哪些設(shè)備文件,使用ls 或其他的適當(dāng)?shù)拿罴纯?。在ls -l 的輸出中,第一列包含文件類型和權(quán)限。例如,查看我系統(tǒng)上的一個(gè)串行設(shè)備:
$ ls -l /dev/cua0
crw-rw-rw- 1 root uucp 5, 64 Nov 30 1993 /dev/cua0
$
第一列第一個(gè)字符,即crw-rw-rw-中的c告訴用戶文件的種類,這是一個(gè)字符設(shè)備。一般文件的第一個(gè)字符是"-",目錄是"d",塊設(shè)備是"b";更多的信息見ls man頁。
注意即使設(shè)備沒有安裝,一般所有設(shè)備文件都存在。因此有/dev/sda 文件并不意味著你真的有個(gè)SCSI硬盤。有所有的設(shè)備文件使安裝程序更簡(jiǎn)單,也易于增加新硬件(無須再為產(chǎn)生新設(shè)備的設(shè)備文件找出正確的參數(shù))。
硬盤
本節(jié)介紹有關(guān)硬盤的術(shù)語。如果你已經(jīng)知道這些項(xiàng)目和內(nèi)容,可以跳過本節(jié)。
硬盤包括一到數(shù)片盤片platters, 其一個(gè)或兩個(gè)面surfaces涂有磁性材料用于記錄數(shù)據(jù)。每面有一個(gè)讀寫頭read-write head用于讀寫數(shù)據(jù)。盤片有一個(gè)共同的軸,典型的旋轉(zhuǎn)速度是每分鐘3600轉(zhuǎn),高性能的硬盤轉(zhuǎn)速可能更高。磁頭可沿著盤片的半徑移動(dòng),磁頭移動(dòng)加上盤片旋轉(zhuǎn)可以使詞頭存取磁盤表面的任何一個(gè)位置。
處理器(CPU)和實(shí)際磁盤通過磁盤控制器disk controller通訊。這使計(jì)算機(jī)其他部分不必知道如何使用驅(qū)動(dòng)器,因?yàn)椴煌疟P的控制器可以做成對(duì)計(jì)算機(jī)其他部分相同的接口。這樣,計(jì)算機(jī)只要說"嗨,磁盤,給我我要的東西",而不是用一串長(zhǎng)而復(fù)雜的電信號(hào)來移動(dòng)磁頭到正確的位置,并等正確的位置到了磁頭下后再做那些不愉快的工作。 (實(shí)際上,到控制器的接口仍然很復(fù)雜,但比沒有好多了。) 控制器還可以做一些其他的事,比如緩沖,或自動(dòng)壞扇區(qū)替換等。用電信號(hào)控制操作機(jī)械部件,
以上只是理解硬件所需的。還有其他好多工作,比如馬達(dá)旋轉(zhuǎn)磁盤、移動(dòng)磁頭,但這都與理解硬盤工作原理無關(guān)。
磁盤表面通常被分為同心圓環(huán),叫磁道tracks,磁道又被分為扇區(qū)sectors。用這樣分來將磁盤定位,用于為文件定位磁盤空間。要在硬盤上找到給定的位置,可能?quot;3面5道7扇區(qū)"。通常所有磁道有相同的扇區(qū)數(shù),但也有硬盤在外圈磁道放較多的扇區(qū)(所有扇區(qū)用同樣大小的物理空間,這樣在較長(zhǎng)的外圈磁道可以容納更多的數(shù)據(jù))。一般一個(gè)扇區(qū)容納512字節(jié)數(shù)據(jù)。磁盤不能處理比一個(gè)扇區(qū)更小的數(shù)據(jù)量。
每個(gè)面以相同的方式分為磁道和扇區(qū)。這意味著當(dāng)一個(gè)磁頭在某個(gè)磁道時(shí),其他磁頭也在相應(yīng)的位置,所有相同位置的磁道組成柱面cylinder。磁頭從一個(gè)磁道(柱面)移動(dòng)到另一個(gè)需要花時(shí)間,所以將經(jīng)常要在一起存取的數(shù)據(jù)(如一個(gè)文件)放在一個(gè)柱面里。這改善了性能。當(dāng)然不可能完全作到,文件被放在幾個(gè)相分離的位置叫碎片fragmented。
磁盤的面(或頭,實(shí)際是一樣的)、柱面、扇區(qū)數(shù)各不相同,硬盤這些數(shù)目叫硬盤參數(shù)geometry。硬盤參數(shù)通常存在一個(gè)特定的、由電池供電的存儲(chǔ)區(qū)中,叫CMOS RAM,操作系統(tǒng)在引導(dǎo)啟動(dòng)或驅(qū)動(dòng)器初始化時(shí)可以從那里得到硬盤參數(shù)。
不幸的是,BIOS 有一個(gè)設(shè)計(jì)限制,就是不能在CMOS RAM中定義大于1024的磁道數(shù),這對(duì)大硬盤來說就太小了。為了克服這個(gè)問題,硬盤控制器在磁盤參數(shù)上做了一個(gè)欺騙,用地址轉(zhuǎn)換translates the addresses使計(jì)算機(jī)接受。例如,一個(gè)硬盤可能有8個(gè)磁頭,2048個(gè)磁道,每磁道35個(gè)扇區(qū)。其控制器可以對(duì)計(jì)算機(jī)謊稱它有16個(gè)磁頭,1024個(gè)磁道,每磁道35個(gè)扇區(qū),這樣就沒有超過磁道數(shù)的限制,地址轉(zhuǎn)換將磁頭數(shù)減半,磁道數(shù)加倍后傳給硬盤。實(shí)際的算法可能更復(fù)雜,因?yàn)閿?shù)量可能不象我們?cè)谶@里假設(shè)的這么好(但這不影響我們理解原理)。這個(gè)轉(zhuǎn)換在操作系統(tǒng)來看產(chǎn)生了錯(cuò)覺,并可能影響操作系統(tǒng)對(duì)把所有數(shù)據(jù)存在相同柱面的企圖受到影響。
轉(zhuǎn)換只是IDE硬盤的問題。SCSI硬盤使用連續(xù)的扇區(qū)號(hào)(即控制器將連續(xù)的扇區(qū)好轉(zhuǎn)換成磁頭、柱面、扇區(qū)的三參數(shù)組),對(duì)CPU與控制器的通信使用完全不同的方法,因此不會(huì)有這個(gè)問題。注意,計(jì)算機(jī)可能根本不知道一個(gè)SCSI硬盤的實(shí)際參數(shù)。
由于Linux經(jīng)常不知道一個(gè)硬盤的真正參數(shù),其文件系統(tǒng)也不試圖將文件存在一個(gè)柱面里。而是爭(zhēng)取給一個(gè)文件分配連續(xù)編號(hào)的山區(qū),這樣能得到類似的性能。對(duì)于控制器上有cashe或控制器能自動(dòng)預(yù)取的硬盤,情況將更復(fù)雜。
每個(gè)硬盤表現(xiàn)為一個(gè)單獨(dú)的設(shè)備文件。通常只能有2-4個(gè)IDE硬盤。這就是 /dev/hda , /dev/hdb , /dev/hdc , 和 /dev/hdd 。 SCSI是 /dev/sda , /dev/sdb , 等等。其他硬盤類型有類似的命名約定,更多的信息見[Anv]。注意硬盤的設(shè)備文件給出整個(gè)硬盤的存取,而不是分區(qū)(下面討論的),因此如果不小心可能搞亂分區(qū)或數(shù)據(jù)。硬盤的設(shè)備文件只在存取主引導(dǎo)扇(也將在下面討論)時(shí)使用。
軟盤
軟盤的一面或兩面涂有和硬盤類似的磁性介質(zhì)。軟盤自己沒有讀寫頭,讀寫頭在驅(qū)動(dòng)器上。軟盤相當(dāng)于硬盤的一張盤片,但可移動(dòng),一個(gè)驅(qū)動(dòng)器可以存取不同的軟盤,而硬盤則是一個(gè)獨(dú)立的單元。
如同硬盤,一張軟盤也分為磁道和扇區(qū)(軟盤2面上的相同的磁道組成柱面),但數(shù)量要比硬盤少得多。
軟驅(qū)通??梢允褂脦字胁煌谋P片,例如,一個(gè)3.5'軟驅(qū)可以使用720KB和1.44MB的軟盤。因?yàn)檐涷?qū)操作有些不同,而操作系統(tǒng)必須知道軟盤的容量,所以軟驅(qū)有許多設(shè)備文件,每個(gè)都與軟驅(qū)和軟盤種類有關(guān)。因此,/dev/fd0H1440 是第一個(gè)軟驅(qū)(fd0),必須是3.5'軟驅(qū),使用3.5'高密度軟盤(H),容量是1440KB(1440),即普通的3.5'HD軟盤。軟盤設(shè)備的命名約定見[Anv]。
軟驅(qū)的名字是復(fù)雜的,因此Linux有一個(gè)特定的軟驅(qū)設(shè)備類型,能自動(dòng)檢測(cè)軟驅(qū)中軟盤的種類。它使用不同的軟盤類型試圖讀取新插入的軟盤的第一個(gè)扇區(qū),直到找到正確的一個(gè)。這自然要求軟盤是已經(jīng)格式化過的。自動(dòng)設(shè)備叫/dev/fd0 、/dev/fd1 等。
存取軟盤的自動(dòng)設(shè)備的參數(shù)可用程序setfdprm 設(shè)定。這可使你使用不是通常容量的軟盤,例如有非標(biāo)準(zhǔn)扇區(qū)數(shù)的軟盤,或自動(dòng)檢測(cè)由于某種原因失敗或適當(dāng)?shù)脑O(shè)備文件丟失。
Linux除了所有標(biāo)準(zhǔn)的,還能處理許多非標(biāo)準(zhǔn)的軟盤格式。這有時(shí)需要特殊的格式化程序。我們現(xiàn)在先跳過這些軟盤格式,同時(shí)你可以查看/etc/fdprm 文件。它定義了setfdprm 識(shí)別的設(shè)定。
操作系統(tǒng)必須知道軟驅(qū)何時(shí)換了軟盤,例如,以免使用上一張軟盤的cache數(shù)據(jù)。不幸的是,當(dāng)用于此的信號(hào)線斷了或不好時(shí),當(dāng)在MSDOS中使用時(shí),這并不總有效。如果你曾遇到過軟驅(qū)的這種怪異的問題,可能是這個(gè)原因。解決這個(gè)問題的唯一方法是修理軟驅(qū)。
CD-ROM
CD-ROM驅(qū)動(dòng)器使用一個(gè)光學(xué)可讀的塑料涂布的盤片。信息記錄在盤片表面 的從中心的邊沿的螺旋型小坑上。驅(qū)動(dòng)器發(fā)出一束激光來讀盤。當(dāng)激光射到小坑上,激光以一種方式反射;當(dāng)它射到光滑表面上,它以另一種方式反射。這很容易地編碼成bit,組成信息。其他很容易,不過是機(jī)械。
CD-ROM驅(qū)動(dòng)器比硬盤慢。典型的硬盤的平均尋道(seek)時(shí)間小于15毫秒,而快速的CD-ROM驅(qū)動(dòng)器要花零點(diǎn)幾秒。實(shí)際數(shù)據(jù)傳輸率則相當(dāng)快,在數(shù)百KB/s。速度慢使CDROM驅(qū)動(dòng)器不能代替硬盤使用 (有些Linux distributions提供"live" CD-ROM文件系統(tǒng),使之不必拷貝文件到硬盤,使安裝簡(jiǎn)單并節(jié)約了許多硬盤空間),雖然是可能的。要安裝新軟件,CD-ROM很好,因?yàn)樵诎惭b時(shí)速度并非最重要的。
有多種方法在CDROM上安排數(shù)據(jù)。最流行的是國(guó)際標(biāo)準(zhǔn)化組織定義的ISO9660。這個(gè)標(biāo)準(zhǔn)定義了一個(gè)最小的文件系統(tǒng),甚至比MSDOS更粗糙。這樣,由于它是這么小,所有操作系統(tǒng)都可以將它映射到自己的系統(tǒng)。
不同UNIX不能使用ISO9660文件系統(tǒng),因此開發(fā)了對(duì)這個(gè)標(biāo)準(zhǔn)的一個(gè)增強(qiáng),叫Rock Ridge增強(qiáng)。 Rock Ridge允許長(zhǎng)文件名、符號(hào)連接和許多其他優(yōu)點(diǎn),使CD-ROM更象UNIX文件系統(tǒng)。同時(shí),Rock Ridge文件系統(tǒng)仍然是一個(gè)有效的ISO9660文件系統(tǒng),使非UNIX一樣可以使用。 Linux同時(shí)支持ISO9660和Rock Ridge增強(qiáng),增強(qiáng)被自動(dòng)識(shí)別和使用。
文件系統(tǒng)只是一部分,許多CD-ROM包含的數(shù)據(jù)需要特定的程序存取,而多數(shù)程序不能運(yùn)行在Linux下 (當(dāng)然,可能運(yùn)行在Linux的MSDOS仿真器dosemu下)。
CD-ROM驅(qū)動(dòng)器通過相關(guān)的設(shè)備文件存取。有多種方法將CDROM連接到計(jì)算機(jī):SCSI、聲卡或EIDE。要完成這的硬件hacking工作超出了本書的范圍,但連接方法決定了設(shè)備文件。指導(dǎo)見[Anv]
磁帶
磁帶驅(qū)動(dòng)器使用磁帶,類似 音樂用的盒帶。磁帶是串行的,即如果要得到給定部分的數(shù)據(jù),必須經(jīng)過所有部分。磁盤可以隨機(jī)存取,即可以直接跳到磁盤上的某個(gè)部分。串行存取的磁帶當(dāng)然慢了。
另外一方面,磁帶相當(dāng)便宜,因?yàn)闊o須快速。也容易做得很長(zhǎng),因此可以容納大量的數(shù)據(jù)。這使磁帶很適于如歸檔、備份等無須高速的、但需要低成本和大容量的事情。
格式化
格式化在磁介質(zhì)上寫用于標(biāo)記磁道和扇區(qū)的標(biāo)志的過程。磁盤格式化前,其磁表面是完成的一塊。格式化后,混沌變?yōu)橹刃颍⒌拇诺?,劃分了扇區(qū)。實(shí)際細(xì)節(jié)并非準(zhǔn)確地這樣,但重要的是:磁盤不經(jīng)過格式化是不能使用的。
這里術(shù)語有些模糊:MS-DOS中,格式化(format)這個(gè)詞還包括了產(chǎn)生文件系統(tǒng)的過程(下面將討論的)。這兩個(gè)過程經(jīng)常一起使用,尤其是軟盤。當(dāng)必須區(qū)分時(shí),真正的格式化被稱為低級(jí)格式化low-level formatting,而建立文件系統(tǒng)被成為高級(jí)格式化high-level formatting。在UNIX圈中,這兩者叫格式畫format和建立文件系統(tǒng)make a filesystem,本書中也這樣稱。
IDE硬盤和一些SCSI硬盤實(shí)際上廠商已經(jīng)做了格式化,并無須重復(fù);因?yàn)槎鄶?shù)人無須關(guān)心它。實(shí)際上,格式化硬盤可能反而不好,比如因?yàn)橛脖P可能需要用特定的方法格式化使壞扇區(qū)被自動(dòng)替換。
磁盤經(jīng)常需要特定的程序來格式化,因?yàn)轵?qū)動(dòng)器的格式化邏輯的接口每個(gè)驅(qū)動(dòng)器都不一樣。格式化程序經(jīng)常在控制器BIOS上,或用MSDOS程序提供,這都不太容易在Linux中使用。
格式化中可能會(huì)發(fā)現(xiàn)磁盤的壞點(diǎn),叫壞塊bad blocks or bad sectors。這有時(shí)由驅(qū)動(dòng)器自己處理。但有時(shí),如果壞塊太多,需要一些工作來避免使用磁盤的這部分。 The logic to do this is built into the filesystem; 下面將說明如何增加這些信息到文件系統(tǒng)。另外,產(chǎn)生一個(gè)只覆蓋這些壞的部分的小分區(qū)也是一個(gè)辦法。如果壞區(qū)較大,這可能是個(gè)好辦法,因?yàn)槲募到y(tǒng)有時(shí)難以處理大量的壞區(qū)。
軟盤格式化使用fdformat 。軟盤設(shè)備使用給定的參數(shù),例如下面的命令在第一個(gè)軟驅(qū)中格式化一張高密度3.5'軟盤:
$ fdformat /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
$
注意,如果想使用自動(dòng)檢測(cè)設(shè)備(如/dev/fd0 ), 必須用先setfdprm 設(shè)定參數(shù)。要得到與上面一樣的結(jié)果,可以這樣:
$ setfdprm /dev/fd0 1440/1440
$ fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
$
選擇與軟盤類型相符的正確的設(shè)備文件通常更方便。注意,比軟盤設(shè)計(jì)格式化更多的信息容量是沒有意義的。
fdformat 也將驗(yàn)證軟盤,例如檢查壞塊。它在壞塊試驗(yàn)幾次(你通常能聽到,驅(qū)動(dòng)器的噪聲很明顯)。 If the floppy is only marginally bad (due to dirt on the read/write head, some errors are false signals), fdformat 可能沒事,而真正的錯(cuò)誤可能退出有效過程。核心把發(fā)現(xiàn)的每個(gè)I/O錯(cuò)誤打印log信息,送到控制臺(tái),或者,如果使用了syslog ,也送到/usr/adm/messages 文件。fdformat 自己不說明哪里出錯(cuò)(也不必考慮,軟盤很便宜,壞了就扔)。
$ fdformat /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... read: Unknown error
$
badblocks 命令可用于查找任何磁盤或分區(qū)的壞塊(包括軟盤)。它不格式化磁盤,因此可以用于檢查存在的文件系統(tǒng)。下面的例子檢查出一張3.5'軟盤上的2個(gè)壞塊:
$ badblocks /dev/fd0H1440 1440
718
719
$
badblocks 輸出發(fā)現(xiàn)的壞塊的塊號(hào)。多數(shù)文件系統(tǒng)可以避免這樣的壞塊。他們維護(hù)一個(gè)已知的壞塊列表,在文件系統(tǒng)建立時(shí)初始化,并可以在以后修改。初始的壞塊查找可由mkfs 命令完成(它初始化文件系統(tǒng)),以后可以用badblocks 來檢查,新的塊可以用fsck 加入。后面我們將說明mkfs 和fsck 。
許多新型的硬盤自動(dòng)發(fā)現(xiàn)壞塊,并企圖用一個(gè)特定的、保護(hù)的好塊來代替它。這對(duì)操作系統(tǒng)是不可見的。這種特征應(yīng)該在硬盤手冊(cè)的文檔中,如果你好奇的話。但即使這樣的硬盤也可能失敗,如果壞塊數(shù)量太大的話,雖然如果這樣,那硬盤就基本上不能用了。
分區(qū)
一個(gè)硬盤可分為幾個(gè)分區(qū)。每個(gè)分區(qū)好象是單獨(dú)的硬盤。這樣,你如果只有一個(gè)硬盤,卻想安裝2個(gè)操作系統(tǒng),你可以把這個(gè)硬盤分為2個(gè)分區(qū)。每個(gè)操作系統(tǒng)任意使用自己的分區(qū)而不干擾另一個(gè)。這種方法,2個(gè)操作系統(tǒng)可以在同一硬盤上和平共處。如果沒有分區(qū),你只能為每個(gè)操作系統(tǒng)購(gòu)買一個(gè)硬盤。
軟盤不分區(qū)。這沒有技術(shù)原因,只因?yàn)樘?,沒有必要。CDROM一般也不分區(qū),因?yàn)樽鳛橐粋€(gè)大盤更易于使用,而且很少有多操作系統(tǒng)的需要。
MBR(主引導(dǎo)記錄), 啟動(dòng)扇區(qū)和分區(qū)表
一個(gè)硬盤如何分區(qū)的信息存在它的第一個(gè)扇區(qū)(即第一面第一道第一扇區(qū))。這個(gè)第一扇區(qū)是硬盤的主引導(dǎo)記錄(MBR);這是計(jì)算機(jī)啟動(dòng)時(shí)BIOS讀入和啟動(dòng)的扇區(qū)。主引導(dǎo)記錄包括一段小程序,讀入分區(qū)表,檢查哪個(gè)分區(qū)是活動(dòng)分區(qū)(即啟動(dòng)分區(qū)),并讀入活動(dòng)分區(qū)的第一個(gè)扇區(qū):該分區(qū)的啟動(dòng)扇區(qū)(MBR也是啟動(dòng)扇區(qū),只不過因?yàn)槠涮厥獾匚?,所以使用特殊的名?。這個(gè)啟動(dòng)扇區(qū)包括另一個(gè)小程序,讀入這個(gè)分區(qū)(假設(shè)是可啟動(dòng)的)上操作系統(tǒng)的第一個(gè)部分,然后啟動(dòng)它。
這個(gè)分區(qū)方案不是內(nèi)置于硬件和BIOS的,只是許多操作系統(tǒng)遵循的約定。并非所有的操作系統(tǒng)都遵循這個(gè)約定,也有例外。有些操作系統(tǒng)支持分區(qū),但他們占領(lǐng)硬盤上的一個(gè)分區(qū),然后使用他們自己的內(nèi)部分區(qū)方法管理這個(gè)分區(qū)。較新的操作系統(tǒng)可以和其他操作系統(tǒng)和平共處(包括Linux),而無需特殊的措施,但不支持分區(qū)的操作系統(tǒng)無法在同一硬盤上與其他操作系統(tǒng)共存。
為安全預(yù)防,最好先在紙上寫下分區(qū)表,這樣在錯(cuò)誤發(fā)生時(shí)不會(huì)丟失你的文件。(可以使用fdisk 修復(fù)壞的分區(qū)表)。 )相關(guān)信息可用fdisk -l 命令給出:
$ fdisk -l /dev/hda
Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders
Units = cylinders of 855 * 512 bytes
Device Boot Begin Start End Blocks Id System
/dev/hda1 1 1 24 10231+ 82 Linux swap
/dev/hda2 25 25 48 10260 83 Linux native
/dev/hda3 49 49 408 153900 83 Linux native
/dev/hda4 409 409 790 163305 5 Extended
/dev/hda5 409 409 744 143611+ 83 Linux native
/dev/hda6 745 745 790 19636+ 83 Linux native
$
擴(kuò)展和邏輯分區(qū)
PC硬盤的最初的分區(qū)方案只允許4個(gè)分區(qū)。實(shí)際使用中這太少了,比如有人想裝多于4個(gè)操作系統(tǒng) (Linux, MS-DOS, OS/2, Minix, FreeBSD, NetBSD, Windows/NT等),或有時(shí)一個(gè)操作系統(tǒng)有多個(gè)分區(qū)更好,例如由于速度的原因,Linux的對(duì)換區(qū)最好單獨(dú)使用自己的分區(qū),而不是在主 Linux分區(qū)中(下文詳述)。
為克服這個(gè)設(shè)計(jì)問題,發(fā)明了擴(kuò)展分區(qū)。這個(gè)方法允許將基本分區(qū)分為若干子分區(qū),因而被子分區(qū)的基本分區(qū)稱為擴(kuò)展分區(qū),而子分區(qū)稱為邏輯分區(qū),他們的表現(xiàn)類似基本分區(qū) ,但產(chǎn)生方法不同。他們之間沒有速度差別。
硬盤的分區(qū)結(jié)構(gòu)可能類似。這個(gè)硬盤被分為3個(gè)基本分區(qū),第二個(gè)被分為2個(gè)邏輯分區(qū)。部分硬盤根本沒有分區(qū)。硬盤是一個(gè)整體,每個(gè)基本分區(qū)有一個(gè)啟動(dòng)扇區(qū)。
分區(qū)種類
分區(qū)表(MBR和擴(kuò)展分區(qū)里都有)中,對(duì)每個(gè)分區(qū),有一個(gè)字節(jié)指出分區(qū)種類。這試圖確定使用該分區(qū)的操作系統(tǒng),或用于何操作系統(tǒng)。其目的是避免2個(gè)操作系統(tǒng)使用同一分區(qū)??蓪?shí)際上,操作系統(tǒng)并不真的注意分區(qū)種類字節(jié);例如,Linux根本不管它是什么。較壞的情況是,有些操作系統(tǒng)錯(cuò)誤地使用它:例如有些版本的DR-DOS忽略了它的最高位(MSB),而其他一些系統(tǒng)則不是。
沒有一個(gè)標(biāo)準(zhǔn)化組織定義分區(qū)種類字節(jié)每個(gè)值的意義,但一些共同接受的值包括在表 4.1中。相同的列表可以通過Linux的fdisk 命令得到。
給硬盤分區(qū)
有許多產(chǎn)生和刪除分區(qū)的程序。許多操作系統(tǒng)自帶,最好使用其自帶的,除非要做一些它不能作到的。許多這種程序叫fdisk , 包括Linux, 或其變種。 Linux fdisk 的使用細(xì)節(jié)可見其Man手冊(cè)。 cfdisk 命令類似fdisk , 但有更好的用戶界面(全屏的)。
使用IDE硬盤時(shí),啟動(dòng)分區(qū)(帶可啟動(dòng)核心映象文件的分區(qū))必須全在前1024個(gè)柱面內(nèi)。這是因?yàn)橛脖P通過BIOS啟動(dòng)(在系統(tǒng)進(jìn)入保護(hù)模式前),而BIOS不能處理多于1024柱面。有時(shí)也可能使用部分在前1024柱面的啟動(dòng)分區(qū),這要求所有用BIOS讀入的文件都在前1024柱面內(nèi)。由于這難與安排,因此這是個(gè)很差的主意;你不可能知道什么時(shí)候核心升級(jí)或磁盤碎片整理會(huì)導(dǎo)致系統(tǒng)無法啟動(dòng)。因此,應(yīng)該確認(rèn)你的啟動(dòng)分區(qū)完全在前1024柱面內(nèi)。
事實(shí)上,一些新版的BIOS和IDE硬盤可以處理多于1024柱面。如果你有這樣一個(gè)系統(tǒng),你可以忘卻這個(gè)問題;如果你不能確認(rèn),還是把啟動(dòng)分區(qū)放在前1024柱面內(nèi)。
每個(gè)分區(qū)擁有一塊連續(xù)的扇區(qū)。因?yàn)長(zhǎng)inux文件系統(tǒng)使用1 kB的塊,即2個(gè)扇區(qū),所以奇數(shù)個(gè)扇區(qū)會(huì)導(dǎo)致最后一個(gè)扇區(qū)不能使用,這不會(huì)有什么問題,但不好,有些版本的 fdisk 會(huì)對(duì)此給出警告。
改變分區(qū)大小一般要求首先備分此分區(qū)想保留的所有東西(為防萬一,最好備分整個(gè)硬盤),然后刪除此分區(qū),產(chǎn)生新分區(qū),最后回存所有東西到新分區(qū)。如果是擴(kuò)大分區(qū),你可能需要調(diào)整相鄰分區(qū)的大小(并備分、回存)。
由于改變分區(qū)大小是如此痛苦,最好一次就確定?;驌碛幸粋€(gè)有效而易用的備分系統(tǒng)。如果你通過無須太多人工干預(yù)的介質(zhì)安裝(例如CDROM,而不是軟盤),那么開始可以比較容易地玩玩各種設(shè)置。因?yàn)槟銦o須備分什么數(shù)據(jù),改幾次分區(qū)大小不會(huì)太過痛苦。
有個(gè)MSDOS的程序叫fips , 可以無須備分和回存地改變MSDOS分區(qū)的大小, 但對(duì)其他文件系統(tǒng),備分回存還是必須的。
設(shè)備文件和分區(qū)
每個(gè)分區(qū)和擴(kuò)展分區(qū)有自己的設(shè)備文件。這些文件的命名規(guī)定是在整個(gè)盤的名字加分區(qū)號(hào),并約定1-4是基本分區(qū)(不管真的有幾個(gè)基本分區(qū)),5-8是邏輯分區(qū)(不管它在哪個(gè)基本分區(qū)中)。例如,/dev/hda1 是第一個(gè)IDE硬盤的第一個(gè)基本分區(qū),而/dev/sdb7 是第二個(gè)SCSI硬盤的第三個(gè)擴(kuò)展分區(qū)。設(shè)備列表 [Anv]給出更詳細(xì)的信息。
文件系統(tǒng)
什么是文件系統(tǒng)?
文件系統(tǒng)是操作系統(tǒng)用于明確磁盤或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu);即在磁盤上組織文件的方法。也指用于存儲(chǔ)文件的磁盤或分區(qū),或文件系統(tǒng)種類。因此,可以說"我有2個(gè)文件系統(tǒng)"意思是他有2個(gè)分區(qū),一個(gè)存文件,或他用 "擴(kuò)展文件系統(tǒng)",意思是文件系統(tǒng)的種類。
磁盤或分區(qū)和它所包括的文件系統(tǒng)的不同是很重要的。少數(shù)程序(包括最有理由的產(chǎn)生文件系統(tǒng)的程序)直接對(duì)磁盤或分區(qū)的原始扇區(qū)進(jìn)行操作;這可能破壞一個(gè)存在的文件系統(tǒng)。大部分程序基于文件系統(tǒng)進(jìn)行操作,在不同種文件系統(tǒng)上不能工作。
一個(gè)分區(qū)或磁盤能作為文件系統(tǒng)使用前,需要初始化,并將記錄數(shù)據(jù)結(jié)構(gòu)寫到磁盤上。這個(gè)過程就叫建立文件系統(tǒng)。
大部分UNIX文件系統(tǒng)種類具有類似的通用結(jié)構(gòu),即使細(xì)節(jié)有些變化。其中心概念是超級(jí)塊superblock, i節(jié)點(diǎn)inode, 數(shù)據(jù)塊data block,目錄塊directory block, 和間接塊indirection block。超級(jí)塊包括文件系統(tǒng)的總體信息,比如大小(其準(zhǔn)確信息依賴文件系統(tǒng))。 i節(jié)點(diǎn)包括除了名字外的一個(gè)文件的所有信息,名字與i節(jié)點(diǎn)數(shù)目一起存在目錄中,目錄條目包括文件名和文件的i節(jié)點(diǎn)數(shù)目。 i節(jié)點(diǎn)包括幾個(gè)數(shù)據(jù)塊的數(shù)目,用于存儲(chǔ)文件的數(shù)據(jù)。 i節(jié)點(diǎn)中只有少量數(shù)據(jù)塊數(shù)的空間,如果需要更多,會(huì)動(dòng)態(tài)分配指向數(shù)據(jù)塊的指針空間。這些動(dòng)態(tài)分配的塊是間接塊;為了找到數(shù)據(jù)塊,這名字指出它必須先找到間接塊的號(hào)碼。
UNIX文件系統(tǒng)通常允許在文件中產(chǎn)生孔(hole) (用lseek ; 請(qǐng)看手冊(cè)), 意思是文件系統(tǒng)假裝文件中有一個(gè)特殊的位置只有0字節(jié),但沒有為這文件的這個(gè)位置保留實(shí)際的磁盤空間(這意味著這個(gè)文件將少用一些磁盤空間)。這對(duì)小的二進(jìn)制文件經(jīng)常發(fā)生,Linux共享庫(kù)、一些數(shù)據(jù)庫(kù)和其他一些特殊情況。 (孔由存儲(chǔ)在間接塊或i節(jié)點(diǎn)中的作為數(shù)據(jù)塊地址的一個(gè)特殊值實(shí)現(xiàn),這個(gè)特殊地址說明沒有為文件的這個(gè)部分分配數(shù)據(jù)塊,即,文件中有一個(gè)孔。)
孔有一定的用處。在筆者的系統(tǒng)中,一個(gè)簡(jiǎn)單的測(cè)量工具顯示在200MB使用的磁盤空間中,由于孔,節(jié)約了大約4MB。在這個(gè)系統(tǒng)中,程序相對(duì)較少,沒有數(shù)據(jù)庫(kù)文件。有關(guān)這個(gè)測(cè)量工具的細(xì)節(jié)請(qǐng)看附錄 A.
Filesystems galore
Linux支持多種文件系統(tǒng)。下面是最重要的幾個(gè):
minix
最老的,相信是最可靠的,但缺少特色(有些沒有時(shí)間標(biāo)記,文件名最長(zhǎng)30個(gè)字符),能力有局限(每個(gè)文件系統(tǒng)最多64MB)。
xia
minix文件系統(tǒng)的一個(gè)修正版本,提升了文件名和文件系統(tǒng)大小的局限,但沒有新的特色。不太流行,但據(jù)說工作得很好。
ext2
最好的Linux自己的文件系統(tǒng),也是當(dāng)前最通用的。其設(shè)計(jì)易于向上兼容,所以新版的文件系統(tǒng)代碼無需重做已有的文件系統(tǒng)。
ext
ext2的老版,且不向上兼容。難于用新版安裝程序安裝,大部分人都改用ext2。
另外,支持多種其他現(xiàn)存的外圍文件系統(tǒng),很容易與其他外圍文件系統(tǒng)交換文件。這些外圍文件系統(tǒng)好象是自己的一樣,除了可能缺少一些一般UNIX的特征,或有些不同的局限。
msdos
與MSDOS、OS/2等的FAT文件系統(tǒng)兼容。
umsdos
Linux下的擴(kuò)展msdos文件系統(tǒng)驅(qū)動(dòng),支持長(zhǎng)文件名、所有者、允許權(quán)限、連接和設(shè)備文件。允許一個(gè)普通的msdos文件系統(tǒng)用于Linux,而無須為L(zhǎng)inux建立單獨(dú)的分區(qū)。
iso9660
標(biāo)準(zhǔn)CDROM文件系統(tǒng),通用的Rock Ridge增強(qiáng),允許長(zhǎng)文件名。
nfs
網(wǎng)絡(luò)文件系統(tǒng),允許多臺(tái)計(jì)算機(jī)之間共享文件系統(tǒng),易于從所有這些計(jì)算機(jī)上存取文件。
hpfs
OS/2文件系統(tǒng)。
sysv
SystemV/386, Coherent, 和Xenix文件系統(tǒng)。
根據(jù)情況選擇文件系統(tǒng)。如兼容性或其他原因必需使用非Linux文件系統(tǒng),那就必須用。如果可以自由選擇,可能最明智的選擇是ext2,因?yàn)樗鼡碛腥刻卣鞫鵁o須忍受性能缺陷。
還有proc文件系統(tǒng), 一般在/proc 目錄, 它不是一個(gè)真正的文件系統(tǒng),雖然好象是。proc文件系統(tǒng)使用戶易于存取全部核心數(shù)據(jù)結(jié)構(gòu),比如進(jìn)程列表。它使這些數(shù)據(jù)結(jié)構(gòu)看起來象個(gè)文件系統(tǒng),且此文件系統(tǒng)可以用所有一般的文件工具操作。例如,要得到所有進(jìn)程的列表,可以使用命令
$ ls -l /proc
total 0
dr-xr-xr-x 4 root root 0 Jan 31 20:37 1
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95
dr-xr-xr-x 4 root users 0 Jan 31 20:37 98
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99
-r--r--r-- 1 root root 0 Jan 31 20:37 devices
-r--r--r-- 1 root root 0 Jan 31 20:37 dma
-r--r--r-- 1 root root 0 Jan 31 20:37 filesystems
-r--r--r-- 1 root root 0 Jan 31 20:37 interrupts
-r-------- 1 root root 8654848 Jan 31 20:37 kcore
-r--r--r-- 1 root root 0 Jan 31 11:50 kmsg
-r--r--r-- 1 root root 0 Jan 31 20:37 ksyms
-r--r--r-- 1 root root 0 Jan 31 11:51 loadavg
-r--r--r-- 1 root root 0 Jan 31 20:37 meminfo
-r--r--r-- 1 root root 0 Jan 31 20:37 modules
dr-xr-xr-x 2 root root 0 Jan 31 20:37 net
dr-xr-xr-x 4 root root 0 Jan 31 20:37 self
-r--r--r-- 1 root root 0 Jan 31 20:37 stat
-r--r--r-- 1 root root 0 Jan 31 20:37 uptime
-r--r--r-- 1 root root 0 Jan 31 20:37 version
$
(可能有些文件與進(jìn)程不符。上面的例子被簡(jiǎn)短了。)
注意雖然叫文件系統(tǒng),proc文件系統(tǒng)沒有一個(gè)部分與磁盤有關(guān),它只在核心映象中存在。任何人任何時(shí)候想看proc文件系統(tǒng)的任何部分,核心使它看起來好象這部分在什么地方存在(雖然沒有)。因此,雖然/proc/kcore 文件有好多兆字節(jié),但它根本沒用任何磁盤空間。
應(yīng)該用哪個(gè)文件系統(tǒng)?
一般沒有什么理由用許多不同的文件系統(tǒng)。當(dāng)前,ext2fs是最流行的,可能是最明智的選擇。根據(jù)記錄結(jié)構(gòu)、速度、(感覺的)可靠性、兼容性和其他不同的理由,適當(dāng)?shù)厥褂闷渌募到y(tǒng)。個(gè)別情況需要個(gè)別決定。
建立文件系統(tǒng)
用mkfs 命令建立文件系統(tǒng),即初始化。實(shí)際上,對(duì)每個(gè)不同種類的文件系統(tǒng)有一個(gè)單獨(dú)的程序。 mkfs 只是為了建立不同文件系統(tǒng)種類確定運(yùn)行不同程序的一個(gè)前端。用-t fstype選項(xiàng)選擇種類。
被mkfs 調(diào)用的程序有不同的命令行接口。最通用和最重要的選項(xiàng)如下,細(xì)節(jié)請(qǐng)看手冊(cè)。
-t fstype
選擇文件系統(tǒng)種類。
-c
查找壞塊,初始化壞塊列表。
-l filename
從文件filename讀入壞塊列表。
用如下命令在軟盤上產(chǎn)生ext2文件系統(tǒng):
$ fdformat -n /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ mkfs -t ext2 -l bad-blocks /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
首先,格式化軟盤(-n選項(xiàng)不進(jìn)行確認(rèn),即壞塊檢查)。然后用badblocks 查找壞塊, 輸出定向到文件bad-blocks。最后,產(chǎn)生文件系統(tǒng),壞塊列表由文件badblocks 初始化。
-c選項(xiàng)可以與mkfs 一起使用,而無須badblocks 和一個(gè)單獨(dú)的文件。如下:
$ mkfs -t ext2 -c /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group
Checking for bad blocks (read-only test): done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
使用-c比用單獨(dú)使用badblocks 更方便, 但建立文件系統(tǒng)后檢查,badblocks 是必要的。
在硬盤或分區(qū)上準(zhǔn)備文件系統(tǒng)的過程和軟盤是一樣的,除了無須格式化。
Mount和unmount
一個(gè)文件系統(tǒng)可以使用之前,必須mount。操作系統(tǒng)然后做一些記錄以確認(rèn)正常。因?yàn)閁NIX所有的文件在一個(gè)目錄樹中, mount操作的結(jié)果使新的文件系統(tǒng)的內(nèi)容好象在某個(gè)已經(jīng)mount的文件系統(tǒng)的一個(gè)已經(jīng)存在的子目錄中。
上面的mount可能使用如下命令:
$ mount /dev/hda2 /home
$ mount /dev/hda3 /usr
$
mount 命令使用2個(gè)參數(shù)。第一個(gè)是與包括文件系統(tǒng)的磁盤或分區(qū)相關(guān)的設(shè)備文件。第二個(gè)是要mount到的目錄。 mount以后,這2個(gè)文件系統(tǒng)的內(nèi)容好象是/home 和/usr 目錄。這樣就可以說:/dev/hda2 被mount到 /home , /usr 也同樣。要看每個(gè)文件系統(tǒng),就看其被安裝的目錄,好象它就是在那里。注意設(shè)備文件的區(qū)別,/dev/hda2 , 和安裝到的目錄/home 。設(shè)備文件給出硬盤原始內(nèi)容的存取,安裝到的目錄給出磁盤上文件的存取。安裝到的目錄叫安裝點(diǎn)。
Linux支持許多文件系統(tǒng)。mount 會(huì)試著猜測(cè)文件系統(tǒng)種類。也可以使用-t fstype 選項(xiàng)直接定義種類;這有時(shí)是必要的,因?yàn)樽詸z測(cè)mount 并非總能成功。例如要mount一個(gè)MSDOS軟盤,可以用如下命令:
$ mount -t msdos /dev/fd0 /floppy
$
安裝點(diǎn)目錄不必是空的,但必須存在。其中的所有文件當(dāng)文件系統(tǒng)mount后將不可用名字存取(已經(jīng)打開的文件將繼續(xù)可存取。有其他目錄硬連接的文件可以通過那些名字存取)。這沒有壞處,反而可能更有用。例如,有人喜歡將/tmp 和/var/tmp 作為同義,將/tmp 作為/var/tmp 的符號(hào)連接。系統(tǒng)啟動(dòng)時(shí),在/usr 文件系統(tǒng)被mount之前,使用駐留在根文件系統(tǒng)的 /var/tmp 目錄。當(dāng)/usr 被mount上以后,根文件系統(tǒng)上的/var/tmp 將不可用,如果根文件系統(tǒng)上不存在 /var/tmp ,那么在mount上/var 之前將不可能使用暫存文件。
如果不打算在一個(gè)文件系統(tǒng)上寫任何東西,可以使用mount 的-r開關(guān)做一個(gè)只讀mount。這將使核心停止任何對(duì)此文件系統(tǒng)的寫要求,也將停止核心的對(duì)i節(jié)點(diǎn)的文件存取時(shí)間的更新。只讀mount對(duì)不可寫介質(zhì)是必要的,例如CDROM。
細(xì)心的讀者可能已經(jīng)注意到一個(gè)小的邏輯問題。第一個(gè)文件系統(tǒng)(叫根文件系統(tǒng),因?yàn)樗夸?如何mount,因?yàn)楹苊黠@,它不能mount到另一個(gè)文件系統(tǒng)? Well, the answer is that it is done by magic. The root filesystem is magically mounted at boot time, and one can rely on it to always be mounted-- 如果根文件系統(tǒng)不能mount,系統(tǒng)將不能啟動(dòng)。 The name of the filesystem that is magically mounted as root 被編譯進(jìn)核心,或用LILO或rdev 設(shè)置。
根文件系統(tǒng)通常先被只讀mount。然后啟動(dòng)手稿運(yùn)行fsck 校驗(yàn)它的有效性,如果沒有問題,將re-mount它,使之可寫。fsck 不能運(yùn)行于一個(gè)已mount的文件系統(tǒng),因?yàn)閒sck 運(yùn)行時(shí),任何文件系統(tǒng)的改變將導(dǎo)致錯(cuò)誤。因?yàn)楦募到y(tǒng)在被檢查時(shí)是只讀,fsck 可以無慮地修復(fù)任何問題,因?yàn)閞e-mount 操作將刷新文件系統(tǒng)在內(nèi)存中的所有數(shù)據(jù)。
在有其他文件系統(tǒng)的許多系統(tǒng)中,啟動(dòng)時(shí)要自動(dòng)mount,可以在/etc/fstab 文件中定義:文件格式細(xì)節(jié)請(qǐng)參考fstab 的手冊(cè)頁。 mount特別的文件系統(tǒng)的特別細(xì)節(jié)依賴于許多因素,可以根據(jù)需要由每個(gè)管理員設(shè)置。 When the chapter on booting is finished, you may read all about it there.
當(dāng)一個(gè)文件系統(tǒng)不需要再mount著,可以用umount . umount 加一個(gè)參數(shù)unmount它,參數(shù)可以是設(shè)備文件或安裝點(diǎn)。例如,要unmount上面例子中的目錄,可以用:
$ umount /dev/hda2
$ umount /usr
$
要了解使用這個(gè)命令的更多的說明,參閱手冊(cè)。注意:記住unmount已經(jīng)mount的軟盤, 而不能僅僅將軟盤彈出軟驅(qū)!由于磁盤緩沖,在你unmount軟盤之前無須回寫,因此過早取出軟盤將導(dǎo)致內(nèi)容不正確。只從軟盤上讀還不要緊,如果寫,就可能發(fā)生災(zāi)難性的損失。
mount和umount需要超級(jí)擁護(hù)特權(quán),即只有root 用戶可以做。原因是:如果任何用戶都可以mount軟盤到任何目錄,那么很容易用軟盤做,比如,用特洛伊木馬替換/bin/sh , 或者其他常用的程序。但是允許用戶使用軟盤經(jīng)常又是必要的,有幾種方法:
給用戶root 口令,很明顯這對(duì)安全不利,但是最簡(jiǎn)單的方法。如果沒有安全要求,這個(gè)方法很好,比如在非網(wǎng)絡(luò)的、個(gè)人系統(tǒng)上。
使用一個(gè)程序比如sudo 允許擁護(hù)使用mount。這同樣對(duì)安全不利,但沒有直接給任何人超級(jí)用戶特權(quán)。
讓用戶使用mtools , 這是一個(gè)利用MSDOS文件系統(tǒng)的軟件包,無須mount。如果是MSDOS軟盤這樣做很好,否則不好。
在/etc/fstab 中用合適的選項(xiàng)列出軟驅(qū)設(shè)備和允許的安裝點(diǎn)。
最后一個(gè)選擇可以在/etc/fstab 文件中加類似下面的一行來完成:
/dev/fd0 /floppy msdos user,noauto 0 0
各列分別是:要mount的設(shè)備文件,要安裝到的目錄,文件系統(tǒng)類型,選項(xiàng),備份頻率(用于dump ) 和fsck 次序(定義啟動(dòng)時(shí)文件系統(tǒng)被檢查的次序,0表示不檢查)。
noauto選項(xiàng)使系統(tǒng)啟動(dòng)是不自動(dòng)mount(即, it stops mount -a from mounting it)。 user允許任何用戶mount這個(gè)文件系統(tǒng),并且,由于安全原因,不允許執(zhí)行程序(normal or setuid) and interpretation of device files from the mounted filesystem。這樣,任何用戶都可以用如下命令mount一個(gè)msdos文件系統(tǒng)的軟盤:
$ mount /floppy
$
軟盤可以用相關(guān)的umount 被unmount。
如果想提供多種軟盤的存取,需要給出多個(gè)安裝點(diǎn)。對(duì)每個(gè)安裝點(diǎn)的設(shè)置可以不同。例如,提供MSDOS和ext2文件系統(tǒng)的存取,可以在/etc/fstab 文件中加如下行:
/dev/fd0 /dosfloppy msdos user,noauto 0 0
/dev/fd0 /ext2floppy ext2 user,noauto 0 0
對(duì)于MSDOS文件系統(tǒng)(不僅是軟盤),可能需要用uid, gid,和umask 文件系統(tǒng)選項(xiàng)來限制存取權(quán)限,請(qǐng)看mount 手冊(cè)頁。如果不小心,mount一個(gè)MS-DOS文件系統(tǒng)將給予任何用戶至少是讀權(quán)限,這可不是一個(gè)好主意。
用fsck檢查文件系統(tǒng)完整性
文件系統(tǒng)很復(fù)雜,因此易于發(fā)生錯(cuò)誤??梢杂胒sck 命令檢查文件系統(tǒng)是否正確和有效。它可以根據(jù)指令修復(fù)找到的小錯(cuò)誤,并將未修復(fù)錯(cuò)誤報(bào)告用戶。幸運(yùn)的是,文件系統(tǒng)的代碼非常有效,所以根本極少出現(xiàn)問題,并且問題通常原因是電源失敗、硬件失敗、或操作錯(cuò)誤,例如沒有正常關(guān)閉系統(tǒng)。
大多數(shù)系統(tǒng)設(shè)置為啟動(dòng)時(shí)自動(dòng)運(yùn)行fsck ,因此任何錯(cuò)誤將在系統(tǒng)使用前被檢測(cè)到(并根據(jù)希望修正)。使用有錯(cuò)誤的文件系統(tǒng)可能使問題變得更壞:如果數(shù)據(jù)結(jié)構(gòu)有問題,使用這個(gè)文件系統(tǒng)可能使之更糟,導(dǎo)致更多的數(shù)據(jù)丟失。當(dāng)然,在大的文件系統(tǒng)上運(yùn)行fsck 會(huì)花一定的時(shí)間,如果系統(tǒng)正常關(guān)閉,幾乎從不發(fā)生錯(cuò)誤,因此有一些方法可以不進(jìn)行檢查。如果文件/etc/fastboot 存在,就不檢查。另外,如果ext2文件系統(tǒng)在超級(jí)快中有一個(gè)特定的標(biāo)記告知該文件系統(tǒng)在上次mount后沒有正常unmount. 如果標(biāo)記指出unmount正常完成(假設(shè)正常unmount指出沒問題),e2fsck (fsck 的ext2文件系統(tǒng)版) 就不檢查系統(tǒng)。/etc/fastboot 是否影響系統(tǒng)依賴于你的啟動(dòng)手稿,但ext2標(biāo)記則在你使用e2fsck 時(shí)發(fā)生作用--基于一個(gè)e2fsck 選項(xiàng)(參閱e2fsck 手冊(cè)頁)
自動(dòng)檢查只對(duì)啟動(dòng)時(shí)自動(dòng)mount的文件系統(tǒng)發(fā)生作用。使用fsck 手工檢查其他文件系統(tǒng),比如軟盤。
如果fsck 發(fā)現(xiàn)為修復(fù)的問題,你需要深入了解文件系統(tǒng)的一般工作原理和有問題的文件系統(tǒng)的細(xì)節(jié),或好的備份。最后一個(gè)辦法容易(雖然冗長(zhǎng))安排,如果你自己不知道,有時(shí)可以通過朋友、Linux新聞組、電子郵件列表或其他支持源安排。我很想告訴你更多,但我對(duì)這的學(xué)習(xí)和實(shí)踐也并不多。Theodore T'so的debugfs 程序應(yīng)該有用。
fsck 只能運(yùn)行于未mount的文件系統(tǒng),不要用于已mount的文件系統(tǒng)(除了啟動(dòng)時(shí)的只讀根文件系統(tǒng))。這是因?yàn)樗嫒≡即疟P,在操作系統(tǒng)不知道的情況下修改文件系統(tǒng)。 There will be trouble, if the operating system is confused.
用badblocks檢查磁盤錯(cuò)誤
應(yīng)該周期性地用badblocks 命令檢查壞塊它輸出找到的所有壞塊的編號(hào)的列表。列表給fsck 記錄在文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu)中,使操作系統(tǒng)存儲(chǔ)數(shù)據(jù)時(shí)不使用這些壞塊。舉例:
$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ fsck -t ext2 -l bad-blocks /dev/fd0H1440
Parallelizing fsck version 0.5a (5-Apr-94)
e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Check reference counts.
Pass 5: Checking group summary information.
/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0H1440: 11/360 files, 63/1440 blocks
$
如果badblocks報(bào)告一個(gè)塊已經(jīng)使用,e2fsck 將試著將此塊移到其他地方。如果該塊真的壞了,而不是在壞塊邊緣,文件內(nèi)容可能丟失。
Fighting fragmentation
文件寫到磁盤時(shí),不一定在連續(xù)的塊中。沒在連續(xù)塊中的文件叫碎片。因?yàn)榇疟P的讀寫頭回更多地移動(dòng),讀碎片文件會(huì)花較長(zhǎng)的時(shí)間。雖然如果有好的讀前緩沖系統(tǒng)不會(huì)有什么問題,但最好還是避免碎片。
Ext2文件系統(tǒng)試圖使碎片最少,即使不能將一個(gè)文件的所有塊存在連續(xù)扇區(qū)中,也盡量靠近。 Ext2通常有效地安排里文件其他塊最近的空閑塊,因此很少需要關(guān)心碎片問題。 Ext2文件系統(tǒng)有一個(gè)消除碎片程序,請(qǐng)看參考書目中的 [TV]。
有許多MSDOS消碎片程序在文件系統(tǒng)中移動(dòng)塊以消除碎片。其他一些文件系統(tǒng),消碎片必須通過備份-重產(chǎn)生-回存文件系統(tǒng)來完成。對(duì)于所有文件系統(tǒng),消碎片應(yīng)該備份文件系統(tǒng),因?yàn)楹芏嘣蚩赡茉谙槠^程中導(dǎo)致錯(cuò)誤。
對(duì)所有文件系統(tǒng)的其他工具
一些其他工具對(duì)管理文件系統(tǒng)有用。 df (Disk Free)顯示一個(gè)或多個(gè)文件系統(tǒng)的空閑磁盤空間。 du (Disk Usage)顯示一個(gè)目錄和其內(nèi)的所有文件使用了多少磁盤空間。這用于發(fā)現(xiàn)磁盤空間浪費(fèi)。
sync 強(qiáng)制將磁盤緩沖的所有未寫塊寫入磁盤(見 5.6)。這一般無須手工完成,由守護(hù)進(jìn)程update 自動(dòng)完成。這在有些情況下很有用,例如,如果update 或其輔助進(jìn)程bdflush 死了,或你不能等運(yùn)行update 必須馬上 關(guān)閉電源。
對(duì)ext2文件系統(tǒng)的其他工具
除了產(chǎn)生文件系統(tǒng)的mke2fs 和檢查文件系統(tǒng)的e2fsck 直接或通過與文件系統(tǒng)類型無關(guān)的前端存取外,Ext2文件系統(tǒng)還有幾個(gè)有用的工具。
tune2fs 調(diào)整文件系統(tǒng)參數(shù)。一些有趣的參數(shù)有:
最大mount數(shù)。當(dāng)文件系統(tǒng)被mount過多少次以后,即使標(biāo)志是干凈的,e2fsck 強(qiáng)制檢查。對(duì)用于開發(fā)或測(cè)試的系統(tǒng),應(yīng)該降低這個(gè)限制數(shù)。
最大檢查間隔。到達(dá)這個(gè)間隔時(shí)間,即使標(biāo)志是干凈的,e2fsck 強(qiáng)制檢查。如果文件系統(tǒng)不是經(jīng)常mount,可以不使能這個(gè)功能。
保留給root的塊數(shù)。Ext2給root保留一些塊,這樣如果文件系統(tǒng)滿了,還可能無須刪除任何東西做系統(tǒng)管理。保留量確省是5%,這在大多數(shù)磁盤上不會(huì)造成浪費(fèi)。當(dāng)然,軟盤沒有理由保留塊。
參閱tune2fs 手冊(cè)頁
dumpe2fs 顯示一個(gè)ext2文件系統(tǒng)的信息,大部分來源于超級(jí)塊。有些輸出信息是技術(shù)性的,要求對(duì)文件系統(tǒng)工作的理解(見附錄 ), 但許多即使是一般管理員是也易于理解的。
debugfs 是一個(gè)文件系統(tǒng)調(diào)試器。它允許直接存取磁盤上的文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu),可用于修復(fù)fsck 不能自動(dòng)修復(fù)的磁盤。它也可用于恢復(fù)被刪除的文件。但是,debugfs 非常要求你理解你所干的事,錯(cuò)誤的理解和操作將破壞你的所有數(shù)據(jù)。
dump 和restore 可用于備份一個(gè)ext2文件系統(tǒng)。它們是傳統(tǒng)UNIX備份工具的ext2版。關(guān)于更有關(guān)備份的信息見 9章。
沒有文件系統(tǒng)的磁盤
并非所有磁盤或分區(qū)都作為文件系統(tǒng)使用。例如對(duì)換分區(qū),就沒有文件系統(tǒng)。許多軟盤作為磁帶仿真使用,所以tar 或其他文件可以直接寫到原始磁盤,而不是文件系統(tǒng)。Linux啟動(dòng)軟盤不包括文件系統(tǒng),只是原始核心。
不用文件系統(tǒng)的優(yōu)點(diǎn)是有更多的磁盤可用空間,因?yàn)槲募到y(tǒng)需要一些記錄。也更容易與其他系統(tǒng)兼容;例如tar 文件格式在所有系統(tǒng)上相同,而文件系統(tǒng)則在大多數(shù)系統(tǒng)上不同。如果需要,你會(huì)很快使用沒有文件系統(tǒng)的磁盤??蓡?dòng)的 Linux軟盤無需文件系統(tǒng),雖然有也可能。
使用原始磁盤的一個(gè)原因是做映象拷貝。比如,如果磁盤包含部分損壞的文件系統(tǒng),那么在修復(fù)前做一個(gè)完全拷貝是個(gè)好主意,因?yàn)槿绻阈掊e(cuò)了,可以重來。做映象拷貝的一個(gè)方法是用 dd :
$ dd if=/dev/fd0H1440 of=floppy-image
2880+0 records in
2880+0 records out
$ dd if=floppy-image of=/dev/fd0H1440
2880+0 records in
2880+0 records out
$
第一個(gè)dd 給軟盤做了一個(gè)完全映象到文件 floppy-image , 第二個(gè)把映象寫到軟盤。 (假設(shè)用戶在第二個(gè)命令前換了軟盤。否則這個(gè)命令對(duì)可能沒用。)
分配磁盤空間
分區(qū)概要
用最好的方式給磁盤分區(qū)不容易,而且,沒有一個(gè)通用的正確方法,這包括很多因素。
傳統(tǒng)的方法是有個(gè)(相對(duì))小的根文件系統(tǒng),包括 /bin , /etc , /dev , /lib , /tmp , 和其他系統(tǒng)啟動(dòng)和運(yùn)行需要的東西。這種方法,根文件系統(tǒng)(在它自己的分區(qū)或硬盤上)是所有系統(tǒng)啟動(dòng)需要的東西。理由是如果根文件系統(tǒng)小而不常用,系統(tǒng)崩潰時(shí)它就不太容易損壞,而且崩潰時(shí)也易于修復(fù)。然后給/usr 目錄樹、用戶主目錄(經(jīng)常在/home )、對(duì)換空間產(chǎn)生單獨(dú)的分區(qū)或使用單獨(dú)的硬盤。分離的用戶主目錄(存用戶文件)在其自己的分區(qū)中易于備份,因?yàn)橐话銦o須備份程序(/usr 中)。網(wǎng)絡(luò)環(huán)境中,這樣可以使多臺(tái)計(jì)算機(jī)共享/usr (例如使用NFS) 這樣每臺(tái)機(jī)器可以節(jié)約數(shù)十、數(shù)百兆的磁盤空間。
多分區(qū)的問題是將整個(gè)磁盤的空閑空間分割成若干小片?,F(xiàn)在,由于磁盤和操作系統(tǒng)已經(jīng)很可靠,許多人更傾向與一個(gè)分區(qū)存所有文件。當(dāng)然,這樣可能比備份、回存小分區(qū)痛苦些。
對(duì)于小硬盤(假設(shè)你不做核心開發(fā)),最好的方法可能是只要一個(gè)分區(qū)。對(duì)于大硬盤,分幾個(gè)大分區(qū)可能更好。尤其在某種情況下出現(xiàn)錯(cuò)誤時(shí)。 (注意這里說的小和大是相對(duì)的,根據(jù)你對(duì)磁盤空間的需求而言。)
如果你有多個(gè)硬盤,你可能想讓根文件系統(tǒng)(包括/usr ) 在一個(gè)上,而用戶主目錄在另一個(gè)上。
最好準(zhǔn)備嘗試幾個(gè)不同的分區(qū)方案(over time, not just while first installing the system)。這有些工作量,因?yàn)檫@其實(shí)是從頭安裝系統(tǒng)若干遍,但這是確認(rèn)正確的唯一方法。
空間要求
你安裝的Linux給出一些對(duì)不同配置所需磁盤空間的指示。單獨(dú)安裝的程序可能也是。這能幫助你計(jì)劃你的磁盤使用,但你應(yīng)該為以后可能的需求保留一些額外空間。
擁護(hù)文件總量基于你的用戶希望。許多人好象想要他們所有可能的文件量,但多多益善。有些人只有很少的文字處理,也許幾兆就夠,而有些人可能需要上GB的空間做圖象處理。
順便說一句,用KB或MB比較文件大小和用MB給出的磁盤空間時(shí),應(yīng)當(dāng)注意這2者的可能的不同。一些硬盤制造商喜歡稱1000字節(jié)為1KB,1000KB為1MB,而計(jì)算機(jī)世界的其他地方都以1024為因數(shù)。因此我的MB硬盤實(shí)際只是330MB硬盤。
對(duì)換空間在5.5章討論。
硬盤分配舉例
我原來有個(gè)109MB的硬盤,現(xiàn)在我用一個(gè)330MB硬盤。我解釋一下我如何分區(qū)這些硬盤并說明為什么。
當(dāng)我的需要和操作系統(tǒng)變化時(shí),我用不同的方法分區(qū)109MB硬盤。我說明2種方案。首先,我曾和Linux一起運(yùn)行MSDOS,為此,我需要大約20MB給MSDOS、C編譯器、編輯器、一些其他工具、我工作的程序、和足夠的空閑空間。給Linux開了10MB對(duì)換分區(qū),其他79MB作為一個(gè)分區(qū)給Linux。我曾試驗(yàn)給出單獨(dú)的根,/usr , 和/home ,但這樣就沒有什么空閑空間干什么有趣的事了。
當(dāng)我不再需要MSDOS,我重新分區(qū),12MB對(duì)換分區(qū),其他是一個(gè)單獨(dú)的文件系統(tǒng)。
從頭分區(qū)是為了玩玩要求自己分區(qū)的一些東西,例如試試不同的Linux,或比較文件系統(tǒng)的速度。當(dāng)沒有這些需要后,就把它作為對(duì)換區(qū)(我喜歡打開好多窗口)。
給Linux增加更多的磁盤空間
給Linux增加更多的磁盤空間很容易,至少在硬件都安裝好后(硬件安裝不在本書所述的范圍)。如果需要,先格式化,然后產(chǎn)生分區(qū)和上面說過的文件系統(tǒng),在/etc/fstab 中加入正確的行使之能自動(dòng)mount。
節(jié)約磁盤空間的提示
節(jié)約磁盤空間的最好提示是不要安裝不必要的程序。許多Linux distributions給出安裝其所帶軟件包某些部分的選擇,分析你的需求你可能發(fā)現(xiàn)好多你并不需要。這會(huì)節(jié)約很多磁盤空間,因?yàn)樵S多程序需要很大空間。即使你需要某部分包或程序,也不一定需要其全部。例如有些在線文檔可能不必要,有些GNU Emacs的Elisp文件, 有些X11的字體,或者有些編程庫(kù)。
如果你不能卸裝包,你可以壓縮。如gzip 或zip 的壓縮程序可以壓縮/解壓文件或文件群。gzexe 系統(tǒng)可以對(duì)用戶透明地壓縮/解壓程序 (沒用的程序被壓縮,當(dāng)被使用時(shí)解壓)。實(shí)驗(yàn)中的DouBle 系統(tǒng)對(duì)程序透明地壓縮文件系統(tǒng)中的所有文件。(如果你熟悉例如Stacker for MS-DOS等產(chǎn)品,原理是一樣的。)
相關(guān)文章
淺談:什么是數(shù)據(jù)驅(qū)動(dòng)編程的詳解
本篇文章是對(duì)什么是數(shù)據(jù)驅(qū)動(dòng)編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05