Linux 管理員手冊(3)--磁碟和其他存貯介質的使用(轉)

gugu99發表於2007-08-10
Linux 管理員手冊(3)--磁碟和其他存貯介質的使用(轉)[@more@]

  安裝和升級系統時,需要對硬碟做很多工作。必須在硬碟上做檔案系統,使檔案能存在其上,併為系統不同的部分保留空間。

  本章說明所有這些初始化工作。通常,一旦你建立了系統,就不必再做這些工作(除了使用軟盤)。如果你要增加一個新硬碟或更好地調整你的硬碟的使用,那麼可能回到這一章。

  管理磁碟的基本任務有:

  格式化磁碟。這為磁碟進入使用做一些工作,比如檢查壞扇區。(現在多數硬碟無須格式化。)

  給硬碟分割槽,如果想用於互相不干擾的幾件事。分割槽的一個原因是要在一個硬碟上存不同的作業系統。另一個原因是將使用者檔案和系統檔案分開,以簡化備份並在系統崩潰時有助於保護系統檔案。

  在每個磁碟或分割槽上建立合適型別的檔案系統,然後檔案就可以在其上產生和存取。在你建立檔案系統前,磁碟對Linux沒有意義。

  將不同的檔案系統安裝起來形成一個單獨的樹結構,按需要可以自動或手工完成。 (手工安裝的檔案系統通常還要手工unmount)

  5章包括虛擬記憶體和磁碟cache的資訊,使用磁碟應該知道這些。

  本章說明對硬碟、軟盤、CDROM和磁帶機應該知道什麼。

  2種裝置

  UNIX及Linux,識別2類裝置:隨機存取的塊裝置(如磁碟)和字元裝置(如磁帶和序列線),有些是序列的,有些是隨機存取的。檔案系統支援的每種看來是個裝置檔案。當讀寫裝置檔案時,資料與裝置聯絡。這樣沒有必要為存取裝置編制特別的程式(程式不直接獲取中斷或讀取串列埠),例如,傳送檔案到印表機,只需:

    $ cat filename > /dev/lp1

  

  注意即使裝置沒有安裝,一般所有裝置檔案都存在。因此有/dev/sda 檔案並不意味著你真的有個SCSI硬碟。有所有的裝置檔案使安裝程式更簡單,也易於增加新硬體(無須再為產生新裝置的裝置檔案找出正確的引數)。

  硬碟

  本節介紹有關硬碟的術語。如果你已經知道這些專案和內容,可以跳過本節。

  硬碟包括一到數片碟片platters, 其一個或兩個面surfaces塗有磁性材料用於記錄資料。每面有一個讀寫頭read-write head用於讀寫資料。碟片有一個共同的軸,典型的旋轉速度是每分鐘3600轉,高效能的硬碟轉速可能更高。磁頭可沿著碟片的半徑移動,磁頭移動加上碟片旋轉可以使詞頭存取磁碟表面的任何一個位置。

  處理器(CPU)和實際磁碟透過磁碟控制器disk controller通訊。這使計算機其他部分不必知道如何使用驅動器,因為不同磁碟的控制器可以做成對計算機其他部分相同的介面。這樣,計算機只要說"嗨,磁碟,給我我要的東西",而不是用一串長而複雜的電訊號來移動磁頭到正確的位置,並等正確的位置到了磁頭下後再做那些不愉快的工作。 (實際上,到控制器的介面仍然很複雜,但比沒有好多了。) 控制器還可以做一些其他的事,比如緩衝,或自動壞扇區替換等。用電訊號控制操作機械部件,

  以上只是理解硬體所需的。還有其他好多工作,比如馬達旋轉磁碟、移動磁頭,但這都與理解硬碟工作原理無關。

  磁碟表面通常被分為同心圓環,叫磁軌tracks,磁軌又被分為扇區sectors。用這樣分來將磁碟定位,用於為檔案定位磁碟空間。要在硬碟上找到給定的位置,可能?quot;3面5道7扇區"。通常所有磁軌有相同的扇區數,但也有硬碟在外圈磁軌放較多的扇區(所有扇區用同樣大小的物理空間,這樣在較長的外圈磁軌可以容納更多的資料)。一般一個扇區容納512位元組資料。磁碟不能處理比一個扇區更小的資料量。

  每個面以相同的方式分為磁軌和扇區。這意味著當一個磁頭在某個磁軌時,其他磁頭也在相應的位置,所有相同位置的磁軌組成柱面cylinder。磁頭從一個磁軌(柱面)移動到另一個需要花時間,所以將經常要在一起存取的資料(如一個檔案)放在一個柱面裡。這改善了效能。當然不可能完全作到,檔案被放在幾個相分離的位置叫碎片fragmented。

  磁碟的面(或頭,實際是一樣的)、柱面、扇區數各不相同,硬碟這些數目叫硬碟引數geometry。硬碟引數通常存在一個特定的、由電池供電的儲存區中,叫CMOS RAM,作業系統在引導啟動或驅動器初始化時可以從那裡得到硬碟引數。

  不幸的是,BIOS 有一個設計限制,就是不能在CMOS RAM中定義大於1024的磁軌數,這對大硬碟來說就太小了。為了克服這個問題,硬碟控制器在磁碟引數上做了一個欺騙,用地址轉換translates the addresses使計算機接受。例如,一個硬碟可能有8個磁頭,2048個磁軌,每磁軌35個扇區。其控制器可以對計算機謊稱它有16個磁頭,1024個磁軌,每磁軌35個扇區,這樣就沒有超過磁軌數的限制,地址轉換將磁頭數減半,磁軌數加倍後傳給硬碟。實際的演算法可能更復雜,因為數量可能不象我們在這裡假設的這麼好(但這不影響我們理解原理)。這個轉換在作業系統來看產生了錯覺,並可能影響作業系統對把所有資料存在相同柱面的企圖受到影響。

  轉換隻是IDE硬碟的問題。SCSI硬碟使用連續的扇區號(即控制器將連續的扇區好轉換成磁頭、柱面、扇區的三引數組),對CPU與控制器的通訊使用完全不同的方法,因此不會有這個問題。注意,計算機可能根本不知道一個SCSI硬碟的實際引數。

  由於Linux經常不知道一個硬碟的真正引數,其檔案系統也不試圖將檔案存在一個柱面裡。而是爭取給一個檔案分配連續編號的山區,這樣能得到類似的效能。對於控制器上有cashe或控制器能自動預取的硬碟,情況將更復雜。

  每個硬碟表現為一個單獨的裝置檔案。通常只能有2-4個IDE硬碟。這就是 /dev/hda , /dev/hdb , /dev/hdc , 和 /dev/hdd 。 SCSI是 /dev/sda , /dev/sdb , 等等。其他硬碟型別有類似的命名約定,更多的資訊見[Anv]。注意硬碟的裝置檔案給出整個硬碟的存取,而不是分割槽(下面討論的),因此如果不小心可能搞亂分割槽或資料。硬碟的裝置檔案只在存取主引導扇(也將在下面討論)時使用。

  軟盤

  軟盤的一面或兩面塗有和硬碟類似的磁性介質。軟盤自己沒有讀寫頭,讀寫頭在驅動器上。軟盤相當於硬碟的一張碟片,但可移動,一個驅動器可以存取不同的軟盤,而硬碟則是一個獨立的單元。

  如同硬碟,一張軟盤也分為磁軌和扇區(軟盤2面上的相同的磁軌組成柱面),但數量要比硬碟少得多。

  軟碟機通常可以使用幾中不同的碟片,例如,一個3.5'軟碟機可以使用720KB和1.44MB的軟盤。因為軟碟機操作有些不同,而作業系統必須知道軟盤的容量,所以軟碟機有許多裝置檔案,每個都與軟碟機和軟盤種類有關。因此,/dev/fd0H1440 是第一個軟碟機(fd0),必須是3.5'軟碟機,使用3.5'高密度軟盤(H),容量是1440KB(1440),即普通的3.5'HD軟盤。軟盤裝置的命名約定見[Anv]。

  軟碟機的名字是複雜的,因此Linux有一個特定的軟碟機裝置型別,能自動檢測軟碟機中軟盤的種類。它使用不同的軟盤型別試圖讀取新插入的軟盤的第一個扇區,直到找到正確的一個。這自然要求軟盤是已經格式化過的。自動裝置叫/dev/fd0 、/dev/fd1 等。

  存取軟盤的自動裝置的引數可用程式setfdprm 設定。這可使你使用不是通常容量的軟盤,例如有非標準扇區數的軟盤,或自動檢測由於某種原因失敗或適當的裝置檔案丟失。

  Linux除了所有標準的,還能處理許多非標準的軟盤格式。這有時需要特殊的格式化程式。我們現在先跳過這些軟盤格式,同時你可以檢視/etc/fdprm 檔案。它定義了setfdprm 識別的設定。

  作業系統必須知道軟碟機何時換了軟盤,例如,以免使用上一張軟盤的cache資料。不幸的是,當用於此的訊號線斷了或不好時,當在MSDOS中使用時,這並不總有效。如果你曾遇到過軟碟機的這種怪異的問題,可能是這個原因。解決這個問題的唯一方法是修理軟碟機。

  CD-ROM

  CD-ROM驅動器使用一個光學可讀的塑膠塗布的碟片。資訊記錄在碟片表面 的從中心的邊沿的螺旋型小坑上。驅動器發出一束鐳射來讀盤。當鐳射射到小坑上,鐳射以一種方式反射;當它射到光滑表面上,它以另一種方式反射。這很容易地編碼成bit,組成資訊。其他很容易,不過是機械。

  CD-ROM驅動器比硬碟慢。典型的硬碟的平均尋道(seek)時間小於15毫秒,而快速的CD-ROM驅動器要花零點幾秒。實際資料傳輸率則相當快,在數百KB/s。速度慢使CDROM驅動器不能代替硬碟使用 (有些Linux distributions提供"live" CD-ROM檔案系統,使之不必複製檔案到硬碟,使安裝簡單並節約了許多硬碟空間),雖然是可能的。要安裝新軟體,CD-ROM很好,因為在安裝時速度並非最重要的。

  有多種方法在CDROM上安排資料。最流行的是國際標準化組織定義的ISO9660。這個標準定義了一個最小的檔案系統,甚至比MSDOS更粗糙。這樣,由於它是這麼小,所有作業系統都可以將它對映到自己的系統。

  不同UNIX不能使用ISO9660檔案系統,因此開發了對這個標準的一個增強,叫Rock Ridge增強。 Rock Ridge允許長檔名、符號連線和許多其他優點,使CD-ROM更象UNIX檔案系統。同時,Rock Ridge檔案系統仍然是一個有效的ISO9660檔案系統,使非UNIX一樣可以使用。 Linux同時支援ISO9660和Rock Ridge增強,增強被自動識別和使用。

  檔案系統只是一部分,許多CD-ROM包含的資料需要特定的程式存取,而多數程式不能執行在Linux下 (當然,可能執行在Linux的MSDOS模擬器dosemu下)。

  CD-ROM驅動器透過相關的裝置檔案存取。有多種方法將CDROM連線到計算機:SCSI、音效卡或EIDE。要完成這的硬體hacking工作超出了本書的範圍,但連線方法決定了裝置檔案。指導見[Anv]

  磁帶

  磁帶驅動器使用磁帶,類似 音樂用的盒帶。磁帶是序列的,即如果要得到給定部分的資料,必須經過所有部分。磁碟可以隨機存取,即可以直接跳到磁碟上的某個部分。序列存取的磁帶當然慢了。

  另外一方面,磁帶相當便宜,因為無須快速。也容易做得很長,因此可以容納大量的資料。這使磁帶很適於如歸檔、備份等無須高速的、但需要低成本和大容量的事情。

  格式化

  格式化在磁介質上寫用於標記磁軌和扇區的標誌的過程。磁碟格式化前,其磁表面是完成的一塊。格式化後,混沌變為秩序,建立的磁軌,劃分了扇區。實際細節並非準確地這樣,但重要的是:磁碟不經過格式化是不能使用的。

  這裡術語有些模糊:MS-DOS中,格式化(format)這個詞還包括了產生檔案系統的過程(下面將討論的)。這兩個過程經常一起使用,尤其是軟盤。當必須區分時,真正的格式化被稱為低階格式化low-level formatting,而建立檔案系統被成為高階格式化high-level formatting。在UNIX圈中,這兩者叫格式畫format和建立檔案系統make a filesystem,本書中也這樣稱。

  IDE硬碟和一些SCSI硬碟實際上廠商已經做了格式化,並無須重複;因為多數人無須關心它。實際上,格式化硬碟可能反而不好,比如因為硬碟可能需要用特定的方法格式化使壞扇區被自動替換。

  磁碟經常需要特定的程式來格式化,因為驅動器的格式化邏輯的介面每個驅動器都不一樣。格式化程式經常在控制器BIOS上,或用MSDOS程式提供,這都不太容易在Linux中使用。

  格式化中可能會發現磁碟的壞點,叫壞塊bad blocks or bad sectors。這有時由驅動器自己處理。但有時,如果壞塊太多,需要一些工作來避免使用磁碟的這部分。 The logic to do this is built into the filesystem; 下面將說明如何增加這些資訊到檔案系統。另外,產生一個只覆蓋這些壞的部分的小分割槽也是一個辦法。如果壞區較大,這可能是個好辦法,因為檔案系統有時難以處理大量的壞區。

  軟盤格式化使用fdformat 。軟盤裝置使用給定的引數,例如下面的命令在第一個軟碟機中格式化一張高密度3.5'軟盤:

    $ fdformat /dev/fd0H1440

  

    $ setfdprm /dev/fd0 1440/1440

  

  軟盤不分割槽。這沒有技術原因,只因為太小,沒有必要。CDROM一般也不分割槽,因為作為一個大盤更易於使用,而且很少有多作業系統的需要。

  MBR(主開機記錄), 啟動扇區和分割槽表

  一個硬碟如何分割槽的資訊存在它的第一個扇區(即第一面第一道第一扇區)。這個第一扇區是硬碟的主開機記錄(MBR);這是計算機啟動時BIOS讀入和啟動的扇區。主開機記錄包括一段小程式,讀入分割槽表,檢查哪個分割槽是活動分割槽(即啟動分割槽),並讀入活動分割槽的第一個扇區:該分割槽的啟動扇區(MBR也是啟動扇區,只不過因為其特殊地位,所以使用特殊的名字)。這個啟動扇區包括另一個小程式,讀入這個分割槽(假設是可啟動的)上作業系統的第一個部分,然後啟動它。

  這個分割槽方案不是內建於硬體和BIOS的,只是許多作業系統遵循的約定。並非所有的作業系統都遵循這個約定,也有例外。有些作業系統支援分割槽,但他們佔領硬碟上的一個分割槽,然後使用他們自己的內部分割槽方法管理這個分割槽。較新的作業系統可以和其他作業系統和平共處(包括Linux),而無需特殊的措施,但不支援分割槽的作業系統無法在同一硬碟上與其他作業系統共存。

  為安全預防,最好先在紙上寫下分割槽表,這樣在錯誤發生時不會丟失你的檔案。(可以使用fdisk 修復壞的分割槽表)。 )相關資訊可用fdisk -l 命令給出:

    $ fdisk -l /dev/hda

  

  為克服這個設計問題,發明了擴充套件分割槽。這個方法允許將基本分割槽分為若干子分割槽,因而被子分割槽的基本分割槽稱為擴充套件分割槽,而子分割槽稱為邏輯分割槽,他們的表現類似基本分割槽 ,但產生方法不同。他們之間沒有速度差別。

  硬碟的分割槽結構可能類似。這個硬碟被分為3個基本分割槽,第二個被分為2個邏輯分割槽。部分硬碟根本沒有分割槽。硬碟是一個整體,每個基本分割槽有一個啟動扇區。

  分割槽種類

  分割槽表(MBR和擴充套件分割槽裡都有)中,對每個分割槽,有一個位元組指出分割槽種類。這試圖確定使用該分割槽的作業系統,或用於何作業系統。其目的是避免2個作業系統使用同一分割槽。可實際上,作業系統並不真的注意分割槽種類位元組;例如,Linux根本不管它是什麼。較壞的情況是,有些作業系統錯誤地使用它:例如有些版本的DR-DOS忽略了它的最高位(MSB),而其他一些系統則不是。

  沒有一個標準化組織定義分割槽種類位元組每個值的意義,但一些共同接受的值包括在表 4.1中。相同的列表可以透過Linux的fdisk 命令得到。

  給硬碟分割槽

  有許多產生和刪除分割槽的程式。許多作業系統自帶,最好使用其自帶的,除非要做一些它不能作到的。許多這種程式叫fdisk , 包括Linux, 或其變種。 Linux fdisk 的使用細節可見其Man手冊。 cfdisk 命令類似fdisk , 但有更好的使用者介面(全屏的)。

  使用IDE硬碟時,啟動分割槽(帶可啟動核心映象檔案的分割槽)必須全在前1024個柱面內。這是因為硬碟透過BIOS啟動(在系統進入保護模式前),而BIOS不能處理多於1024柱面。有時也可能使用部分在前1024柱面的啟動分割槽,這要求所有用BIOS讀入的檔案都在前1024柱面內。由於這難與安排,因此這是個很差的主意;你不可能知道什麼時候核心升級或磁碟碎片整理會導致系統無法啟動。因此,應該確認你的啟動分割槽完全在前1024柱面內。

  事實上,一些新版的BIOS和IDE硬碟可以處理多於1024柱面。如果你有這樣一個系統,你可以忘卻這個問題;如果你不能確認,還是把啟動分割槽放在前1024柱面內。

  每個分割槽擁有一塊連續的扇區。因為Linux檔案系統使用1 kB的塊,即2個扇區,所以奇數個扇區會導致最後一個扇區不能使用,這不會有什麼問題,但不好,有些版本的 fdisk 會對此給出警告。

  改變分割槽大小一般要求首先備分此分割槽想保留的所有東西(為防萬一,最好備分整個硬碟),然後刪除此分割槽,產生新分割槽,最後回存所有東西到新分割槽。如果是擴大分割槽,你可能需要調整相鄰分割槽的大小(並備分、回存)。

  由於改變分割槽大小是如此痛苦,最好一次就確定。或擁有一個有效而易用的備分系統。如果你透過無須太多人工干預的介質安裝(例如CDROM,而不是軟盤),那麼開始可以比較容易地玩玩各種設定。因為你無須備分什麼資料,改幾次分割槽大小不會太過痛苦。

  有個MSDOS的程式叫fips , 可以無須備分和回存地改變MSDOS分割槽的大小, 但對其他檔案系統,備分回存還是必須的。

  裝置檔案和分割槽

  每個分割槽和擴充套件分割槽有自己的裝置檔案。這些檔案的命名規定是在整個盤的名字加分割槽號,並約定1-4是基本分割槽(不管真的有幾個基本分割槽),5-8是邏輯分割槽(不管它在哪個基本分割槽中)。例如,/dev/hda1 是第一個IDE硬碟的第一個基本分割槽,而/dev/sdb7 是第二個SCSI硬碟的第三個擴充套件分割槽。裝置列表 [Anv]給出更詳細的資訊。

  檔案系統

  什麼是檔案系統?

  檔案系統是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構;即在磁碟上組織檔案的方法。也指用於儲存檔案的磁碟或分割槽,或檔案系統種類。因此,可以說"我有2個檔案系統"意思是他有2個分割槽,一個存檔案,或他用 "擴充套件檔案系統",意思是檔案系統的種類。

  磁碟或分割槽和它所包括的檔案系統的不同是很重要的。少數程式(包括最有理由的產生檔案系統的程式)直接對磁碟或分割槽的原始扇區進行操作;這可能破壞一個存在的檔案系統。大部分程式基於檔案系統進行操作,在不同種檔案系統上不能工作。

  一個分割槽或磁碟能作為檔案系統使用前,需要初始化,並將記錄資料結構寫到磁碟上。這個過程就叫建立檔案系統。

  大部分UNIX檔案系統種類具有類似的通用結構,即使細節有些變化。其中心概念是超級塊superblock, i節點inode, 資料塊data block,目錄塊directory block, 和間接塊indirection block。超級塊包括檔案系統的總體資訊,比如大小(其準確資訊依賴檔案系統)。 i節點包括除了名字外的一個檔案的所有資訊,名字與i節點數目一起存在目錄中,目錄條目包括檔名和檔案的i節點數目。 i節點包括幾個資料塊的數目,用於儲存檔案的資料。 i節點中只有少量資料塊數的空間,如果需要更多,會動態分配指向資料塊的指標空間。這些動態分配的塊是間接塊;為了找到資料塊,這名字指出它必須先找到間接塊的號碼。

  UNIX檔案系統通常允許在檔案中產生孔(hole) (用lseek ; 請看手冊), 意思是檔案系統假裝檔案中有一個特殊的位置只有0位元組,但沒有為這檔案的這個位置保留實際的磁碟空間(這意味著這個檔案將少用一些磁碟空間)。這對小的二進位制檔案經常發生,Linux共享庫、一些資料庫和其他一些特殊情況。 (孔由儲存在間接塊或i節點中的作為資料塊地址的一個特殊值實現,這個特殊地址說明沒有為檔案的這個部分分配資料塊,即,檔案中有一個孔。)

  孔有一定的用處。在筆者的系統中,一個簡單的測量工具顯示在200MB使用的磁碟空間中,由於孔,節約了大約4MB。在這個系統中,程式相對較少,沒有資料庫檔案。有關這個測量工具的細節請看附錄 A.

  Filesystems galore

  Linux支援多種檔案系統。下面是最重要的幾個:

  minix

  最老的,相信是最可靠的,但缺少特色(有些沒有時間標記,檔名最長30個字元),能力有侷限(每個檔案系統最多64MB)。

  xia

  minix檔案系統的一個修正版本,提升了檔名和檔案系統大小的侷限,但沒有新的特色。不太流行,但據說工作得很好。

  ext2

  最好的Linux自己的檔案系統,也是當前最通用的。其設計易於向上相容,所以新版的檔案系統程式碼無需重做已有的檔案系統。

  ext

  ext2的老版,且不向上相容。難於用新版安裝程式安裝,大部分人都改用ext2。

  另外,支援多種其他現存的外圍檔案系統,很容易與其他外圍檔案系統交換檔案。這些外圍檔案系統好象是自己的一樣,除了可能缺少一些一般UNIX的特徵,或有些不同的侷限。

  msdos

  與MSDOS、OS/2等的FAT檔案系統相容。

  umsdos

  Linux下的擴充套件msdos檔案系統驅動,支援長檔名、所有者、允許許可權、連線和裝置檔案。允許一個普通的msdos檔案系統用於Linux,而無須為Linux建立單獨的分割槽。

  iso9660

  標準CDROM檔案系統,通用的Rock Ridge增強,允許長檔名。

  nfs

  網路檔案系統,允許多臺計算機之間共享檔案系統,易於從所有這些計算機上存取檔案。

  hpfs

  OS/2檔案系統。

  sysv

  SystemV/386, Coherent, 和Xenix檔案系統。

  根據情況選擇檔案系統。如相容性或其他原因必需使用非Linux檔案系統,那就必須用。如果可以自由選擇,可能最明智的選擇是ext2,因為它擁有全部特徵而無須忍受效能缺陷。

  還有proc檔案系統, 一般在/proc 目錄, 它不是一個真正的檔案系統,雖然好象是。proc檔案系統使使用者易於存取全部核心資料結構,比如程式列表。它使這些資料結構看起來象個檔案系統,且此檔案系統可以用所有一般的檔案工具操作。例如,要得到所有程式的列表,可以使用命令

  $ 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

$

  (可能有些檔案與程式不符。上面的例子被簡短了。)

  注意雖然叫檔案系統,proc檔案系統沒有一個部分與磁碟有關,它只在核心映象中存在。任何人任何時候想看proc檔案系統的任何部分,核心使它看起來好象這部分在什麼地方存在(雖然沒有)。因此,雖然/proc/kcore 檔案有好多兆位元組,但它根本沒用任何磁碟空間。

  應該用哪個檔案系統?

  一般沒有什麼理由用許多不同的檔案系統。當前,ext2fs是最流行的,可能是最明智的選擇。根據記錄結構、速度、(感覺的)可靠性、相容性和其他不同的理由,適當地使用其他檔案系統。個別情況需要個別決定。

  建立檔案系統

  用mkfs 命令建立檔案系統,即初始化。實際上,對每個不同種類的檔案系統有一個單獨的程式。 mkfs 只是為了建立不同檔案系統種類確定執行不同程式的一個前端。用-t fstype選項選擇種類。

  被mkfs 呼叫的程式有不同的命令列介面。最通用和最重要的選項如下,細節請看手冊。

  -t fstype

  選擇檔案系統種類。

  -c

  查詢壞塊,初始化壞塊列表。

  -l filename

  從檔案filename讀入壞塊列表。

  用如下命令在軟盤上產生ext2檔案系統:

  $ 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選項不進行確認,即壞塊檢查)。然後用badblocks 查詢壞塊, 輸出定向到檔案bad-blocks。最後,產生檔案系統,壞塊列表由檔案badblocks 初始化。

  -c選項可以與mkfs 一起使用,而無須badblocks 和一個單獨的檔案。如下:

  $ 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比用單獨使用badblocks 更方便, 但建立檔案系統後檢查,badblocks 是必要的。

  在硬碟或分割槽上準備檔案系統的過程和軟盤是一樣的,除了無須格式化。

  Mount和unmount

  一個檔案系統可以使用之前,必須mount。作業系統然後做一些記錄以確認正常。因為UNIX所有的檔案在一個目錄樹中, mount操作的結果使新的檔案系統的內容好象在某個已經mount的檔案系統的一個已經存在的子目錄中。

  上面的mount可能使用如下命令:

  $ mount /dev/hda2 /home

$ mount /dev/hda3 /usr

$

  mount 命令使用2個引數。第一個是與包括檔案系統的磁碟或分割槽相關的裝置檔案。第二個是要mount到的目錄。 mount以後,這2個檔案系統的內容好象是/home 和/usr 目錄。這樣就可以說:/dev/hda2 被mount到 /home , /usr 也同樣。要看每個檔案系統,就看其被安裝的目錄,好象它就是在那裡。注意裝置檔案的區別,/dev/hda2 , 和安裝到的目錄/home 。裝置檔案給出硬碟原始內容的存取,安裝到的目錄給出磁碟上檔案的存取。安裝到的目錄叫安裝點。

  Linux支援許多檔案系統。mount 會試著猜測檔案系統種類。也可以使用-t fstype 選項直接定義種類;這有時是必要的,因為自檢測mount 並非總能成功。例如要mount一個MSDOS軟盤,可以用如下命令:

  $ mount -t msdos /dev/fd0 /floppy

$

  安裝點目錄不必是空的,但必須存在。其中的所有檔案當檔案系統mount後將不可用名字存取(已經開啟的檔案將繼續可存取。有其他目錄硬連線的檔案可以透過那些名字存取)。這沒有壞處,反而可能更有用。例如,有人喜歡將/tmp 和/var/tmp 作為同義,將/tmp 作為/var/tmp 的符號連線。系統啟動時,在/usr 檔案系統被mount之前,使用駐留在根檔案系統的 /var/tmp 目錄。當/usr 被mount上以後,根檔案系統上的/var/tmp 將不可用,如果根檔案系統上不存在 /var/tmp ,那麼在mount上/var 之前將不可能使用暫存檔案。

  如果不打算在一個檔案系統上寫任何東西,可以使用mount 的-r開關做一個只讀mount。這將使核心停止任何對此檔案系統的寫要求,也將停止核心的對i節點的檔案存取時間的更新。只讀mount對不可寫介質是必要的,例如CDROM。

  細心的讀者可能已經注意到一個小的邏輯問題。第一個檔案系統(叫根檔案系統,因為它包含根目錄)如何mount,因為很明顯,它不能mount到另一個檔案系統? 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-- 如果根檔案系統不能mount,系統將不能啟動。 The name of the filesystem that is magically mounted as root 被編譯進核心,或用LILO或rdev 設定。

  根檔案系統通常先被只讀mount。然後啟動手稿執行fsck 校驗它的有效性,如果沒有問題,將re-mount它,使之可寫。fsck 不能執行於一個已mount的檔案系統,因為fsck 執行時,任何檔案系統的改變將導致錯誤。因為根檔案系統在被檢查時是隻讀,fsck 可以無慮地修復任何問題,因為re-mount 操作將重新整理檔案系統在記憶體中的所有資料。

  在有其他檔案系統的許多系統中,啟動時要自動mount,可以在/etc/fstab 檔案中定義:檔案格式細節請參考fstab 的手冊頁。 mount特別的檔案系統的特別細節依賴於許多因素,可以根據需要由每個管理員設定。 When the chapter on booting is finished, you may read all about it there.

  當一個檔案系統不需要再mount著,可以用umount . umount 加一個引數unmount它,引數可以是裝置檔案或安裝點。例如,要unmount上面例子中的目錄,可以用:

  $ umount /dev/hda2

$ umount /usr

$

  要了解使用這個命令的更多的說明,參閱手冊。注意:記住unmount已經mount的軟盤, 而不能僅僅將軟盤彈出軟碟機!由於磁碟緩衝,在你unmount軟盤之前無須回寫,因此過早取出軟盤將導致內容不正確。只從軟盤上讀還不要緊,如果寫,就可能發生災難性的損失。

  mount和umount需要超級擁護特權,即只有root 使用者可以做。原因是:如果任何使用者都可以mount軟盤到任何目錄,那麼很容易用軟盤做,比如,用特洛伊木馬替換/bin/sh , 或者其他常用的程式。但是允許使用者使用軟盤經常又是必要的,有幾種方法:

  給使用者root 口令,很明顯這對安全不利,但是最簡單的方法。如果沒有安全要求,這個方法很好,比如在非網路的、個人系統上。

  使用一個程式比如sudo 允許擁護使用mount。這同樣對安全不利,但沒有直接給任何人超級使用者特權。

  讓使用者使用mtools , 這是一個利用MSDOS檔案系統的軟體包,無須mount。如果是MSDOS軟盤這樣做很好,否則不好。

  在/etc/fstab 中用合適的選項列出軟碟機裝置和允許的安裝點。

  最後一個選擇可以在/etc/fstab 檔案中加類似下面的一行來完成:

  /dev/fd0 /floppy msdos user,noauto 0 0

  各列分別是:要mount的裝置檔案,要安裝到的目錄,檔案系統型別,選項,備份頻率(用於dump ) 和fsck 次序(定義啟動時檔案系統被檢查的次序,0表示不檢查)。

  noauto選項使系統啟動是不自動mount(即, it stops mount -a from mounting it)。 user允許任何使用者mount這個檔案系統,並且,由於安全原因,不允許執行程式(normal or setuid) and interpretation of device files from the mounted filesystem。這樣,任何使用者都可以用如下命令mount一個msdos檔案系統的軟盤:

  $ mount /floppy

$

  軟盤可以用相關的umount 被unmount。

  如果想提供多種軟盤的存取,需要給出多個安裝點。對每個安裝點的設定可以不同。例如,提供MSDOS和ext2檔案系統的存取,可以在/etc/fstab 檔案中加如下行:

  /dev/fd0 /dosfloppy msdos user,noauto 0 0

/dev/fd0 /ext2floppy ext2 user,noauto 0 0

  對於MSDOS檔案系統(不僅是軟盤),可能需要用uid, gid,和umask 檔案系統選項來限制存取許可權,請看mount 手冊頁。如果不小心,mount一個MS-DOS檔案系統將給予任何使用者至少是讀許可權,這可不是一個好主意。

  用fsck檢查檔案系統完整性

  檔案系統很複雜,因此易於發生錯誤。可以用fsck 命令檢查檔案系統是否正確和有效。它可以根據指令修復找到的小錯誤,並將未修復錯誤報告使用者。幸運的是,檔案系統的程式碼非常有效,所以根本極少出現問題,並且問題通常原因是電源失敗、硬體失敗、或操作錯誤,例如沒有正常關閉系統。

  大多數系統設定為啟動時自動執行fsck ,因此任何錯誤將在系統使用前被檢測到(並根據希望修正)。使用有錯誤的檔案系統可能使問題變得更壞:如果資料結構有問題,使用這個檔案系統可能使之更糟,導致更多的資料丟失。當然,在大的檔案系統上執行fsck 會花一定的時間,如果系統正常關閉,幾乎從不發生錯誤,因此有一些方法可以不進行檢查。如果檔案/etc/fastboot 存在,就不檢查。另外,如果ext2檔案系統在超級快中有一個特定的標記告知該檔案系統在上次mount後沒有正常unmount. 如果標記指出unmount正常完成(假設正常unmount指出沒問題),e2fsck (fsck 的ext2檔案系統版) 就不檢查系統。/etc/fastboot 是否影響系統依賴於你的啟動手稿,但ext2標記則在你使用e2fsck 時發生作用--基於一個e2fsck 選項(參閱e2fsck 手冊頁)

  自動檢查只對啟動時自動mount的檔案系統發生作用。使用fsck 手工檢查其他檔案系統,比如軟盤。

  如果fsck 發現為修復的問題,你需要深入瞭解檔案系統的一般工作原理和有問題的檔案系統的細節,或好的備份。最後一個辦法容易(雖然冗長)安排,如果你自己不知道,有時可以透過朋友、Linux新聞組、電子郵件列表或其他支援源安排。我很想告訴你更多,但我對這的學習和實踐也並不多。Theodore T'so的debugfs 程式應該有用。

  fsck 只能執行於未mount的檔案系統,不要用於已mount的檔案系統(除了啟動時的只讀根檔案系統)。這是因為它存取原始磁碟,在作業系統不知道的情況下修改檔案系統。 There will be trouble, if the operating system is confused.

  用badblocks檢查磁碟錯誤

  應該週期性地用badblocks 命令檢查壞塊它輸出找到的所有壞塊的編號的列表。列表給fsck 記錄在檔案系統資料結構中,使作業系統儲存資料時不使用這些壞塊。舉例:

  $ 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報告一個塊已經使用,e2fsck 將試著將此塊移到其他地方。如果該塊真的壞了,而不是在壞塊邊緣,檔案內容可能丟失。

  Fighting fragmentation

  檔案寫到磁碟時,不一定在連續的塊中。沒在連續塊中的檔案叫碎片。因為磁碟的讀寫頭回更多地移動,讀碎片檔案會花較長的時間。雖然如果有好的讀前緩衝系統不會有什麼問題,但最好還是避免碎片。

  Ext2檔案系統試圖使碎片最少,即使不能將一個檔案的所有塊存在連續扇區中,也儘量靠近。 Ext2通常有效地安排裡檔案其他塊最近的空閒塊,因此很少需要關心碎片問題。 Ext2檔案系統有一個消除碎片程式,請看參考書目中的 [TV]。

  有許多MSDOS消碎片程式在檔案系統中移動塊以消除碎片。其他一些檔案系統,消碎片必須透過備份-重產生-回存檔案系統來完成。對於所有檔案系統,消碎片應該備份檔案系統,因為很多原因可能在消碎片過程中導致錯誤。

  對所有檔案系統的其他工具

  一些其他工具對管理檔案系統有用。 df (Disk Free)顯示一個或多個檔案系統的空閒磁碟空間。 du (Disk Usage)顯示一個目錄和其內的所有檔案使用了多少磁碟空間。這用於發現磁碟空間浪費。

  sync 強制將磁碟緩衝的所有未寫塊寫入磁碟(見 5.6)。這一般無須手工完成,由守護程式update 自動完成。這在有些情況下很有用,例如,如果update 或其輔助程式bdflush 死了,或你不能等執行update 必須馬上 關閉電源。

  對ext2檔案系統的其他工具

  除了產生檔案系統的mke2fs 和檢查檔案系統的e2fsck 直接或透過與檔案系統型別無關的前端存取外,Ext2檔案系統還有幾個有用的工具。

  tune2fs 調整檔案系統引數。一些有趣的引數有:

  最大mount數。當檔案系統被mount過多少次以後,即使標誌是乾淨的,e2fsck 強制檢查。對用於開發或測試的系統,應該降低這個限制數。

  最大檢查間隔。到達這個間隔時間,即使標誌是乾淨的,e2fsck 強制檢查。如果檔案系統不是經常mount,可以不使能這個功能。

  保留給root的塊數。Ext2給root保留一些塊,這樣如果檔案系統滿了,還可能無須刪除任何東西做系統管理。保留量確省是5%,這在大多數磁碟上不會造成浪費。當然,軟盤沒有理由保留塊。

  參閱tune2fs 手冊頁

  dumpe2fs 顯示一個ext2檔案系統的資訊,大部分來源於超級塊。有些輸出資訊是技術性的,要求對檔案系統工作的理解(見附錄 ), 但許多即使是一般管理員是也易於理解的。

  debugfs 是一個檔案系統偵錯程式。它允許直接存取磁碟上的檔案系統資料結構,可用於修復fsck 不能自動修復的磁碟。它也可用於恢復被刪除的檔案。但是,debugfs 非常要求你理解你所幹的事,錯誤的理解和操作將破壞你的所有資料。

  dump 和restore 可用於備份一個ext2檔案系統。它們是傳統UNIX備份工具的ext2版。關於更有關備份的資訊見 9章。

  沒有檔案系統的磁碟

  並非所有磁碟或分割槽都作為檔案系統使用。例如對換分割槽,就沒有檔案系統。許多軟盤作為磁帶模擬使用,所以tar 或其他檔案可以直接寫到原始磁碟,而不是檔案系統。Linux啟動軟盤不包括檔案系統,只是原始核心。

  不用檔案系統的優點是有更多的磁碟可用空間,因為檔案系統需要一些記錄。也更容易與其他系統相容;例如tar 檔案格式在所有系統上相同,而檔案系統則在大多數系統上不同。如果需要,你會很快使用沒有檔案系統的磁碟。可啟動的 Linux軟盤無需檔案系統,雖然有也可能。

  使用原始磁碟的一個原因是做映象複製。比如,如果磁碟包含部分損壞的檔案系統,那麼在修復前做一個完全複製是個好主意,因為如果你修錯了,可以重來。做映象複製的一個方法是用 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

$

  第一個dd 給軟盤做了一個完全映象到檔案 floppy-image , 第二個把映象寫到軟盤。 (假設使用者在第二個命令前換了軟盤。否則這個命令對可能沒用。)

  分配磁碟空間

  分割槽概要

  用最好的方式給磁碟分割槽不容易,而且,沒有一個通用的正確方法,這包括很多因素。

  傳統的方法是有個(相對)小的根檔案系統,包括 /bin , /etc , /dev , /lib , /tmp , 和其他系統啟動和執行需要的東西。這種方法,根檔案系統(在它自己的分割槽或硬碟上)是所有系統啟動需要的東西。理由是如果根檔案系統小而不常用,系統崩潰時它就不太容易損壞,而且崩潰時也易於修復。然後給/usr 目錄樹、使用者主目錄(經常在/home )、對換空間產生單獨的分割槽或使用單獨的硬碟。分離的使用者主目錄(存使用者檔案)在其自己的分割槽中易於備份,因為一般無須備份程式(/usr 中)。網路環境中,這樣可以使多臺計算機共享/usr (例如使用NFS) 這樣每臺機器可以節約數十、數百兆的磁碟空間。

  多分割槽的問題是將整個磁碟的空閒空間分割成若干小片。現在,由於磁碟和作業系統已經很可靠,許多人更傾向與一個分割槽存所有檔案。當然,這樣可能比備份、回存小分割槽痛苦些。

  對於小硬碟(假設你不做核心開發),最好的方法可能是隻要一個分割槽。對於大硬碟,分幾個大分割槽可能更好。尤其在某種情況下出現錯誤時。 (注意這裡說的小和大是相對的,根據你對磁碟空間的需求而言。)

  如果你有多個硬碟,你可能想讓根檔案系統(包括/usr ) 在一個上,而使用者主目錄在另一個上。

  最好準備嘗試幾個不同的分割槽方案(over time, not just while first installing the system)。這有些工作量,因為這其實是從頭安裝系統若干遍,但這是確認正確的唯一方法。

  空間要求

  你安裝的Linux給出一些對不同配置所需磁碟空間的指示。單獨安裝的程式可能也是。這能幫助你計劃你的磁碟使用,但你應該為以後可能的需求保留一些額外空間。

  擁護檔案總量基於你的使用者希望。許多人好象想要他們所有可能的檔案量,但多多益善。有些人只有很少的文書處理,也許幾兆就夠,而有些人可能需要上GB的空間做圖象處理。

  順便說一句,用KB或MB比較檔案大小和用MB給出的磁碟空間時,應當注意這2者的可能的不同。一些硬碟製造商喜歡稱1000位元組為1KB,1000KB為1MB,而計算機世界的其他地方都以1024為因數。因此我的MB硬碟實際只是330MB硬碟。

  對換空間在5.5章討論。

  硬碟分配舉例

  我原來有個109MB的硬碟,現在我用一個330MB硬碟。我解釋一下我如何分割槽這些硬碟並說明為什麼。

  當我的需要和作業系統變化時,我用不同的方法分割槽109MB硬碟。我說明2種方案。首先,我曾和Linux一起執行MSDOS,為此,我需要大約20MB給MSDOS、C編譯器、編輯器、一些其他工具、我工作的程式、和足夠的空閒空間。給Linux開了10MB對換分割槽,其他79MB作為一個分割槽給Linux。我曾試驗給出單獨的根,/usr , 和/home ,但這樣就沒有什麼空閒空間幹什麼有趣的事了。

  當我不再需要MSDOS,我重新分割槽,12MB對換分割槽,其他是一個單獨的檔案系統。

  從頭分割槽是為了玩玩要求自己分割槽的一些東西,例如試試不同的Linux,或比較檔案系統的速度。當沒有這些需要後,就把它作為對換區(我喜歡開啟好多視窗)。

  給Linux增加更多的磁碟空間

  給Linux增加更多的磁碟空間很容易,至少在硬體都安裝好後(硬體安裝不在本書所述的範圍)。如果需要,先格式化,然後產生分割槽和上面說過的檔案系統,在/etc/fstab 中加入正確的行使之能自動mount。

  節約磁碟空間的提示

  節約磁碟空間的最好提示是不要安裝不必要的程式。許多Linux distributions給出安裝其所帶軟體包某些部分的選擇,分析你的需求你可能發現好多你並不需要。這會節約很多磁碟空間,因為許多程式需要很大空間。即使你需要某部分包或程式,也不一定需要其全部。例如有些線上文件可能不必要,有些GNU Emacs的Elisp檔案, 有些X11的字型,或者有些程式設計庫。

  如果你不能卸裝包,你可以壓縮。如gzip 或zip 的壓縮程式可以壓縮/解壓檔案或檔案群。gzexe 系統可以對使用者透明地壓縮/解壓程式 (沒用的程式被壓縮,當被使用時解壓)。實驗中的DouBle 系統對程式透明地壓縮檔案系統中的所有檔案。(如果你熟悉例如Stacker for MS-DOS等產品,原理是一樣的。)

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

相關文章