Linux 基礎學習篇 - Fedora Core 4

第八章、 Linux 磁碟與檔案系統管理 - for Fedora Core 4

Linux 的磁碟掛載等特色,以及檔案系統 (filesystem) 的介紹

最近更新時間: 2006/06/28

本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!

我們在前面的檔案權限介紹的章節當中,提到很多的權限與屬性的觀念,那麼接下來要瞭解的是, 這些屬性是記錄在硬碟的那個地方?這裡就要特別瞭解到 Linux 檔案系統( filesystem )是如何記錄檔案, 與檔案是如何被讀取的囉!而要瞭解整個檔案系統的觀念,就不能不知道硬碟的組成元件! 所以,在這個章節當中,我們由最基礎的硬碟組成元件介紹起,並介紹 inode 與連結檔等基本知識, 以及如何利用開機即可掛載的方式來使我們的各個 partition 可以在開機時就已經進行好掛載的動作喔!

認識 EXT2 檔案系統

既然這個章節主要在探討 Linux 的磁碟檔案系統,所以我們當然就需要先來瞭解一下硬碟是個什麼東西啦! 首先,我們就來看一看硬碟的物理組成,瞭解了物理組成之後,再來說明一下怎麼樣進行硬碟的分割 (partition) 吧!

硬碟物理組成:

就硬碟的物理元件來說,硬碟其實是由許許多多的圓形硬碟盤所組成的, 依據硬碟盤能夠容納的資料量,而有所謂的單碟 (一塊硬碟裡面只有一個硬碟盤) 或者是多碟 (一塊硬碟裡面含有多個硬碟盤)的硬碟。在這裡我們以單一個硬碟盤來說明,硬碟盤可由底下的圖形來示意:

硬碟盤示意圖
圖一、硬碟盤示意圖

磁柱示意圖
圖二、磁柱示意圖

首先,硬碟裡面一定會有所謂的磁頭 ( Head ) 在進行該硬碟盤上面的讀寫動作,而磁頭是固定在機械手臂上面的,機械手臂上有多個磁頭可以進行讀取的動作。 而當磁頭固定不動 (假設機械手臂不動) ,硬碟盤轉一圈所畫出來的圓就是所謂的磁軌( Track );而如同我們前面剛剛提到的,一塊硬碟裡面可能具有多個硬碟盤, 所有硬碟盤上面相同半徑的那一個磁軌就組成了所謂的磁柱( Cylinder )

例如上圖二所示意,在兩個硬碟盤上面的同一個磁軌就是一個磁柱啦! 這個磁柱也是磁碟分割( partition )時的最小單位了; 另外,由圓心向外劃直線,則可將磁軌再細分為一個一個的磁區( Sector ),這個磁區就是硬碟盤上面的最小儲存物理量了! 通常一個 sector 的大小約為 512 Bytes 。以上就是整個硬碟的基本元件。

在計算整個硬碟的儲存量時,簡單的計算公式就是:『 header 數量 * 每個 header 負責的磁柱數量 * 每個磁柱所含有的磁區數量 * 磁區的容量』,單位換算為『header * cylinder/header * secter/cylinder * 512bytes/secter』,簡單的寫法如下: Cylinder x Head x Sector x 512 Bytes。另外,硬碟在讀取時,主要是『硬碟盤會轉動, 利用機械手臂將磁頭移動到正確的資料位置(單方向的前後移動),然後將資料依序讀出。』 在這個操作的過程當中,由於機械手臂上的磁頭與硬碟盤的接觸是很細微的空間, 如果有抖動或者是髒污在磁頭與硬碟盤之間時,就會造成資料的損毀或者是實體硬碟整個損毀~

因此,正確的使用電腦的方式,應該是在電腦通電之後,就絕對不要移動主機,並免抖動到硬碟, 而導致整個硬碟資料發生問題啊!另外,也不要隨便將插頭拔掉就以為是順利關機! 因為機械手臂必須要歸回原位,所以使用作業系統的正常關機方式,才能夠有比較好的硬碟保養啊! 因為他會讓硬碟的機械手臂歸回原位啊!

磁碟分割 ( Partition ):

在瞭解了硬碟的物理元件之後,再接著下來介紹的就是硬碟的分割( Partition )囉! 為什麼要進行硬碟分割啊?!因為我們必須要告訴作業系統:『 我這塊硬碟可以存取的區域是由 A 磁柱到 B 磁柱』,如此一來, 作業系統才能夠控制硬碟磁頭去 A-B 範圍內的磁柱存取資料;如果沒有告訴作業系統這個資訊, 那麼作業系統就無法利用我們的硬碟來進行資料的存取了, 因為作業系統將無法知道他要去哪裡讀取資料啊!這就是磁碟分割( Partition )的重點了: 也就是記錄每一個分割區( Partition )的起始與結束磁柱

好了,那麼這個分割區的起始與結束磁柱的資料放在哪裡呢?!那就是我們在 Linux 安裝與多重開機技巧 那個章節提到的 主要開機磁區( Master Boot Recorder, MBR )囉!事實上, MBR 就是在一塊硬碟的第零軌上面,這也是電腦開機之後要去利用該硬碟時, 必須要讀取的第一個區域!在這個區域內記錄的就是硬碟裡面的所有分割資訊, 以及開機的時候可以進行開機管理程式的寫入的處所啊!所以,當一個硬碟的 MBR 壞掉時,由於分割的資料不見了,呵呵,那麼這個硬碟也就幾乎可以說是壽終正寢了, 因為作業系統不知道該去哪個磁柱上讀取資料啊~~

那麼 MBR 有什麼限制呢?他最大的限制來自於他的大小不夠大到儲存所有分割與開機管理程式的資訊, 因此,MBR 僅提供最多四個 partition 的記憶,這就是所謂的 Primary (P)與 Extended (E) 的 partition 最多只能有四個的原因了。所以說,如果你預計分割超過 4 個 partition 的話,那麼勢必需要使用 3P + 1E ,並且將所有的剩餘空間都撥給 Extended 才行( 記得呦! Extended 最多只能有一個 ),否則只要 3P + E 之後還有剩下的空間, 那麼那些容量將成為廢物而浪費了,所以結論就是『 如果您要分割硬碟時,並且已經預計規劃使用掉 MBR 所提供的 4 個 partition ( 3P + E 或 4P )那麼磁碟的全部容量需要使用光,否則剩下的容量也不能再被使用』。 不過,如果您僅是分割出 1P + 1E 的話,那麼剩下的空間就還能再分割兩個 primary partition !

檔案系統:

在告知系統我的 partition 所在的起始與結束磁柱之後,再來則是需要將 partition 格式化為『我的作業系統認識的檔案系統( Filesystem )』囉!因為每個作業系統認識的 filesystem 並不相同!例如 Windows 作業系統在預設狀態下就無法認識 Linux 的檔案系統 ( 這裡指 Linux 的標準檔案系統 ext2 )。所以當然要針對我們的作業系統來格式化 partition 囉!

我們可以說,每一個 partition 就是一個 Filesystem ,那麼一個 partition 是否可以具有兩個 Filesystem 呢?!理論上應該是不行的!因為每個檔案系統都有其獨特的支援方式,例如 Linux 的 ext3 就無法被 Windows 系統所讀取!而你將一個 partition 格式化的時候,總不能格式化為 ext3 也同時格式化為 fat32 吧?!那是不可能的啊!

不論是哪一種 filesystem ,資料總是需要儲存的吧!既然硬碟是用來儲存資料的,想當然爾, 資料就必須寫入硬碟啦!剛剛我們提到硬碟的最小儲存單位是 sector ,不過資料所儲存的最小單位並不是 sector 喔,因為用 sector 來儲存太沒有效率了。怎麼說呢?因為一個 sector 只有 512 Bytes ,而磁頭是一個一個 sector 的讀取,也就是說,如果我的檔案有 10 MBytes ,那麼為了讀這個檔案, 我的磁頭必須要進行讀取 (I/O) 20480 次!

為了克服這個效率上的困擾,所以就有邏輯區塊( Block )的產生了! 邏輯區塊是在 partition 進行 filesystem 的格式化時, 所指定的『最小儲存單位』,這個最小儲存單位當然是架構在 sector 的大小上面( 因為 sector 為硬碟的最小物理儲存單位啊! ),所以啦, Block 的大小為 sector 的 2 的次方倍數。此時,磁頭一次可以讀取一個 block ,如果假設我們在格式化的時候,指定 Block 為 4 KBytes ( 亦即由連續的八個 sector 所構成一個 block ),那麼同樣一個 10 MBytes 的檔案, 磁頭要讀取的次數則大幅降為 2560 次,這個時候可就大大的增加檔案的讀取效能啦!

不過,Block 單位的規劃並不是越大越好喔!怎麼說呢?因為一個 Block 最多僅能容納一個檔案 (這裡指 Linux 的 ext2 檔案系統)!這有什麼問題呢?舉例來說好了,假如您的 Block 規劃為 4 KBytes ,而您有一個檔案大小為 0.1 KBytes ,這個小檔案將佔用掉一個 Block 的空間,也就是說,該 Block 雖然可以容納 4 Kbytes 的容量,然而由於檔案只佔用了 0.1 Kbytes ,所以,實際上剩下的 3.9 KBytes 是不能再被使用了,所以,在考慮 Block 的規劃時,需要同時考慮到:
  • 檔案讀取的效能
  • 檔案大小可能造成的硬碟空間浪費
因此,在規劃您的磁碟時,需要留意到您主機的用途來進行規劃較佳!例如 BBS 主機由於文章較短, 也就是說檔案較小,那麼 Block 小一點的好;而如果您的主機主要用在儲存大容量的檔案, 那麼考慮到效能,當然 Block 理論上,規劃的大一點會比較妥當啦!

Superblock:如同前面說的,當我們在進行磁碟分割( partition )時,每個磁碟分割槽( partition )就是一個檔案系統( filesystem ), 而每個檔案系統開始的位置的那個 block 就稱為 superblock ,superblock 的作用是儲存像是檔案系統的大小、空的和填滿的區塊,以及他各自的總數和其他諸如此類的資訊等等, 這也就是說,當您要使用這一個磁碟分割槽( 或者說是檔案系統 )來進行資料存取的時候,第一個要經過的就是 superblock 這個區塊了,所以囉, superblock 壞了,您的這個磁碟槽大概也就回天乏術了!

Linux 的 EXT2 檔案系統( inode ):

看完了上面的說明,您應該對於硬碟有一定程度的認識了!好了,那麼接下來就是要談一談 Linux 的檔案系統( Filesystem )囉!我們這裡以 Linux 最標準的 ext2 這個檔案系統來作為說明。還記得我們在 Linux 檔案屬性與目錄配置 那個章節提到的,在 Linux 系統當中,每個檔案不止有檔案的內容資料,還包括檔案的種種屬性,例如:所屬群組、 所屬使用者、能否執行、檔案建立時間、檔案特殊屬性等等。由於 Linux 作業系統是一個多人多工的環境,為了要保護每個使用者所擁有資料的隱密性, 所以具有多樣化的檔案屬性是在所難免的!在標準的 ext2 檔案系統當中,我們將每個檔案的內容分為兩個部分來儲存,一個是檔案的屬性,另一個則是檔案的內容。

為了應付這兩個不同的咚咚,所以 ext2 規劃出 inode 與 Block 來分別儲存檔案的屬性( 放在 inode 當中 )與檔案的內容( 放置在 Block area 當中 )。當我們要將一個 partition 格式化( format )為 ext2 時,就必須要指定 inode 與 Block 的大小才行,也就是說,當 partition 被格式化為 ext2 的檔案系統時,他一定會有 inode table 與 block area 這兩個區域

Block 已經在前面說過了,他是資料儲存的最小單位。那麼 inode 是什麼?!簡單的說, Block 是記錄『檔案內容資料』的區域,至於 inode 則是記錄『該檔案的相關屬性,以及檔案內容放置在哪一個 Block 之內』的資訊。 簡單的說, inode 除了記錄檔案的屬性外,同時還必須要具有指向( pointer )的功能,亦即指向檔案內容放置的區塊之中,好讓作業系統可以正確的去取得檔案的內容啊! 底下幾個是 inode 記錄的資訊(當然不止這些):
  • 該檔案的擁有者與群組(owner/group);
  • 該檔案的存取模式(read/write/excute);
  • 該檔案的類型(type);
  • 該檔案建立或狀態改變的時間(ctime)、最近一次的讀取時間(atime)、最近修改的時間(mtime);
  • 該檔案的容量;
  • 定義檔案特性的旗標(flag),如 SetUID...;
  • 該檔案真正內容的指向 (pointer);
我們在前一章 Linux 檔案與目錄管理 當中提到過利用 ls 查詢檔案所記載的時間,就是 atime / ctime / mtime 三種時間。這三種時間的意義我們已經在前一章的 touch 指令介紹時提過,這三種時間就是記錄在 inode 裡面的啦~ 如果回到前一章,您會發現,我們可以利用 ls 的相關功能來查詢到時間喔!而預設的顯示時間是 mtime 。
[root@linux ~]# ls -la --time=atime PATH
那個 PATH 是您所想要查詢的檔案或目錄名稱。利用上面的 ls 相關參數,就可以取得您想要知道的檔案相關的三種時間囉~ 至於一個 inode 的大小為 128 bytes 這麼大 (可以使用底下要介紹的 dumpe2fs 來查閱 inode 的大小喔!) !好了,那麼我的 Linux 系統到底是如何讀取一個檔案的內容呢?底下我們分別針對目錄與檔案來說明:
  • 目錄:
    當我們在 Linux 下的 ext2 檔案系統建立一個目錄時, ext2 會分配一個 inode 與至少一塊 Block 給該目錄。其中,inode 記錄該目錄的相關屬性,並指向分配到的那塊 Block ;而 Block 則是記錄在這個目錄下的相關連的檔案(或目錄)的關連性!

  • 檔案:
    當我們在 Linux 下的 ext2 建立一個一般檔案時, ext2 會分配至少一個 inode 與相對於該檔案大小的 Block 數量給該檔案。例如:假設我的一個 Block 為 4 Kbytes ,而我要建立一個 100 KBytes 的檔案,那麼 linux 將分配一個 inode 與 25 個 Block 來儲存該檔案!
要注意的是, inode 本身並不紀錄檔名,而是記錄檔案的相關屬性,至於檔名則是記錄在目錄所屬的 block 區域! 那麼檔案與目錄的關係又是如何呢?就如同上面的目錄提到的,檔案的相關連結會記錄在目錄的 block 資料區域, 所以當我們要讀取一個檔案的內容時,我們的 Linux 會先由根目錄 / 取得該檔案的上層目錄所在 inode , 再由該目錄所記錄的檔案關連性 (在該目錄所屬的 block 區域) 取得該檔案的 inode , 最後在經由 inode 內提供的 block 指向,而取得最終的檔案內容。我們以 /etc/crontab 這個檔案的讀取為例, 他的內容資料是這樣取得的:

讀取 /etc/crontab 的簡易流程示意
圖三、讀取 /etc/crontab 的簡易流程示意。

一塊 partition 在 ext2 底下會被格式化為 inode table 與 block area 兩個區域, 所以在圖三裡面,我們將 partition 以長條的方式來示意,會比較容易理解的啦!而讀取 /etc/crontab 的流程為:
  1. 作業系統根據根目錄( / )的相關資料可取得 /etc 這個目錄所在的 inode ,並前往讀取 /etc 這個目錄的所有相關屬性;
  2. 根據 /etc 的 inode 的資料,可以取得 /etc 這個目錄底下所有檔案的關連資料是放置在哪一個 Block 當中,並前往該 block 讀取檔案的關連性內容;
  3. 由上個步驟的 Block 當中,可以知道 crontab 這個檔案的 inode 所在地,並前往該 inode ;
  4. 由上個步驟的 inode 當中,可以取得 crontab 這個檔案的所有屬性,並且可前往由 inode 所指向的 Block 區域,順利的取得 crontab 的檔案內容。
整個讀取的流程大致上就是這樣,如果您想要實作一下以瞭解整個流程的話,可以這樣試做看看:
1. 察看一下根目錄所記載的所有檔案關連性資料
[root@linux ~]# ls -lia /
      2 drwxr-xr-x  24 root root  4096 Jul 16 23:45 .
      2 drwxr-xr-x  24 root root  4096 Jul 16 23:45 ..
 719489 drwxr-xr-x  83 root root 12288 Jul 21 04:02 etc
 523265 drwxr-xr-x  24 root root  4096 Jun 25 20:16 var
# 注意看一下,在上面的 . 與 .. 都是連結到 inode 號碼為 2 的那個 inode ,
# 也就是說, / 與其上層目錄 .. 都是指向同一個 inode number 啊!兩者是相同的。
# 而在根目錄所記載的檔案關連性 (在 block 內) 得到 /etc 的 inode number 
# 為 719489 那個 inode number 喔!

2. 察看一下 /etc/ 內的檔案關連性的資料
[root@linux ~]# ls -liad /etc/crontab /etc/.
719489 drwxr-xr-x  83 root root 12288 Jul 21 04:02 /etc/.
723496 -rw-r--r--   1 root root   663 Jul  4 12:03 /etc/crontab
# 瞧!此時就能夠將 /etc/crontab 找到關連性囉!
所以您知道,目錄的最大功能就是在提供檔案的關連性,在關連性裡面, 當然最主要的就是『檔名與 inode 的對應資料』囉!另外,關於 EXT2 檔案系統,這裡有幾點小事情要提醒一下:
  • ext2 與 ext3 檔案在建立時 (format) 就已經設定好固定的 inode 數與 block 數目了;

  • 格式化 Linux 的 ext2 檔案系統,可以使用 mke2fs 這個程式來執行!

  • ext2 允許的 block size 為 1024, 2048 及 4096 bytes;

  • 一個 partition (filesystem) 所能容許的最大檔案數,與 inode 的數量有關, 因為一個檔案至少要佔用一個 inode 啊!

  • 在目錄底下的檔案數如果太多而導致一個 Block 無法容納的下所有的關連性資料時,Linux 會給予該目錄多一個 Block 來繼續記錄關連資料;

  • 通常 inode 數量的多寡設定為 (partition 的容量) 除以 (一個 inode 預計想要控制的容量)。 舉例來說,若我的 block 規劃為 4Kbytes,假設我的一個 inode 會控制兩個 block ,亦即是假設我的一個檔案大致的容量在 8Kbytes 左右時,假設我的這個 partition 容量為 1GBytes, 則 inode 數量共有:( 1G * 1024M/G * 1024K/M ) / ( 8K ) = 131072 個。而一個 inode 佔用 128 bytes 的空間,因此格式化時就會有 ( 131072個 * 128bytes/個 ) = 16777216 byes = 16384 Kbytes 的 inode table 。也就是說,這一個 1GB 的 partition 在還沒有儲存任何資料前, 就已經少了 16MBytes 的容量啊!

  • 因為一個 inode 只能記錄一個檔案的屬性,所以 inode 數量比 block 多是沒有意義的! 舉上面的例子來說,我的 Block 規劃為 4 Kbytes ,所以 1GB 大概就有 262144 個 4Kbytes 的 block ,如果一個 block 對應一個 inode 的話,那麼當我的 inode 數量大於 262144 時,多的 inode 將沒有任何用處,徒然浪費硬碟的空間而已!另外一層想法,如果我的檔案容量都很大, 那麼一個檔案佔用一個 inode 以及數個 block ,當然 inode 數量就可以規劃的少很多啦!

  • 當 block 大小越小,而 inode 數量越多,則可利用的空間越多,但是大檔案寫入的效率較差; 這種情況適合檔案數量多,但是檔案容量小的系統,例如 BBS 或者是新聞群組( News )這方面服務的系統;

  • 當 Block 大小越大,而 inode 數量越少時,大檔案寫入的效率較佳,但是可能浪費的硬碟空間較多; 這種狀況則比較適合檔案容量較大的系統!
簡單的歸納一下, ext2 有幾個特色:
  • Blocks 與 inodes 在一開始格式化時 (format) 就已經固定了;
  • 一個 partition 能夠容納的檔案數與 inode 有關;
  • 一般來說,每 4Kbytes 的硬碟空間分配一個 inode ;
  • 一個 inode 的大小為 128 bytes;
  • Block 為固定大小,目前支援 1024/2048/4096 bytes 等;
  • Block 越大,則損耗的硬碟空間也越多。
  • 關於單一檔案:
    若 block size=1024,最大容量為 16GB,若 block size=4096,容量最大為 2TB;
  • 關於整個 partition :
    若 block size=1024,則容量達 2TB,若 block size=4096,則容量達 32TB。
  • 檔名最長達 255 字元,完整檔名長達 4096 字元。
另外,關於 partition 的使用效率上,當您的一個 partition 規劃的很大時,例如 100GB 這麼大, 由於硬碟上面的資料總是來來去去的,所以,整個 partition 上面的檔案通常無法連續寫在一起, 而是填入式的將資料填入沒有被使用的 block 當中。如果檔案寫入的 block 真的分的很散, 此時就會有所謂的檔案離散的問題發生了。雖然我們的 ext2 在 inode 處已經將該檔案所記錄的 block number 都記上了,所以資料可以一次性讀取,但是如果檔案真的太過離散,確實還是會發生讀取效率低落的問題。 果真如此,那麼可以將整個 partition 內的資料全部複製出來,將該 partition 重新格式化, 再將資料給他複製回去即可解決。

此外,如果 partition 真的太大了,那麼當一個檔案分別記錄在這個 partition 的最前面與最後面的 block, 此時會造成硬碟的機械手臂移動幅度過大,也會造成資料讀取效能的低落。因此, partition 的規劃並不是越大越好, 而是真的要針對您的主機用途來進行規劃才行!^_^

EXT2/EXT3 檔案的存取與日誌式檔案系統的功能

綜合上面談的種種,我們可以知道,當一個 ext2 的 filesystem 被建立時, 他擁有 superblock / group description / block bitmap / inode bitmap / inode table / data blocks 等等區域。要注意的是,每個 ext2 filesystem 在被建立的時候,會依據 partition 的大小, 給予數個 block group ,而每個 block group 就有上述的這些部分。整個 filesystem 的架構可以下圖展現:

整個 filesystem 的展現示意圖
圖四、整個 filesystem 的展現示意圖

我們將整個 filesystem 簡單化, 假設僅有一個 block group ,那麼上面的各個部分分別代表什麼呢?
  • SuperBlock:如前所述, Superblock 是記錄整個 filesystem 相關資訊的地方, 沒有 Superblock ,就沒有這個 filesystem 了。他記錄的資訊主要有:
    • block 與 inode 的總量;
    • 未使用與已使用的 inode / block 數量;
    • 一個 block 與一個 inode 的大小;
    • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊;
    • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。
  • Group Description:紀錄此 block 由由何處開始記錄;
  • Block bitmap:此處記錄那個 block 有沒有被使用;
  • Inode bitmap:此處記錄那個 inode 有沒有被使用;
  • Inode table:為每個 inode 資料存放區;
  • Data Blocks:為每個 block 資料存放區。
如果想要知道某個 ext2/ext3 的檔案系統內,關於上述提到的相關資訊時,可以使用 dumpe2fs 這個指令來讀取,舉例來說,鳥哥將我自己的主機 /dev/hda1 讀出 ext3 的訊息:
[root@linux ~]# dumpe2fs /dev/hda1
Filesystem volume name:   /
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              1537088
Block count:              1536207
Free blocks:              735609
Free inodes:              1393089
First block:              0
Block size:               4096
Filesystem created:       Sat Jun 25 16:21:13 2005
Last mount time:          Sat Jul 16 23:45:04 2005
Last write time:          Sat Jul 16 23:45:04 2005
Last checked:             Sat Jun 25 16:21:13 2005
First inode:              11
Inode size:               128
Journal inode:            8

Group 0: (Blocks 0-32767)
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-376
  Block bitmap at 377 (+377), Inode bitmap at 378 (+378)
  Inode table at 379-1400 (+379)
  0 free blocks, 32424 free inodes, 11 directories
  Free blocks:
  Free inodes: 281-32704
Group 1: (Blocks 32768-65535)
  Backup superblock at 32768, Group descriptors at 32769-32769
  Reserved GDT blocks at 32770-33144
  Block bitmap at 33145 (+377), Inode bitmap at 33146 (+378)
  Inode table at 33147-34168 (+379)
  18 free blocks, 24394 free inodes, 349 directories
  Free blocks: 37882-37886, 38263-38275
  Free inodes: 38084-38147, 39283-39343, 41135, 41141-65408
# 因為資料很多,所以鳥哥略去了一些資訊了~上面是比較精簡的顯示內容。
# 在 Group 0 之前的都是 Superblock 的內容,記錄了 inode/block 的總數,
# 還有其他相關的訊息。至於由 Group 0 之後,則是說明各個 bitmap 及 inode table 
# 與 block area 等等。
透過這些記錄,我們可以很輕易的就知道哪些 inode 沒有被使用,哪些 block 還可以記錄, 如此一來,在新增、建立檔案與目錄時,系統就會根據這些記錄來將資料分別寫入尚未被使用的 inode 與 block area 了! 不過,要注意的是,當我們新增一個檔案(目錄)時:
  1. 根據 inode bitmap / block bitmap 的資訊,找到尚未被使用的 inode 與 block , 進而將檔案的屬性與資料分別記載進 inode 與 block ;
  2. 將剛剛被利用的 inode 與 block 的號碼 (number) 告知 superblock、inode bitmap、block bitmap 等,讓這些 metadata 更新資訊。
一般來說,我們將 inode table 與 block area 稱為資料存放區域,至於其他的例如 superblock、 block bitmap 與 inode bitmap 等記錄就被稱為 metadata 囉。經由上面兩個動作,我們知道一筆資料寫入硬碟時, 會有這兩個動作。

  • 資料的不一致 (Inconsistent) 狀態
  • 那麼萬一您的檔案在寫入硬碟時,因為不知名原因導致系統中斷(例如突然的停電啊、 系統核心發生錯誤啊~等等的怪事發生時),所以資料就只有紀錄到動作一,而動作二尚未進行~ 這就會產生 metadata 與資料存放區產生不一致 (Inconsistent) 的情況發生了。

    在早期的 EXT2 檔案系統中,如果發生這個問題,那麼系統在重新開機的時候, 就會藉由 Superblock 當中記錄的 valid bit 與 filesystem state 等狀態來判斷是否強制進行資料一致性的檢查!檢查則以 e2fsck 這支程式來進行的。 不過,這樣的檢查真的是很費時~因為要針對 metadata 區域與實際資料存放區來進行比對, 呵呵~得要搜尋整個 partition 呢~哇!系統真忙碌~而且在對 Internet 提供服務的伺服器主機上面, 這樣的檢查真的會造成主機復原時間的拉長~真是麻煩~這也就造成後來所謂日誌式檔案系統的興起了。

    稍微瞭解了所謂資料不一致的狀態後,再來要瞭解的,就是,那麼為何要有日誌式檔案系統的產生呢? 我們已經在 Linux 檔案屬性與目錄配置 當中提到過一些檔案系統的注意事項, 也提過日誌式 (Journal) 檔案系統的相關功能,這裡我們再稍微深入的討論一下。

    剛剛提到了,在 EXT2 檔案系統當中,要進行檔案的寫入時,會將資料分別在資料存放區與 metadata 區記錄下來, 若當這兩個動作無法一次完成時,就會造成所謂的不一致現象。若發生不一致現象, 因為系統不知道是那個檔案發生不一致現象,所以就會將整個 filesystem 做一致性的檢查,如此一來,很費時啊! 想一想,如果在我們的 filesystem 當中,要是能夠規劃出一個區塊,專門來記錄寫入或修訂檔案時的步驟, 那不就可以簡化一致性檢查的步驟了?也就是說:
    1. 當系統要寫入一個檔案的時候,會先在日誌記錄區塊中紀錄:某個檔案準備要寫入磁碟了;
    2. 開始寫入檔案的權限與資料;
    3. 開始更新 metadata 的資料;
    4. 完成資料與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的紀錄。
    在這樣的程序當中,萬一資料的紀錄過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄區塊, 就可以知道那個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 真的就可以達到快速修復 filesystem 的能力了!這就是日誌式檔案最基礎的功能囉~ 那麼我們的 ext2 可達到這樣的功能嗎?當然可以啊! 就透過 ext3 即可! ext3 是 ext2 的升級版本,並且可向下相容 ext2 版本呢! 所以囉,目前我們才建議大家,可以直接使用 ext3 這個 filesystem 啊! ^_^

    如果您對於 EXT2 / EXT3 系統還有更多的興趣,可以參考底下這幾篇文章: 或者參考鳥哥由網路上面找到的相關中文翻譯,不過.....原發文者的文章出處已經找不到了~ 真是不好意思~請參考:附錄 B:EXT2/EXT3 檔案系統

    Linux 檔案系統的運作:

    好了,我們知道整個 ext2/ext3 的資料存取是透過 journal 與 metadata 還有資料存放區在紀錄的。 不過,實際上, Linux 檔案系統在運作的時候,真的要將資料直接存放到硬碟上面嗎?! 有沒有更有效率的作法?

    我們來看看整部電腦的運作當中,那個資料的存取速度最慢呢?資料處理最快速的地方應該是 CPU 了, 接下來則是主記憶體 (RAM) ,至於硬碟,哈哈!沒錯,速度可是比 CPU 還有 RAM 要慢的很多很多。 為了讓 Linux 加快整個系統的存取效率,因此在 Linux 上面通常採取非同步處理( asynchronously )的方式。

    什麼是非同步呢?舉例來說:『當系統讀取了某一個檔案, 則該檔案所在的區塊資料會被載入到記憶體當中,所以該磁碟區塊就會被放置在主記憶體的緩衝快取區中, 若這些區塊的資料被改變時,剛開始資料僅有主記憶體的區塊資料會被改變, 而且在緩衝區當中的區塊資料會被標記為『 Dirty 』,這個時候磁碟實體區塊尚未被修正! 所以亦即表示,這些『 Dirty 』區塊的資料必需回寫到磁碟當中, 以維持磁碟實體區塊上的資料與主記憶體中的區塊資料的一致性。

    為什麼要這麼做呢?這是因為主記憶體的運作速度比起硬碟來實在是快太多了, 萬一系統當中有一個檔案相當的大,而又持續性的存取,那麼由於較慢的硬碟存取速度,將使得整個 Linux 速度被拖垮,所以才會使用非同步方式的資料處理啊!不過, 也由於硬碟與主記憶體的資料可能沒有同步化,因此,如果 Linux 不正常關機( 例如跳電或者是當機 )時,則由於資料尚未回寫入磁碟當中,會導致系統在再次開機時,會花相當多的時間進行磁碟檢驗, 同時也有可能造成磁碟的損毀啊!

    掛載點的意義 (mount point):

    我們上面提到的都是關於檔案系統 (filesystem),但是要能夠讓我們的 Linux 使用的話, 非得『掛載 (mount)』上我們的 Linux 系統才行啊! 剛剛我們上面提到了目錄可以記錄檔名與 inode 的相關資訊,此外, 目錄也是讓我們得以跟 filesystem 產生對應的入口點。因此,我們稱那個入口點目錄為『 掛載點 (mount point)

    舉例來說,在鳥哥的 安裝 FC4 範例當中,我們將硬碟分割為幾大部分, 同時主要將 / 與 /home 設定為兩個 partition 的掛載點。假設 / 是接在 /dev/hda1 , 而 /home 是接在 /dev/hda2 上面,那麼,也就是說,在 /home 底下的所有次目錄,使用的都是 /dev/hda2 那個 partition 的資料呢!而非 /home 的則都是使用 /dev/hda1 的資料!

    那麼來看看系統中如果主要分為 / 與 /home 時,他們對應的 inode 會有什麼現象呢?
    [root@linux ~]# ls -lid / /home
    2 drwxr-xr-x  26 root root 4096  7月 21 09:08 /
    2 drwxr-xr-x  42 root root 4096  7月 14 23:37 /home
    
    看到了吧?咦!怎麼 / 與 /home 的 inode number 都是 2 啊??這太不合理了~ 原因很簡單啊!因為 / 是 /dev/hda1 而 /home 是 /dev/hda2 ,這兩個 partition 都有 inode number 為 2 的號碼啊!所以啊,請注意, 掛載點一定是『目錄』而不是檔案喔! 也就是說,這個掛載點就是進入該 filesystem 的入口啦!

    其他 Linux 支援的檔案系統

    雖然 Linux 的標準檔案系統是 ext2 ,且還有增加了日誌功能的 ext3 之外,事實上,Linux 還有支援很多檔案格式的, 尤其是最近這幾年推出了好幾種速度很快的日誌式檔案系統,包括 SGI 的 XFS 檔案系統, 可以適用更小型檔案的 Reiserfs 檔案系統,以及 Windows 的 FAT 檔案系統等等, 都能夠被 Linux 所支援喔!常見的支援檔案系統有:
    • 傳統檔案系統:ext2 / minix / MS-DOS / FAT (用 vfat 模組) / iso9660 (光碟)等等;
    • 日誌式檔案系統: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
    • 網路檔案系統: NFS / SMBFS
    想要知道您的 Linux 支援的檔案系統有哪些,可以察看底下這個目錄:
    [root@linux ~]# ls -l /lib/modules/`uname -r`/kernel/fs
    
    系統目前已啟用的檔案系統則有:
    [root@linux ~]# cat /proc/filesystems
    
    假設您的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那麼您取用 /home/dmtsai/.bashrc 時,有特別指定要用的什麼檔案系統的模組來讀取嗎?! 應該是沒有吧!嘿嘿!這個就是我們 Linux kernel 的 Virtual Filesystem Switch (VFS) 的功能啦!透過這個 VFS 的功能來管理所有的 filesystem, 省去我們需要自行設定讀取檔案系統的定義啊~方便很多!

    檔案系統的簡單操作:

    在瞭解了一些簡單的硬碟與檔案系統的概念之後,並且知道如何以 ls 查詢檔案系統相關的資訊後, 接下來就是得要瞭解如何知道整個磁碟的剩餘容量與總容量囉~此外,也得要知道一下,前一章還沒有介紹到的連結檔 (link file) 囉~

    磁碟與目錄的容量:

    在文字介面底下有什麼方法可以查看目前的磁碟最大容許容量、已經使用掉的容量、 目前所在目錄的已使用容量?還有還有,怎麼知道目前目錄底下使用掉的硬碟容量呢? 以及如何查詢目前的 inodes 數目?呵呵!底下我們就來談一談主要的兩個指令:

  • df
  • [root@linux ~]# df [-ahikHTm] [目錄或檔名]
    參數:
    -a  :列出所有的檔案系統,包括系統特有的 /proc 等檔案系統;
    -k  :以 KBytes 的容量顯示各檔案系統;
    -m  :以 MBytes 的容量顯示各檔案系統;
    -h  :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;
    -H  :以 M=1000K 取代 M=1024K 的進位方式;
    -T  :連同該 partition 的 filesystem 名稱 (例如 ext3) 也列出;
    -i  :不用硬碟容量,而以 inode 的數量來顯示
    範例:
    範例一:將系統內所有的 partition 列出來!
    [root@linux ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda1              5952252   3012332   2632680  54% /
    /dev/shm                192836         0    192836   0% /dev/shm
    /dev/hda5              9492644    221604   8781060   3% /home
    # 特別注意,在 Linux (FC4) 底下,如果 df 沒有加任何參數,
    # 那麼預設會將系統內所有的 (不含特殊記憶體內的檔案系統與 swap) 都以 Kbytes 
    # 的容量來列出來!至於那個 /dev/shm 是與記憶體有關的掛載,先不要理他!
    
    範例二:將容量結果以易讀的容量格式顯示出來
    [root@linux ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/hda1             5.7G  2.9G  2.6G  54% /
    /dev/shm              189M     0  189M   0% /dev/shm
    /dev/hda5             9.1G  217M  8.4G   3% /home
    # 不同於範例一,這裡會以 G/M 等容量格式顯示出來,比較容易看啦!
    
    範例三:將系統內的所有特殊檔案格式及名稱都列出來
    [root@linux ~]# df -aT
    Filesystem    Type   1K-blocks      Used Available Use% Mounted on
    /dev/hda1     ext3     5952252   3012332   2632680  54% /
    /dev/proc     proc           0         0         0   -  /proc
    /dev/sys     sysfs           0         0         0   -  /sys
    /dev/devpts devpts           0         0         0   -  /dev/pts
    /dev/shm     tmpfs      192836         0    192836   0% /dev/shm
    /dev/hda5     ext3     9492644    221604   8781060   3% /home
    none   binfmt_misc           0         0         0   -  /proc/sys/fs/binfmt_misc
    # 看到了吧!系統裡面其實還有很多的特殊檔案系統在跑得!
    # 不過,那些比較特殊的檔案系統幾乎都是在記憶體當中,例如 /proc 這個掛載點。
    # 因此,這些特殊的檔案系統都不會佔據硬碟空間喔! ^_^
    
    範例四:將 /etc 底下的可用的磁碟容量以易讀的容量格式顯示
    [root@linux ~]# df -h /etc
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/hda1             5.7G  2.9G  2.6G  54% /
    # 這個範例比較有趣一點啦,在 df 後面加上目錄或者是檔案時, df
    # 會自動的分析該目錄或檔案所在的 partition ,並將該 partition 的容量顯示出來,
    # 所以,您就可以知道某個目錄底下還有多少容量可以使用了! ^_^
    
    範例五:將目前各個 partition 當中可用的 inode 數量列出
    [root@linux ~]# df -ih 
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda1               1.5M    141K    1.4M   10% /
    /dev/shm                 48K       1     48K    1% /dev/shm
    /dev/hda5               2.4M      67    2.4M    1% /home
    
    這是用來顯示目前磁碟的總容量與剩餘可用容量的指令!需要注意的是, 由於我們的檔案或者是外掛的磁碟都是加在『 / 』底下,所以當根目錄沒有空間的時候, 嘿嘿!你的 Linux 系統可能大概就要掛了吧~當然囉!你可以將你的資料放置在加掛的硬碟中, 那麼如何知道目前哪一個磁碟還有多少空間呢?!
    Tips 鳥哥 說個笑話!當初我們系上有個研究生在管理 Sun 的工作站,是別研究室的, 他的硬碟明明有好幾 GB ,但是就是沒有辦法將幾 MB 的資料 copy 進去, 他就去跟老闆講說機器壞了!嘿!明明才來維護過幾天而已為何會壞了! 結果老闆將維護商叫來罵了 2 小時左右吧!後來,維護商發現原來硬碟的『總空間』還有很多, 只是某個磁區填滿了,偏偏該研究生就是要將資料 copy 去那個磁區!呵呵! 後來那個研究生就被命令『再也不許碰 Sun 主機』了~~
    這裡要請大家再複習一下,我們的硬碟磁區規劃中, primary 磁區每一顆硬碟最多只允許 4 個,其他的就放置在 Extended 磁區中了!而,硬碟的代號與 IDE 的插槽是有關係的! 如果忘記了,那就回去安裝 Linux 那一章複習一下吧!好了!假設我只有一棵硬碟,且放在 IDE 的 master ,那麼我的硬碟就是 /dev/hda 囉!而在這顆硬碟中的分割磁區就可以由 /dev/hda1 開始向上加!

    OK,那麼使用 df -k 之後,假設我的硬碟分為 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5 與 /dev/hda6 ,咦! /dev/hda4 跑去哪裡了!呵呵!其實 /dev/hda4 通常就是 Extended 磁區啦!而後面的 /dev/hda5, /dev/hda6 等磁區就是由 /dev/hda4 所切出來的!所以 /dev/hda5 + /dev/hda6 = /dev/hda4 !當然,如果還有沒有顯示出來的,例如 Swap ,則 /dev/hda4 還有可能更大呦!

    那麼來解釋一下上面的資料吧!
    • Filesystem:代表該檔案系統是在那個 partition 啊,所以列出裝置名稱;
    • 1k-blocks:說明底下的數字單位是 1KB 呦!可利用 -h 或 -m 來改變容量;
    • Used:顧名思義,就是使用掉的硬碟空間啦!
    • Available:也就是剩下的磁碟空間大小;
    • Use%:就是磁碟的使用率啦!如果使用率高達 90% 以上時, 最好需要注意一下了,免得容量不足造成系統問題喔! (例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁碟)
    • Mounted on:就是磁碟掛載的目錄所在啦!(掛載點啦!)
    另外,需要注意的是,如果使用 -a 這個參數時,系統會出現 /proc 這個磁區,但是裡面的東西都是 0 ,不要緊張! /proc 的東西都是 Linux 系統所需要載入的系統資料,而且是掛載在『記憶體當中』的, 所以當然沒有佔任何的硬碟空間囉!

  • du
  • [root@linux ~]# du [-ahskm] 檔案或目錄名稱
    參數:
    -a  :列出所有的檔案與目錄容量,因為預設僅統計目錄底下的檔案量而已。
    -h  :以人們較易讀的容量格式 (G/M) 顯示;
    -s  :列出總量而已,而不列出每個各別的目錄佔用容量;
    -k  :以 KBytes 列出容量顯示;
    -m  :以 MBytes 列出容量顯示;
    範例:
    範例一:列出目前目錄下的所有檔案容量
    [root@linux ~]# du
    [root@vbird ~]# du
    16      ./.gnome2
    16      ./.ssh
    .......中間省略........
    292     .
    # 直接輸入 du 沒有加任何參數時,則 du 會分析『目前所在目錄』
    # 的檔案與目錄所佔用的硬碟空間。但是,實際顯示時,僅會顯示目錄容量,
    # 但我的 . 目錄有很多檔案沒有被列出來,所以,全部的目錄相加不會等於 . 的容量喔!
    
    範例二:同範例一,但是將檔案的容量也列出來
    [root@linux ~]# du -a
    12      ./install.log.syslog
    16      ./.gnome2
    16      ./.ssh
    76      ./install.log
    16      ./.bash_history
    4       ./.bashrc
    .......中間省略........
    292     .
    # 加上這個 -a 參數後,就會將目錄底下的檔案也一起列示出來,
    # 而不是僅列出檔案資訊而已!注意囉~ ^_^
    
    範例三:檢查根目錄底下每個目錄所佔用的容量
    [root@linux ~]# du -sm /*
    7       /bin
    14      /boot
    .......中間省略........
    385     /proc
    .......中間省略........
    1       /tmp
    2944    /usr
    79      /var
    # 這是個很常被使用的功能囉~利用萬用字元 * 來代表每個目錄,
    # 所以,如果想要檢查某個目錄下,那個次目錄佔用最大的容量,就可以用這個方法找出來
    # 值得注意的是,如果您剛剛安裝好 Linux 時,那麼整個系統容量最大的應該是 /usr 
    # 那個目錄,而 /proc 雖然有列出容量,但是那個容量是在記憶體中,不佔硬碟空間。
    
    在 Windows 底下可以使用檔案總管來管理你的磁碟,在 Linux 底下也可以輕易的以 du 來知道目前磁碟的檔案容量耶!在預設的情況下,容量的輸出是以 KB 來設計的, 如果你想要知道目錄佔了多少 MB ,那麼就使用 -m 這個參數即可囉!而, 如果你只想要知道該目錄佔了多少容量的話,呵呵,使用 -s 就可以啦!另外, 如同上面的範例三,可以利用萬用字元 * 來加快你的搜尋喔!

    連結檔的介紹: ln

    什麼是連結檔呢?其實連結檔有點類似 Windows 底下的『捷徑』!也就是很多的連結檔案( link file )其實都指向同一個來源檔案( source file )!不過,在所有的檔案類型當中, 連結檔算是比較難理解的一部份了!因為連結檔還分成 Hard link 與 symbolic link 兩種,這兩種連結檔在架構上是完全不一樣的咚咚,底下就來好好的談一談先!


  • Hard Link (硬式連結或實際連結)
  • 在前一節當中,我們提到檔案的讀取方式為:
    1. 先由一層一層的目錄取得檔案相關的關連資料,
    2. 再到對應的 inode 取得檔案的屬性,以及檔案內容資料所在的 Block ,
    3. 最後到 Block area 取得檔案的資料。
    那麼 hard link 怎麼製作檔案的連結呢?!很簡單, Hard Link 只是在某個目錄下新增一個該檔案的關連資料而已!

    舉個例子來說,假設我的 /root/crontab 為一個 hard link 的檔案,他連結到 /etc/crontab 這個檔案,也就是說,其實 /root/crontab 與 /etc/crontab 是同一個檔案,只是有兩個目錄( /etc 與 /root )記錄了 crontab 這個檔案的關連資料罷了!也就是說,我由 /etc 這個目錄所記錄的關連資料可知道 crontab 的 inode 放置在 A 處,而由 /root 這個目錄下的關連資料, crontab 同樣也指到 A 處的 inode !所以囉, crontab 這個檔案的 inode 與 block 都沒有改變, 有的只是有兩個目錄記錄了關連資料。

    那這樣有什麼好處呢?最大的好處就是『安全!』如同上面提到的 /root/crontab 與 /etc/crontab 中, 不管哪一個檔案被刪除了,其實僅是移除一筆目錄底下的檔案關連性資料,並沒有更動到原本檔案的 inode 與 block 資料呢!而且,不論由那個目錄連結到正確的 crontab 的 inode 與 block , 都可以正確無誤的進行資料的修改喔! ^_^

    一般來說,使用 hard link 設定連結檔時,磁碟的空間與 inode 的數目都不會改變! 由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連資料,所以當然不會用掉 inode 與磁碟空間囉!
    Tips 鳥哥 其實可能會改變的,那就是當目錄的 Block 被用完時,就可能會新加一個 block 來記錄,而導致磁碟空間的變化!不過,一般 hard link 所用掉的關連資料量很小,所以通常不會改變 inode 與磁碟空間的大小喔!
    由於 hard link 是在同一個 partition 上面進行資料關連的建立,所以 hard link 是有限制的:
    • 不能跨 Filesystem;
    • 不能 link 目錄。
    不能跨 Filesystem 還好理解,因為 hard link 本來就是在一個 partition 內建立關連性的, 那不能 hard link 到目錄又是怎麼回事呢?這是因為如果使用 hard link 連結到目錄時, 連結的資料被需要連同被連結目錄底下的所有資料都建立連結,舉例來說,如果你要將 /etc 使用硬式連結建立一個 /etc_hd 的目錄時,那麼在 /etc_hd 底下的所有資料同時都與 /etc 底下的資料要建立 hard link 的,而不能僅是連結到 /etc_hd 與 /etc 而已。 並且,未來如果需要在 /etc_hd 底下建立新檔案時,連帶的, /etc 底下的資料又得要建立一次 hard link ,因此造成環境相當大的複雜度。 所以囉,目前 hard link 對於目錄暫時還是不支援的啊!

  • Symbolic Link (符號連結,亦即是捷徑)
  • 相對於 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一個獨立的檔案, 而這個檔案會讓資料的讀取指向他 link 的那個檔案內容!由於只是利用檔案來做為指向的動作, 所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』, 會一直說『無法開啟某檔案!』。這裡還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所建立的檔案為一個獨立的新的檔案,所以會佔用掉 inode 與 block 喔!

    由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連資料被殺掉了, 也沒有關係,只要有任何一個目錄下存在著關連資料,那麼該檔案就不會不見!舉上面的例子來說,我的 /etc/crontab 與 /root/crontab 指向同一個檔案,如果我刪除了 /etc/crontab 這個檔案,該刪除的動作其實只是將 /etc 目錄下關於 crontab 的關連資料拿掉而已, crontab 所在的 inode 與 block 其實都沒有被變動喔!

    不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link , 所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了, 說的天花亂墜,看您也差不多快要昏倒了!沒關係,實作一下就知道怎麼回事了!要製作連結檔就必須要使用 ln 這個指令呢!
    [root@linux ~]# ln [-sf] 來源檔 目標檔
    參數:
    -s  :如果 ln 不加任何參數就進行連結,那就是hard link,至於 -s 就是symbolic link
    -f  :如果 目標檔 存在時,就主動的將目標檔直接移除後再建立!
    範例:
    範例一:將 /etc/passwd 複製到 /tmp 底下,並且觀察 inode 與 block
    [root@linux ~]# cd /tmp
    [root@linux tmp]# cp -a /etc/passwd .
    [root@linux tmp]# du -sb ; df -i .
    26948   . <== 先注意一下,這裡的容量是多少!
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda1            1537088  144016 1393072   10% /
    # 利用 du 與 df 來檢查一下目前的參數~那個 du -sb 
    # 是計算整個 /tmp 底下有多少 bytes 的容量啦!
    
    範例二:將 /tmp/passwd 製作 hard link 成為 passwd-hd 檔案
    [root@linux tmp]# ln passwd passwd-hd
    [root@linux tmp]# du -sb ; df -i .
    26948   .
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda1            1537088  144016 1393072   10% /
    # 仔細看,即使多了一個檔案在 /tmp 底下,整個 inode 與 block 的容量並沒有改變!
    [root@linux tmp]# ls -il passwd*
    1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd
    1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd-hd
    # 原來是指向同一個 inode 啊!這是個重點啊!另外,那個第二欄的連結數也會增加!
    
    範例三:將 /tmp/passwd 建立一個符號連結
    [root@linux tmp]# ln -s passwd passwd-so
    [root@linux tmp]# ls -li passwd*
    1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd
    1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd-hd
    1242806 lrwxrwxrwx  1 root root    6 Jul 23 20:02 passwd-so -> passwd
    # 仔細看喔,這個 passwd-so 指向的 inode number 不同了!這是一個新的檔案~
    # 這個檔案的內容是指向 passwd 的,你可以看到這個檔案的大小,是 6bytes ,
    # 怎麼來的?因為 passwd 共有六個字元啊!哈哈!沒錯~這個連結檔的內容只是填寫
    # 連結的目標檔案檔名而已!所以,你的連結檔檔名 (有時候含路徑) 有多長,檔案就多大!
    [root@linux tmp]# du -sb ; df -i .
    26954   .
    Filesystem            Inodes   IUsed   IFree IUse% Mounted on
    /dev/hda1            1537088  144017 1393071   10% /
    # 呼呼!整個容量與 inode 使用數都改變囉~確實如此啊!
    
    範例四:刪除原始檔案 passwd ,其他兩個檔案是否能夠開啟?
    [root@linux tmp]# rm passwd
    [root@linux tmp]# cat passwd-hd
    ......正常顯示完畢!
    [root@linux tmp]# cat passwd-so
    cat: passwd-so: No such file or directory
    # 怕了吧?!竟然無法正常的開啟這個檔案呢~
    
    Tips 鳥哥 還記得上一章當中,我們提到的 /tmp 這個目錄是幹嘛用的嗎?是給大家作為暫存檔用的啊! 所以,您會發現,過去我們在進行測試時,都會將資料移動到 /tmp 底下去練習~ 嘿嘿!因此,有事沒事,記得將 /tmp 底下的一些怪異的資料清一清先!
    要注意囉!使用 ln 如果不加任何參數的話,那麼就是 Hard Link 囉!如同上面的情況,增加了 hard link 之後,可以發現使用 ls -l 時,顯示的 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什麼事情呢?呵呵! passwd-hd 的內容還是會跟原來 passwd 相同,但是 passwd-so 就會找不到該檔案啦!就是這樣!瞭解了嗎?!

    而如果 ln 使用 -s 的參數時,就做成差不多是 Windows 底下的『捷徑』的意思( Symbolic Link,較常用! )。當你修改 Linux 下的 link 檔案時,則更動的其實是『原始檔』,呵呵, 所以不論你的這個原始檔被連結到哪裡去,只要你修改了連結檔,呵呵!原始檔就跟著變囉! 以上面為例,由於你使用 -s 的參數建立一個名為 passwd-so 的檔案,則你修改 passwd-so 時,其內容與 passwd 完全相同,並且,當你按下儲存之後,被改變的將是 passwd 這個檔案!

    此外,如果你做了底下這樣的連結:
      ln -s /bin /root/bin
    那麼如果你進入 /root/bin 這個目錄下,『請注意呦!該目錄其實是 /bin 這個目錄,因為你做了連結檔了!』所以,如果你進入 /root/bin 這個剛剛建立的連結目錄, 並且將其中的資料殺掉時,嗯! /bin 裡面的資料就通通不見了!這點請千萬注意!並不是 /root 底下的資料都是 root 的!還需要注意一下該屬性才行!(其實可以透過 pwd -P 去觀察!)

    基本上, Symbolic link 的用途比較廣,所以您要特別留意 symbolic link 的用法呢!未來一定還會常常用到的啦!


  • 關於目錄的 link 數量:
  • 或許您已經發現了,那就是,當我們以 hard link 進行『檔案的連結』時,可以發現,在 ls -l 所顯示的第二欄位會增加一才對,那麼請教,如果建立目錄時,他預設的 link 數量會是多少? 讓我們來想一想,一個『空目錄』裡面至少會存在些什麼?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那麼,當我們建立一個新目錄名稱為 /tmp/testing 時,基本上會有三個東西,那就是:
    • /tmp/testing
    • /tmp/testing/.
    • /tmp/testing/..
    而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄啊~而 /tmp/testing/.. 則代表 /tmp 這個目錄,所以說,當我們建立一個新的目錄時, 『新的目錄的 link 數為 2 ,而上層目錄的 link 數則會增加 1 』 不信的話,我們來作個測試看看:
    [root@linux ~]# ls -ld /tmp
    drwxrwxrwt  5 root root 4096 Oct 11 05:15 /tmp
    [root@linux ~]# mkdir /tmp/testing1
    [root@linux ~]# ls -ld /tmp
    drwxrwxrwt  6 root root 4096 Oct 11 13:58 /tmp
    [root@linux ~]# ls -ld /tmp/testing1
    drwxr-xr-x  2 root root 4096 Oct 11 13:58 /tmp/testing1
    
    瞧!原本的所謂上層目錄 /tmp 的 link 數量由 5 增加為 6 ,至於新目錄 /tmp/testing 則為 2 ,這樣可以理解目錄的 link 數量的意義了嗎?! ^_^

    磁碟的分割、格式化、檢驗與掛載:

    對於一個系統管理者 ( root ) 而言,磁碟的的管理是相當重要的一環,尤其近來硬碟已經漸漸的被當成是消耗品了 ..... 好了,如果我們想要在系統裡面新增一顆硬碟時,應該有哪些動作需要做的呢?有幾個動作囉:
    1. 對磁碟進行分割,以建立可用的 partition ;
    2. 對該 partition 進行格式化( format ),以建立系統可用的 filesystem;
    3. 若想要仔細一點,則可對剛剛建立好的 filesystem 進行檢驗;
    4. 在 Linux 系統上,需要建立掛載點 ( 亦即是目錄 ),並將他掛載上來;
    當然囉,在上述的過程當中,還有很多需要考慮的,例如磁碟分割槽 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 與 block 的數量應該如何規劃等等的問題。但是這些問題的決定, 都需要與您的主機用途來加以考量的~所以,在這個小節裡面,鳥哥僅會介紹幾個動作而已, 更詳細的設定值,則需要以您未來的經驗來參考囉!

    磁碟分割: fdisk

    [root@linux ~]# fdisk [-l] 裝置名稱
    參數:
    -l  :輸出後面接的裝置所有的 partition 內容。若僅有 fdisk -l 時,
          則系統將會把整個系統內能夠搜尋到的裝置的 partition 均列出來。
    範例:
    範例:查閱您的第一顆硬碟內的相關資訊
    [root@linux ~]# fdisk /dev/hda  <== 仔細看,不要加上數字喔!
    The number of cylinders for this disk is set to 2494.
    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)
    # 在你進入 fdisk 這支程式的工作畫面後,如果您的硬碟太大的話,就會出現如上訊息。
    # 這個訊息僅是在告知你,因為某些舊版的軟體與作業系統並無法支援大於 1024
    # 磁柱 (cylinter) 後的磁區使用,不過我們 Linux 是沒問題啦!
    
    Command (m for help): m   <== 輸入 m 後,就會看到底下這些指令介紹
    Command action
       a   toggle a bootable flag
       b   edit bsd disklabel
       c   toggle the dos compatibility flag
       d   delete a partition
       l   list known partition types
       m   print this menu
       n   add a new partition
       o   create a new empty DOS partition table
       p   print the partition table
       q   quit without saving changes
       s   create a new empty Sun disklabel
       t   change a partition's system id
       u   change display/entry units
       v   verify the partition table
       w   write table to disk and exit
       x   extra functionality (experts only)
    # 這裡注意一下,使用 fdisk 這支程式是完全不需要背指令的,因為按下 m 之後,
    # 立刻就會有一堆指令說明跑出來了!在上面的指令當中,比較重要的有:
    # d 刪除一個磁碟分割槽、 n 新增一個磁碟分割槽、 p 將目前的磁碟分割槽列出來、
    # q 不儲存離開!這個重要! w 寫入磁碟分割表後離開!這個危險!
    
    Command (m for help): p  <== 這裡可以輸出目前磁碟的狀態
    
    Disk /dev/hda: 20.5 GB, 20520493056 bytes <== 硬碟的資訊在這底下三行
    255 heads, 63 sectors/track, 2494 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1         765     6144831   83  Linux
    /dev/hda2             766        1147     3068415   83  Linux
    /dev/hda3            1148        1274     1020127+  82  Linux swap
    /dev/hda4            1275        2494     9799650    5  Extended
    /dev/hda5            1275        2494     9799618+  83  Linux
    # 由上面的資訊,您可以知道,我的硬碟是 20GB 的,而 Head/Sector/Cylinder
    # 的數量為 255/63/2494 ,另外,可以看到上頭的 Boot 嗎?那個地方代表有開機資訊的
    # partition !另外,那個 start 與 end 則是指每一個 partition 的開始與結束的
    # Cylinder 號碼!這樣可以瞭解我們前面一直強調的, partition 最小單位為 cylinder
    # 此外,上頭顯示的那個 Id 為主要檔案格式的代號,你可以按下 l ( L 的小寫 )
    # 就可以知道我們 linux 的 fdisk 認識多少檔案系統囉! ^_^
    # 至於 Blocks 則以 KBytes 來顯示該 partition 的容量的
    
    Command (m for help): q
    # 想要不儲存離開嗎?按下 q 就對了!不要隨便按 w 啊!
    
    範例:查閱目前系統內的所有 partition 有哪些?
    [root@linux ~]# fdisk -l
    Disk /dev/hda: 20.5 GB, 20520493056 bytes
    255 heads, 63 sectors/track, 2494 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1         765     6144831   83  Linux
    /dev/hda2             766        1147     3068415   83  Linux
    /dev/hda3            1148        1274     1020127+  82  Linux swap
    /dev/hda4            1275        2494     9799650    5  Extended
    /dev/hda5            1275        2494     9799618+  83  Linux
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdb1   *           1        3633    29182041   83  Linux
    # 由於我的這個系統有兩顆硬碟,下達 fdisk -l 的話,所有的 partition 都看到了!
    # 另外,我可以確定我的 /dev/hdb 還有剩餘空間喔!因為由上面的資訊看來,
    # 我的 /dev/hdb 的磁柱應該可以到 3736 ,但是目前只用到 3633 ,所以,
    # 就肯定還有剩餘空間拉!等一下我們就用這個來測試囉!
    
    還記得我們剛剛在 認識 EXT2 檔案系統 裡面提到的 partition 部分內容嗎?其實 fdisk 最主要的工作就是在修改『 partition table 』 而已,並沒有實際的將硬碟切切割割的啦!他會定義出某一個 partition 是由 n1 磁柱到 n2 磁柱之間這樣的資訊!因此,如果硬碟分割錯誤時,只要在 format 之前將 partition tables 復原,那麼就可以將硬碟原來的資料救回來囉!所以,一個好的管理員,有時候也會將自己的 partition table 記錄下來,以備不時之需呀!

    這個 fdisk 只有 root 才能執行,此外,請注意, 使用的『裝置名稱』請不要加上數字,因為 partition 是針對『整個硬碟裝置』而不是某個 partition 呢!所以執行 fdisk /dev/hdb1 就會發生錯誤啦!要使用 fdisk /dev/hdb 才對!那麼我們知道可以利用 fdisk 來查閱硬碟的 partition 資訊外,底下再來說一說進入 fdisk 之後的幾個常做的工作!
    Tips 鳥哥 你可以使用 fdisk 在您的硬碟上面胡搞瞎搞的進行實際操作,都不打緊, 但是請『千萬記住,不要按下 w 即可!』離開的時候按下 q 就萬事無妨囉!
  • 刪除磁碟分割槽
  • 剛剛的 fdisk 結果當中,我知道我的 /dev/hdb 僅有 /dev/hdb1 而已, 那麼假設我要將這個 /dev/hdb1 刪除的話,可以怎麼做?
    1. fdisk /dev/hdb :先進入 fdisk 畫面;
    2. p :先看一下磁區的資訊,假設要殺掉 /dev/hdb1;
    3. d :這個時候會要你選擇一個 partition ,就選 1 囉!
    4. w (or) q :按 w 可儲存到磁碟資料表中,並離開 fdisk ;當然囉, 如果你反悔了,呵呵,直接按下 q 就可以取消剛剛的刪除動作了!
    [root@linux ~]# fdisk /dev/hdb
    1. 先看看整個結果是如何~
    Command (m for help): p
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdb1   *           1        3633    29182041   83  Linux
    
    2. 按下 d 給他刪除吧!
    Command (m for help): d
    Selected partition 1
    # 因為我們這個磁碟僅有 1 個 partition ,所以系統會自動幫我們~
    
    Command (m for help): p
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    # 『看』不見了! partition 就這樣不見了!
    
    Command (m for help): q
    # 鳥哥這裡僅是做一個練習而已,所以,按下 q 就能夠離開囉~
    

  • 新增磁碟分割槽
  • 那麼如何新增 partition 呢?以鳥哥剛剛的 /dev/hdb 為例, 我的 /dev/hdb 有一個 /dev/hdb1 ,而且還有剩餘空間,那我如何利用?
    1. fdisk /dev/hdb :先進入 fdisk 畫面中;
    2. n:新增一個磁區,這個時候系統會問你, 如果您已經具有 extended 磁區時,那麼系統會問您,您要新增的是 Primary 還是 Logical ,而如果您還沒有 extended ,那麼系統僅會問你要新增 Primary 還是 Extended。除此之外,如果您已經用完了四個 P + E 的話,那麼就僅有 Logical 可以選擇啦!請再回到剛剛說明硬碟的地方再次的複習一下吧!如果是選擇 primary 的話,請按 p ,否則請按 e (extended) 或 l (logical)。
    3. p :由於選 擇為 primary 所以就會按下 p 囉!
    4. 1-4 :primary 只允許四個, 所以這裡請按尚未被使用的那一個磁區囉!
    5. w :同樣的儲存離開囉!
    好了,假設鳥哥想要將我剛剛的 /dev/hdb 剩餘空間分為兩個分割槽, 一個是 primary ,另一個則是 logical ,且 primary 只要 100MBytes 就夠了! 其他的都分給 logical ,那可以這麼做!
    [root@linux ~]# fdisk /dev/hdb
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p   <==就是這裡!可以自行決定是 p 還是 e 喔!
    Partition number (1-4): 4  <==編號可以隨意!
    First cylinder (3634-3736, default 3634):  <==這裡按下 Enter 就會使用預設值
    Using default value 3634
    Last cylinder or +size or +sizeM or +sizeK (3634-3736, default 3736): +100M
    # 這個地方有趣了!我們知道 partition 是由 n1 到 n2 的磁柱 (cylinder),
    # 但是我們對於磁柱的大小不容易掌握!這個時候可以填入 +100M 來讓系統自動幫我們找出
    # 『最接近 100M 的那個 cylinder 號碼』!因為不可能剛好等於 100MBytes 啦!
    
    Command (m for help): p
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdb1   *           1        3633    29182041   83  Linux
    /dev/hdb4            3634        3646      104422+  83  Linux
    # 這個就是剛剛建立起來的 primary partition 囉!再繼續吧!
    
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    e
    Partition number (1-4): 2
    First cylinder (3647-3736, default 3647): <==這裡按下 Enter 就會使用預設值
    Using default value 3647
    Last cylinder or +size or +sizeM or +sizeK (3647-3736, default 3736): <==Enter
    Using default value 3736
    
    Command (m for help): p
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdb1   *           1        3633    29182041   83  Linux
    /dev/hdb2            3647        3736      722925    5  Extended
    /dev/hdb4            3634        3646      104422+  83  Linux
    # 仔細看,我們說過, 1-4 號是磁碟保留的號碼,所以這個號碼可以隨意設定,
    # 不一定要由 1 開始呢!但是,等一下做的 logical 就一定是由 5 開始累加了!
    
    Command (m for help): n
    Command action
       l   logical (5 or over)
       p   primary partition (1-4)
    l  <== 使用的是 logical 的 partition 喔!
    First cylinder (3647-3736, default 3647):<==Enter
    Using default value 3647
    Last cylinder or +size or +sizeM or +sizeK (3647-3736, default 3736):<==Enter
    Using default value 3736
    
    Command (m for help): p
    
    Disk /dev/hdb: 30.7 GB, 30735581184 bytes
    255 heads, 63 sectors/track, 3736 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdb1   *           1        3633    29182041   83  Linux
    /dev/hdb2            3647        3736      722925    5  Extended
    /dev/hdb4            3634        3646      104422+  83  Linux
    /dev/hdb5            3647        3736      722893+  83  Linux
    # 這可就 OK 囉~雖然新作出三個 partition ,不過僅有 /dev/hdb4 與 
    # /dev/hdb5 可以用啊!
    
    Command (m for help): w
    
    The kernel still uses the old table.
    The new table will be used at the next reboot.
    Syncing disks.
    # 有的時候,磁碟分割表變動之後,得要重新開機,有的則不需要~
    # 上面的訊息告訴我們,需要重新開機呢!那就 reboot 吧!
    
    透過上面的例子,您可以清楚的看到,呵呵!第一個 logical 是在 5 號呦!OK!在 fdisk 完成之後,請記得使用 mke2fs 格式化囉!另外,請注意,如果過程中進行錯誤時, 那麼趕緊按下 q 離開即可!

  • 操作環境的說明
  • 以 root 的身份進行硬碟的 partition 時,最好是在單人維護模式底下比較安全一些, 此外,在進行 fdisk 的時候,如果該硬碟某個 partition 還在使用當中, 那麼很有可能系統核心會無法重新載入硬碟的 partition table ,解決的方法就是將該使用中的 partition 給他卸載,然後再重新進入 fdisk 一遍,重新寫入 partition table ,那麼就可以成功囉!

  • 注意事項:
  • 另外,請注意一下,雖然一顆硬碟最大的邏輯磁區可以到達 63 號( 總數,包含 1~4 的 primary partition ),但是並非所有的 Linux distribution 都會將所有的邏輯磁區對應的磁碟代號都寫入系統當中,以 Red Hat 為例,他僅列出 1~16 個代碼,其他的您就得自己動手做啦!至於 Fedora 的話,他則是使用自己偵測的,當您以 fdisk 設定好了 partition table 之後,磁碟對應的磁碟代號就會自動的在您的 /dev/ 裡頭設定完成囉!不過,有的時候您還是得自己設定一下磁碟代碼啦!如何設定呢?就使用 mknod 這個指令吧!

    磁碟格式化

    [root@linux ~]# mke2fs [-bicLj] 裝置名稱
    參數:
    -b  :可以設定每個 block 的大小,目前支援 1024, 2048, 4096 bytes 三種;
    -i  :多少容量給予一個 inode 呢?
    -c  :檢查磁碟錯誤,僅下達一次 -c 時,會進行快速讀取測試;
          如果下達兩次 -c -c 的話,會測試讀寫(read-write),會很慢~
    -L  :後面可以接表頭名稱 (Label),這個 label 是有用的喔!後面會講~
    -j  :本來 mke2fs 是 EXT2 ,加上 -j 後,會主動加入 journal 而成為 EXT3。
    範例:
    範例一:將剛剛建立的 /dev/hdb5 格式化成為 ext3 吧!且名稱為 logical
    [root@linux ~]# mke2fs -j -L "logical" /dev/hdb5
    mke2fs 1.37 (21-Mar-2005)
    Filesystem label=logical
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    90432 inodes, 180723 blocks
    9036 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=188743680
    6 block groups
    32768 blocks per group, 32768 fragments per group
    15072 inodes per group
    Superblock backups stored on blocks:
            32768, 98304, 163840
    
    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 27 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    # 這樣子就能夠將我們的系統給他建立起來囉~
    
    範例二:承上題,如果將 block 改為 2048 ,且 inode 改為 4096?
    [root@linux ~]# mke2fs -j -L "logical" -b 2048 -i 4096 /dev/hdb5
    # 呈現出來的結果大致與範例一相似~不過就是 block 大小與 inode 數量會改變!
    
    這是用來將磁碟格式化成 Linux 系統檔的指令。基本上,只要寫入對的裝置檔案就可以了。 例如我們要格式化軟碟的話,或是新的硬碟 /dev/hda5 等等! 這個指令通常是在新的硬碟上面切割完之後,再加以格式化的!另外,如果要將舊的磁區格式化成 ext2 格式的話,就使用這個指令吧!進行當中顯示的訊息有點像上面的最後幾行, 系統會顯示目前的格式化的預設值!

    而如果要設定不同的 Block ,就可以使用 -b 這個參數!請注意囉,預設的情況下, Block 是 4096!此外,您也可以自訂 inode table 呢!而,當沒有指定的時候, mke2fs 使用 ext2 為格式化檔案格式,若加入 –j 時,則格式化為 ext3 這個 Journaling 的 filesystem 呦!

    上面提到的是關於將磁碟給他格式化成為 ext2/ext3 檔案系統的指令, 那麼如果想要格式化成為其他的檔案系統呢?可以直接使用 mkfs 這個指令喔! 這個指令其實是將幾個指令整合的一個功能而已!實際上,你可以參考:『 ls -l /sbin/mkfs* 』來看看系統有的、可以支援的檔案格式呢!利用 man mkfs 就能夠查閱囉!

    接下來,如果我想要製作一個可以開機進入 Linux 的軟碟片呢? 可以有底下這個作法喔!

  • mkbootdisk (製作軟碟開機片)
  • [root@linux ~]# mkbootdisk --device /dev/fd0 `uname -r`
    
    這是製作開機磁片的指令,其中,『 `uname -r` 』是目前 Linux 系統所使用的核心版本, 如果你有多個核心版本的話,你可以直接輸入核心版本。例如在鳥哥的系統中, 舊的核心還是有保留的,所以我都會至少有兩個核心,在我管理的某部主機中,核心為 2.6.11-1.1369_FC4 及 2.6.12-1.1398_FC4 ,那麼如果我要直接以 2.6.11-1.1369_FC4 來開機的話,就可以使用:
      mkbootdisk --device /dev/fd0 2.6.11-1.1369_FC4
    這個時候, mkbootdisk 就會以 /lib/modules 目錄下的資料,配合 /boot 底下的 kernel 檔案,來建立可開機的磁碟囉~建立軟碟開機片一直是個好主意! 他可以在你求助無門的時候給你莫大的幫助喔!所以,建立一個新的軟碟開機片是一個好主意啦!

  • fdformat (進行軟碟低階格式化)
  • [root@linux ~]# fdformat /dev/fd0H1440
    
    這是用來『低階格式化』軟碟的指令。( 注意:軟碟的裝置檔為 /dev/fd0 )!在上面的裝置檔案為 /dev/fd0H1440 , 其中加在 /fd0 之後的 H1440 為表示 1.44MB 的軟碟容量! 在低階格式化之後,還要將軟碟的檔案格式化為 Linux 的 ext2 之型態,則需要使用 mke2fs 指令!

    磁碟檢驗: fsck, badblocks

    現在也建立好了新的 partition 了,也 format 好了,那麼有沒有其他的關於硬碟的工作需要來進行呢? 有的,就是需要怎樣來檢查硬碟有沒有壞軌呢?那個就是 fsck 這個工具的用途啦!此外,您會發現到,在 / 這個目錄底下 ( 其實只要有掛載硬碟的那個目錄底下都有這個目錄 ) 會有一個特殊的目錄,就是『 lost+found 』這個目錄啦!對的!就是當你處理完 fsck 之後,如果程式有發現到任何的錯誤的檔案,就會將該檔案的資料給他丟到這個目錄當中,嘿嘿! 所以當你發現你的 Linux 目錄當中有這個檔案時,不要擔心,那個是正常的啦!而且 只有掛載 partition 的目錄 (就是掛載點) 才會有這個預設的目錄囉!

    還有,由於在 Linux 系統當中,為了增加系統效能,通常系統預設就是一些資料會寫在記憶體當中, 並不會直接將資料寫入硬碟裡面,這是因為記憶體的速度要比硬碟快上若干倍呀! 但是有個問題就發生了,萬一系統由於『跳電』或者是其他的莫名原因,造成系統的 shutdown 時,唉呀!怎麼辦?!系統就完蛋啦!所以囉,我們需要在某些特定的時候讓資料直接回存到硬碟之中呀! 瞭乎!這裡提供幾個慣用的指令,其中,那個 fsck 是相當重要的,請參考其用法囉!

  • fsck
    [root@linux ~]# fsck [-AtCary] 裝置名稱
    參數:
    -t  :fsck 可以檢查好幾種不同的 filesystem ,而 fsck 只是一支綜合程式而已。
          個別的 filesystem 的檢驗程式都在 /sbin 底下,您可以使用 ls -l /sbin/fsck*
          去檢查看看,就知道有幾種 filesystem 囉。預設的 FC4 情況下,至少有:
          ext2, ext3, vfat, msdos 等等 filesystem。
    -A  :依據 /etc/fstab 的內容,將所有的裝置都掃瞄一次 (通常開機過程中就會執行此一指令)
    -a  :自動修復檢查到的有問題的磁區,所以你不用一直按 y 囉!
    -r  :一定要讓使用者決定是否需要修復,這與上一個 -a 剛好相反!
    -y  :與 -a 類似,但是某些 filesystem 僅支援 -y 這個參數,所以您也可以利用 -y 啦!
    -C  :可以在檢驗的過程當中,使用一個長條圖來顯示目前的進度!
    -f  :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入
          細部檢查的,如果您想要強制 fsck 進入細部檢查,就得加上 -f 旗標囉!
    範例:
    範例一:將前面我們建立的 /dev/hdb5 這個裝置給他檢驗一下!
    [root@linux ~]# fsck -C -t ext3 /dev/hdb5 
    fsck 1.37 (21-Mar-2005)
    e2fsck 1.37 (21-Mar-2005)
    logical: clean, 11/181056 files, 21706/361446 blocks
    # 如果一切沒有問題,就會出現上述的訊息~
    
    這是用來檢查與修正硬碟錯誤的指令。注意:通常只有身為 root 且你的系統有問題的時候才使用這個指令,否則在正常狀況下使用此一指令, 可能會造成對檔案的危害!通常使用這個指令的場合都是在系統出現極大的問題,導致你在 Linux 開機的時候得進入單人單機模式下進行維護的行為時,才必須使用此一指令! 另外,如果你懷疑剛剛格式化成功的硬碟有問題的時後,也可以使用 fsck 來檢查一下硬碟呦!其實就有點像是 Windows 的 scandisk 啦!此外,由於 fsck 在掃瞄硬碟的時候,可能會造成部分 filesystem 的損壞,所以『執行 fsck 時, 被檢查的 partition 務必不可掛載到系統上!亦即是需要在卸載的狀態喔!

    常常我們會發現,在比較老舊的機器上 ( 例如鳥哥的 p-166 ),如果主機不正常的關機 (例如跳電囉!),那麼硬碟很可能會出現錯誤的狀況!這個時候 Linux 就無法正常的開機!這個時候就需要輸入 root 的密碼,以登入單人維護模式 (run level 1),然後下達 fsck -y /dev/hdxxx 來檢查你的硬碟!等到確認成功之後,就使用 reboot 來重新啟動吧!

  • badblocks
    [root@linux ~]# badblocks -[svw] 裝置名稱
    參數:
    -s  :在螢幕上列出進度
    -v  :可以在螢幕上看到進度
    -w  :使用寫入的方式來測試,建議不要使用此一參數,尤其是待檢查的裝置已有檔案時!
    範例:
    [root@linux ~]# badblocks -sv /dev/hdb5
    Checking blocks 0 to 722893
    Checking for bad blocks (read-only test): done                        893
    Pass completed, 0 bad blocks found.
    
    這是用來檢查硬碟或軟碟磁區有沒有壞軌的指令!跟 Windows 的 scandisk 相同功能啦!不過由於 fsck 的功能比較強,所以目前大多已經不使用這個指令了!

  • sync
    在正常的狀況中,由於為了增加系統的效率,因此, 很多時候進行中的程式產生的程序之暫存檔案都不會直接存至磁碟機當中, 而是記憶在記憶體當中!由於記憶體的資料傳遞速度比磁碟機快了幾十倍, 所以如此一來將有助於整個系統的效率!!然而這也產生了一個困擾, 那就是當你的系統不正常關機的時候,可能會使得一些已經經過改變, 卻還沒有存入磁碟中的資料遺失(因為還在記憶體當中!)所以這個時候 sync 的功能就相當的大了! 因為他可以直接將系統暫存在記憶體當中的資料回存寫入磁碟當中,呵呵! 很棒吧!但是需要注意你的系統核心 (kernel) 必須要有支援 sync 才行(目前幾乎一定都會支援的啦!)
  • 磁碟掛載與卸載

    要將上面我們所建立起來的磁碟檔案系統或軟碟正式的在 Linux 上面啟用時,一定需要將他掛載上檔案系統! 而所謂的『掛載點』則是該 partition 所在的目錄,且在該目錄下的所有目錄都歸在該 partition 所有!假設一個情況好了,我們的 / 為 /dev/hda1 而 /home 為 /dev/hda2 ,那麼在 /home/test 底下的咚咚就也都歸 /dev/hda2 這個 partition 所有囉!而需要特別留意的是,由於掛載檔案系統需要掛載點, 所以掛載的時候得先建立起掛載的目錄才行

    除此之外,如果您要用來掛載的目錄裡面並不是空的,那麼掛載了檔案系統之後, 那麼原目錄下的東西就會暫時的消失。舉個例子來說,假設您的 /home 原本是屬於根目錄 / 底下的 partition 所有,底下原本就有 /home/test 與 /home/vbird 兩個目錄。然後你想要加入新的硬碟,並且直接掛載 /home 底下,那麼當您掛載上新的 partition 時,則 /home 目錄顯示的是該 partition 的內容,至於原先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了!注意喔!並不是被覆蓋掉, 而是暫時的隱藏了起來,等到 partition 被 umount 之後, 則該目錄的內容就會再次的跑出來啦!

    而要將檔案系統掛載到我們的 Linux 系統上,就要使用 mount 這個指令啦! 不過,這個指令真的是博大精深~粉難啦!我們學簡單一點啊~ ^_^
    [root@linux ~]# mount -a
    [root@linux ~]# mount [-tonL]  裝置名稱代號  掛載點
    參數:
    -a  :依照 /etc/fstab 的內容將所有相關的磁碟都掛上來!
    -n  :一般來說,當我們掛載檔案系統到 Linux 上頭時, Linux 會主動的將
          目前的 partition 與 filesystem 還有對應的掛載點,都記錄到 /etc/mtab
          那個檔案中。不過,有些時刻 (例如不正常關機導致一些問題,而進入單人模式)
          系統無法寫入 /etc/mtab 時,就可以加上 -n 這個參數來略過寫入 mtab 的動作。
    -L  :系統除了利用裝置名稱代號 (例如 /dev/hda1) 之外,還可以利用 partition 
          的表頭名稱 ( Label ) 來進行掛載喔!所以,最好為您的 partition 取一個
          在您系統當中獨一無二的名稱吧!
    -t  :您的 Linux 支援的檔案格式,就寫在這裡吧!舉例來說,我們在上面建立 
          /dev/hdb5 是 ext3 檔案系統,那麼要掛載時,就得要加上 -t ext3 
          來告知系統,用 ext3 的檔案格式來掛載該 partition 呢!
          至於系統支援的 filesystem 類型在 /lib/modules/`uname -r`/kernel/fs 當中。
          常見的有:
             ext2, ext3, reiserfs, 等 Linux 慣用 filesystem
             vfat, msdos 等 Windows 常見 filesystem
             iso9660 為光碟片的格式
             nfs, smbfs 等為網路相關檔案系統。這部分未來我們會在網路方面提及!
          若 mount 後面沒有加 -t 檔案系統格式時,則 Linux 在預設的情況下,
          會主動以 /etc/filesystems 這個檔案內規範的檔案系統格式
          來嘗試主動的掛載喔!
    -o  :後面可以接一些掛載時,額外加上的參數喔!比方說帳號、密碼、讀寫權限等:
          ro, rw:       此 partition 為唯讀(ro) 或可讀寫(rw)
          async, sync:  此 partition 為同步寫入 (sync) 或非同步 (async),這個與我們
                        之前提到的檔案系統運作方式有關,預設是 async
          auto, noauto: 允許此 partition 被以 mount -a 自動掛載(auto)
          dev, nodev:   是否允許此 partition 上,可建立裝置檔案? dev 為可允許
          suid, nosuid: 是否允許此 partition 含有 suid/sgid 的檔案格式?
          exec, noexec: 是否允許此 partition 上擁有可執行 binary 檔案?
          user, nouser: 是否允許此 partition 讓 user 執行 mount ?一般來說,
                        mount 僅有 root 可以進行,但下達 user 參數,則可讓
                        一般 user 也能夠對此 partition 進行 mount 。
          defaults:     預設值為:rw, suid, dev, exec, auto, nouser, and async
          remount:      重新掛載,這在系統出錯,或重新更新參數時,很有用!
    範例:
    範例一:將剛剛建立的 /dev/hdb5 掛載到 /mnt/hdb5 上面!
    [root@linux ~]# mkdir /mnt/hdb5
    [root@linux ~]# mount -t ext3 /dev/hdb5 /mnt/hdb5
    [root@linux ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    ....中間省略.....
    /dev/hdb5               700144     20664    643336   4% /mnt/hdb5
    
    範例二:掛載光碟!
    [root@linux ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom
    [root@linux ~]# mount /dev/cdrom 
    # 上面的參數當中提到,如果沒有加上 -t 這個參數時,系統會主動的以
    # /etc/filesystems 裡面規範的內容給他測試一下是否掛載~另外,
    # 因為我們的 /etc/fstab 裡面會規範 /dev/cdrom 應該掛載到那個掛載點,
    # 因此,直接下達 mount /dev/cdrom 也是可以的喔!(當然要看/etc/fstab設定啦!)
     
    範例三:掛載 Window fat 軟碟!
    [root@linux ~]# mount -t vfat /dev/fd0 /mnt/floppy
    
    範例四:將 / 重新掛載,並加入參數為 rw !
    [root@linux ~]# mount -o remount,rw /
    
    範例五:將 Label 名為 logical 的 partition 掛載到 /mnt/hdb5 中
    [root@linux ~]# mount -t ext3 -L logical /mnt/hdb5
    
    範例六:將系統所有的以掛載的 partition 資料列出來
    [root@linux ~]# mount
    /dev/hda1 on / type ext3 (rw)
    /dev/proc on /proc type proc (rw)
    /dev/shm on /dev/shm type tmpfs (rw)
    /dev/hda5 on /home type ext3 (rw)
    /dev/hdb5 on /mnt/hdb5 type ext3 (rw)
    # 嗯!不加任何參數,則 mount 會將目前系統的所有 partition
    # 與相關對應的 filesystem 及 mount point 都列出來!
    
    在預設的情況下, mount 這個指令只有 root 才能執行! 如果您想要將整個系統裡面記錄的 filesystem 與 mount point 對應的資料 (記錄在 /etc/fstab 檔中!), 全部都掛載上來,那麼請執行:
      mount -a
    就可以依照 /etc/fstab 的參數內容將所有的磁碟給他重新掛上去!此外,需要注意的是,由於 Linux 系統中,每一個路徑都有可能是一個獨立的磁區系統, 所以需要將每個磁區系統都掛上各自的掛載點!詳細的內容請回去參考一下上一篇 Linux 檔案系統 的說明。另外, 由於各個磁區的檔案系統可能並不相同,所以您必須先要瞭解該磁區的檔案系統, 這樣才可以進行 mount 的工作!如何知道該磁碟的檔案格式呢?可以使用 fdisk 來顯示的功能即可!

    另外,如果您沒有加上 -t 的參數,那麼系統會預設嘗試以 /etc/filesystems 內的檔案系統格式來測試一下是否可以將裝置掛載上來呢!

    請注意呦!由於 mount 之後的 partition 就已經被設定在使用了, 所以,您不可以使用 fsck 檢查該 partition 呢!否則可能會造成 filesystem 的損毀~ 因此,你就必須要將該 partition 給卸載才行! 可以利用 umount 來卸載喔!

    另外,我們也可以利用 mount 來將某個目錄掛載到另外一個目錄去喔! 這並不是掛載檔案系統,而是額外掛載某個目錄的方法! 其實可以利用 link file 來達到底下範例的功能啦! ^_^
    範例一:將 /home 這個目錄暫時掛載到 /tmp/home 底下:
    [root@linux ~]# mkdir /tmp/home
    [root@linux ~]# mount --bind /home /tmp/home
    [root@linux ~]# ls -lid /home/ /tmp/home
    159841 drwxr-xr-x  6 root root 4096 May 30 20:07 /home/
    159841 drwxr-xr-x  6 root root 4096 May 30 20:07 /tmp/home
    
    範例二:將 /tmp/home 卸載:
    [root@linux ~]# umount /tmp/home
    
    看起來,其實兩者連結到同一個 inode 嘛!! ^_^ 沒錯啦!透過這個 mount --bind 的功能, 您可以將某個目錄掛載到其他目錄去喔!而並不是整塊 filesystem 的啦!

  • umount (將裝置檔案卸載)
  • [root@linux ~]# umount 裝置代號或掛載點
    [root@linux ~]# umount /dev/hdb5
    [root@linux ~]# umount /mnt/hdb5
    
    就是直接將 mount 上來的檔案系統給他卸載即是!卸載之後,可以使用 df 看看是否還存在呢?! 此外,也可以利用 -f 參數將想要卸載的 partition 強制卸載!此外, 卸載的方式,可以下達裝置 (如 /dev/hdb5) 或掛載點 (如 /mnt/hdb5),均可接受啦!

    磁碟參數修訂:

    某些時刻,您可能會希望修改一下目前磁碟的一些相關資訊,舉例來說,磁碟的 Label , 或者是 journal 的參數,或者是其他硬碟運作時的相關參數 (例如 DMA 啟動與否~)。 這個時候,就得需要底下這些相關的指令功能囉~

  • mknod
  • [root@linux ~]# mknod 裝置名稱 [bcp] [Major] [Minor]
    參數:
    裝置種類:
       b  :設定裝置名稱成為一個周邊儲存設備檔案,例如硬碟等;
       c  :設定裝置名稱成為一個周邊輸入設備檔案,例如滑鼠/鍵盤等;
       p  :設定裝置名稱成為一個 FIFO 檔案;
    Major :主要裝置代碼;
    Minor :次要裝置代碼;
    範例:
    範例一:建立 /dev/hda10 這個磁碟儲存裝置
    [root@linux ~]# mknod /dev/hda10 b 3 10
    # 上面那個 3 與 10 是有意義的,不要隨意設定啊!
    
    還記得我們說過,在 Linux 底下所有的裝置都以檔案來代表吧!? 但是那個檔案如何代表該裝置呢?很簡單!就是透過檔案的 major 與 minor 數值來替代的~所以,那個 major 與 minor 數值是有特殊意義的, 不是隨意設定的喔!舉例來說,如果以硬碟裝置來說明,那麼 /dev/hda 到 /dev/hdd 的 major 與 minor 代碼是:

    硬碟代號MajorMinor
    /dev/hda30~63
    /dev/hdb364~127
    /dev/hdc220~63
    /dev/hdd2264~127

    此外, mknod 也可以用來製作 FIFO 類型的檔案喔!更多與 Linux 核心有關的裝置及裝置代號可以參考:
  • e2label
  • [root@linux ~]# e2label 裝置名稱  新的Label名稱
    [root@linux ~]# e2label /dev/hdb5 hdb5
    [root@linux ~]# dumpe2fs -h /dev/hdb5
    Filesystem volume name:   hdb5
    .....其他省略.....
    
    這個東西也挺有趣的,主要的功能是用來修改『磁碟的表頭資料』,也就是 label 啦。 那是甚麼東西呢?如果你使用過 Windows 的檔案總管的話,那麼應該會曉得, 每個磁碟機代號後面都有個名稱吧,呵呵!那個就是 label 囉。這個東西除了有趣之外, 也會被使用到一些設定檔案當中,舉例來說,當我們在掛載磁碟的時候,除了利用磁碟的代號之外 (/dev/hdxx) 也可以直接利用磁碟的 label 來作為掛載的磁碟掛載點喔!基本上, 就是那個 /etc/fstab 檔案的設定囉!

    因為某些 distribution 為了方便,他們是以 Label 來做為磁碟掛載的依據, 這樣有好有壞啦!
    • 優點:不論硬碟代號怎麼變,不論您將硬碟插在那個 IDE 介面 (IDE1 或 IDE2 或 master 或 slave 等),由於系統是透過 Label ,所以,磁碟插在那個介面將不會有影響。

    • 缺點:如果插了兩顆硬碟,剛好兩顆硬碟的 Label 有重複的,那就慘了~ 因為系統會無法判斷那個磁碟分割槽才是正確的!
    所以,鳥哥通常還是比較喜歡直接利用磁碟代號來掛載啦! 不過,如果沒有特殊需求的話,那麼利用 Label 來掛載也成! 但是您就不可以隨意修改 Label 的名稱了

  • tune2fs
  • [root@linux ~]# tune2fs [-jlL] 裝置代號
    參數:
    -j  :將 ext2 的 filesystem 轉換為 ext3 的檔案系統;
    -l  :類似 dumpe2fs -h 的功能~將 superblock 內的資料讀出來~
    -L  :類似 e2label 的功能,可以修改 filesystem 的 Label 喔!
    範例:
    [root@linux ~]# tune2fs -l /dev/hdb5
    
    這個指令的功能其實很廣泛啦~上面鳥哥僅列出很簡單的一些參數而已, 更多的用法請自行參考 man tune2fs 。比較有趣的是,如果您的某個 partition 原本是 ext2 的檔案系統,如果想要將他更新成為 ext3 檔案系統的話, 利用 tune2fs 就可以很簡單的轉換過來囉~

  • hdparm
  • 如果您的硬碟是有 DMA 模式功能的,但是系統卻沒有啟動他,那麼您的硬碟存取效能可能會降低一半以上~ 所以,當然要啟動 DMA 啦~那麼如何啟動?就用 hdparm 啊! 不過, hdparm 裡頭有很多很進階的參數設定值,一般來說, 不很建議大家隨意修訂~很容易造成硬碟的掛點喔! 用這個指令時,最多是啟動 DMA 模式,以及測試硬碟的存取效能就好了~ 真的不要隨意更動其他參數喔!除非您真的知道自己在幹嘛~
    [root@linux ~]# hdparm [-icdmXTt] 裝置名稱
    參數:
    -i  :系統在開機的過程當中,會利用本身核心的驅動程式(模組)來測試硬碟,
          利用 -i 參數,可將這些測試值取出來,這些值不一定是正確的,
          不過,卻可以提供我們一個參考值的依據!
    -c  :設定 32-bit (32位元)存取模式。這個 32 位元存取模式指的是在硬碟在與 
          PCI 介面之間傳輸的模式,而硬碟本身是依舊以 16 位元模式在跑得!
          預設的情況下,這個設定值都會被打開,建議直接使用 c1 即可!
    -d  :設定是否啟用 dma 模式, -d1 為啟動, -d0 為取消;
    -m  :設定同步讀取多個 sector 的模式。一般來說,設定此模式,可降低系統因為
          讀取磁碟而損耗的效能~不過, WD 的硬碟則不怎麼建議設定此值~
          一般來說,設定為 16/32 是最佳化,不過,WD 硬碟建議值則是 4/8 。
          這個值的最大值,可以利用 hdparm -i /dev/hda 輸出的 MaxMultSect
          來設定喔!一般如果不曉得,設定 16 是合理的!
    -X  :設定 UtraDMA 的模式,一般來說, UDMA 的模式值加 64 即為設定值。
          並且,硬碟與主機板晶片必須要同步,所以,取最小的那個。一般來說:
          33 MHz DMA mode 0~2 (X64~X66)
          66 MHz DMA mode 3~4 (X67~X68)
          100MHz DMA mode 5   (X69)
          如果您的硬碟上面顯示的是 UATA 100 以上的,那麼設定 X69 也不錯!
    -T  :測試暫存區 cache 的存取效能
    -t  :測試硬碟的實際存取效能 (較正確!) 
    範例:
    範例一:取得我硬碟的最大同步存取 sector 值與目前的 UDMA 模式
    [root@linux ~]# hdparm -i /dev/hda
     Model=ST320430A, FwRev=3.07, SerialNo=7BX02236
     Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
     RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
     BuffType=unknown, BuffSize=512kB, MaxMultSect=16, MultSect=16
     CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=40079088
     IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
     PIO modes:  pio0 pio1 pio2 pio3 pio4
     DMA modes:  mdma0 mdma1 mdma2
     UDMA modes: udma0 udma1 udma2 udma3 *udma4
     AdvancedPM=no WriteCache=enabled
     Drive conforms to: device does not report version:  1 2 3 4
    # 在輸出的資料中,有幾個比較重要的,除了 MaxMultSec 這個數值外,
    # 那個 UDMA modes: 會顯示目前的 UDMA 模式 (有 * 號的那個為目前的值)。
    
    範例二:取得我主機板上面關於 IDE 的速度限制
    [root@linux ~]# lspci -v
    00:07.1 IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master 
    IDE (rev 10) (prog-if 8a [Master SecP PriP])
            Subsystem: VIA Technologies, Inc. VT8235 Bus Master ATA133/100/66/33 IDE
            Flags: bus master, medium devsel, latency 32
            I/O ports at d000 [size=16]
            Capabilities: [c0] Power Management version 2
    # 我可以透過 lspci 來直接取得 PCI 介面上的各個裝置設備。
    # 其中,可以找到 IDE 介面,並從中找到關於這個介面可接受的速度呢!
    
    範例三:啟動我的 UDMA 在 mode 4 喔~
    [root@linux ~]# hdparm -d1 -c1 -X68 /dev/hda
    # 由範例一與範例二,鳥哥的主機板上面大概僅能支持到 UDMA 66 吧~
    # 那就是 mode4 囉~所以, X = 64+4 = 68 ,因此,設定就是 -X68 囉~
    
    範例四:測試這顆硬碟的讀取效能
    [root@linux ~]# hdparm -Tt /dev/hda
    /dev/hda:
     Timing cached reads:   544 MB in  2.01 seconds = 270.28 MB/sec
     Timing buffered disk reads:   80 MB in  3.01 seconds =  26.56 MB/sec
    # 我的機子沒有很好啦~這樣的速度.....差強人意~
    
    我們都知道目前的 IDE 硬碟主要的傳輸模式為 ATA 模式,最近 (2002年)已經出到了 ATA 133 了!不過,傳統上, ATA 66 就已經很厲害了!新的 IDE 硬碟也沒有辦法完全利用 ATA 100 呢!但是,你知道嗎?有沒有開啟 ATA 這個傳輸通道的 DMA 模式, 對於硬碟的存取效率差很大呦!

    這個指令必須要 root 才能執行!此外,需要特別注意, -X 這個參數是很危險的參數設定, 除非您非常瞭解您的硬碟架構,否則不建議自行設定,因為 manual page 上面就有說明到這一點~~不過,無論如何,目前大於 2GB 以上的硬碟至少都已經支援了 DMA 33 了!因此,使用 -X66 應該都是可行的!而如果您的硬碟是很新的, 那麼 -X69 應該是沒有問題才是!不過,還是要 hdparm -i /dev/hd[a-d] 去檢查看看!

    設定開機掛載:

    在上一小節裡面,我們提到了硬碟的分割與格式化,同時還提到了如何掛載的問題等等, 在這個小節當中,我們就持續的來討論,那麼 mount 還可以做哪些事情呢? 還有,如果想要一開機就讓系統自動的幫我們將 partition 掛載起來,又該如何呢?

    各式磁碟掛載與 中文編碼掛載還有 USB 隨身碟:

    這裡再次強調一個觀念,在 Windows 底下,磁碟分割是以 A, B, C, D, .... 等等的方式來劃分的,然而在 Linux 或 Unix 系統之下,卻是以目錄來代表,也就是說, 一個目錄很可能就是一個磁區了! 舉個例子來說,通常 Linux 預設的軟碟掛載的地點在 /mnt/floppy 這裡!呵呵!那麼如果你需要軟碟的資料時,就將 /dev/fd0 這一個裝置(前面提過囉!這個是周邊存取裝置的一個設備檔案類型)掛上 /mnt/floppy 就可以啦!然後你進入到 /mnt/floppy 就可以讀取軟碟的資料囉!

  • 掛載軟碟
  • 很多朋友常常會使用到軟碟,尤其是在網路有問題的時候,那麼如何使用 Linux 將軟碟掛上來呢?!首先,您給先瞭解你的磁片檔案的格式,例如 Linux 的檔案格式( ext2 )與 Windows 的檔案格式( vfat )是不一樣的!分別可以使用如下的方式掛上來:
    [root@linux ~]# mount -t ext2 /dev/fd0 /media/floppy
    [root@linux ~]# mount -t vfat /dev/fd0 /media/floppy
    [root@linux ~]# umount /media/floppy
    
    所以囉!即使是 Windows 格式的檔案,在 Linux 底下仍然是可以讀取的到的呦!另外, 要注意的是,即使你使用軟碟完畢之後,一定要將 /media/floppy 卸載之後才可以取出軟碟片喔!不然系統會一直告訴你發生錯誤囉!而在卸載 /media/floppy 的時候,你一定不能在該目錄底下,否則會發生錯誤訊息喔! 而如果載入的格式不符合,系統也不會將該軟碟掛上來的呦!好了,那麼怎麼製作 ext2 的軟碟呢?簡單的很,就使用 mke2fs /dev/fd0 就行啦!

  • 掛載 Windows 磁碟
  • 如果萬一你在安裝系統的時候忘記將 Windows 的 VFAT 格式的磁區 mount 上你的 Linux 時,該怎麼辦?!這種現象最常發生在多系統共存的環境中!例如在原有的 Windows 98 或 Win2000 上面安裝 Linux ,但是結果卻忘記將該磁區掛載上來!嗯!這樣需要重新安裝嗎?! 當然不需要了!又不是被入侵!那麼該如何掛載上來呢?!

    就如同前面說的,由於一個目錄可能代表了一個磁區,因此你必須要先建立一個目錄, 然後再將此磁區掛載上你的 Linux 目錄,就可以啦!另外,由於需要將磁區掛在目錄下, 所以你還得需要瞭解你的 Windows 磁區是在哪一個硬碟周邊中喔!如何知道你的 Windows 磁區呢?就使用 fdisk 吧!使用 fdisk -l 就能夠知道囉~

    那麼假設我的 windows 的 VFAT filesystem 是在 /dev/hda1 ,而我想要將該 partition 掛載到 /mnt/win98 ,該如何做?
    [root@linux ~]# mkdir /mnt/win98
    [root@linux ~]# mount -t vfat /dev/hda1 /mnt/win98
    [root@linux ~]# mount -t vfat -o iocharset=cp950 /dev/hda1 /mnt/win98
    
    如此一來就將 Windows 的系統掛到 Linux 裡面囉!簡單吧!請注意, 上面那個第三行所使用的參數可以讓您的 Windows 98 的磁區當中的檔案顯示出正確的中文呦! 因為加入了中文編碼啊! ^_^

  • 掛載 USB 隨身碟
  • 以現在的科技來說(2005年),軟碟與光碟不再是最佳的攜帶工具了~ 最佳的攜帶儲存設備應該是 USB 隨身碟或者是隨身硬碟~那麼我們可以掛載 USB 隨身碟嗎?!呵呵!當然可以啊~不過.....要我們的 Linux 捉的到 USB 才行~ 不過,您不需要擔心,因為,目前的 distribution 均會主動的載入 USB 的模組, 所以,您只要插入 USB 隨身碟,嘿嘿!我們的 Linux 幾乎沒有問題,一定可以捉到的!

    捉到 USB 隨身碟之後,再利用 fdisk -l 列出所有的 partition ,您會發現, 系統中怎麼會多出 /dev/sda[??] 的 SCSI 硬碟啊?!不會吧!系統這麼好?? 呵呵!不是啦~其實 USB 硬碟的代號也是 /dev/sd[a-??] 的代號, 第一個 USB 代號為 /dev/sda ,而如果該 USB 硬碟還有 partition 的話, 那就會有一些號碼出現了~如果是隨身碟,通常只有 /dev/sda1 而已啦~ 好,那就假設您的隨身碟是 /dev/sda1 好了,那麼將他掛載到 /mnt/usb ,要怎麼做?
    [root@linux ~]# mkdir /mnt/usb
    [root@linux ~]# mount -t vfat /dev/sda1 /mnt/usb
    
    上頭是假設您的 USB 隨身碟使用的是 FAT 的 Windows 檔案格式而設定的。 如果您的隨身碟是 NTFS 的 Windows 2000 檔案格式,那就比較麻煩, 因為 FC4 預設情況下,並不支援這個檔案系統的~ 如果您執意要掛載 NTFS 的檔案格式,那麼..... 請參考底下這個計畫的網站囉~

    開機掛載 /etc/fstab 及 /etc/mtab

    剛剛上面說了許多,那麼可不可以在開機的時候就將我要的磁區都掛好呢?!這樣我就不需要每次進入 Linux 系統都還要在掛載一次呀!當然可以囉!那就直接到 /etc/fstab 裡面去修修就行囉!不過,在開始說明前,這裡要先跟大家說一說系統掛載的一些限制:
    • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
    • 其它 mount point 必須為已建立的目錄﹐可任意指定﹐但一定要遵守必須的系統目錄架構原則
    • 所有 mount point 在同一時間之內﹐只能掛載一次。
    • 所有 partition 在同一時間之內﹐只能掛載一次。
    • 如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
    好了,那麼我們進入 /etc/fstab 看一看吧:
    [root@linux ~]# cat /etc/fstab
    # Device    Mount point   filesystem parameters  dump fsck
    LABEL=/     /              ext3    defaults        1 1
    /dev/hda5   /home          ext3    defaults        1 2
    /dev/hda3   swap           swap    defaults        0 0
    /dev/hdc    /media/cdrom   auto    pamconsole,exec,noauto,managed 0 0
    /dev/devpts /dev/pts       devpts  gid=5,mode=620  0 0
    /dev/shm    /dev/shm       tmpfs   defaults        0 0
    /dev/proc   /proc          proc    defaults        0 0
    /dev/sys    /sys           sysfs   defaults        0 0
    
    其實這個 /etc/fstab 就是將我們使用 mount 來掛載一個裝置到系統的某個掛載點, 所需要下達的指令內容,將這些內容通通寫到 /etc/fstab 裡面去,而讓系統一開機就主動掛載囉~ 那麼 mount 下達指令時,需要哪些參數?不就是『裝置代號、掛載點、檔案系統類別、參數』等等, 而我們的 /etc/fstab 則加入了兩項額外的功能,分別是備份指令 dump 的執行與否, 與是否開機進行 fsck 掃瞄磁碟呢~

    我這個人比較龜毛一點,因為某些 distributions 的 /etc/fstab 檔案排列方式蠻醜的, 雖然每一欄之間只要以空白字元分開即可,但就是覺得醜,所以通常鳥哥就會自己排列整齊, 並加上註解符號,就是 # 字號,來幫我記憶這些資訊!由上面的說明,我們知道 /etc/fstab 內總共有六欄,分別來談一談每一欄的內容吧!
    1. 磁碟裝置代號或該裝置的 Label
      這個就是裝置代號啦!將您需要的裝置代號給他填上去吧!! 不過,還記得我們的 filesystem 可以擁有標頭名稱吧 (Label)? 沒錯,我們也可以利用 Label 來掛載檔案系統喔!例如上表當中的特殊字體的第一行, 我的根目錄 (/) 就是以 Label 名稱為 / 的磁碟分割槽來掛載的啊! 利用 label 掛載時,您必須要知道您的磁碟內的 label 名稱,可以利用 dumpe2fs 來讀取, 也可以利用 e2label 來更改標頭名稱啊。 在知道了 label 名稱後,最後就可以利用 LABEL=(your label name) 來設定您的裝置囉~
      Tips 鳥哥 記得有一次有個網友寫信給鳥哥,他說,依照 e2label 的設定去練習修改自己的 partition 的 Label name 之後,卻發現,再也無法順利開機成功! 後來才發現,原來他的 /etc/fstab 就是以 Label name 去掛載的。但是因為在練習的時候, 將 Label name 改名字過了,導致無法在開機的過程當中順利搜尋到~所以啦, 各位親愛的朋友,這裡再次的強調,利用裝置名稱 (ex> /dev/hda1) 來掛載 partition 時, 雖然是被固定死的,所以您的硬碟不可以隨意插在任意的插槽,不過他還是有好處的。 而使用 Label name 來掛載,雖然就沒有插槽方面的問題,不過,您就得要隨時注意您的 Label name 喔!尤其是新增硬碟的時候! ^_^
    2. 掛載點 (mount point):
      就是掛載點啊!掛載點是什麼?一定是目錄啊~要知道啊!!!

    3. 磁碟分割槽的檔案系統
      就如同我們在這個章節一開始就談到的, Linux 在傳統上面,使用的是 ext2/ext3 等檔案系統, 目前則加入了很多日誌式檔案系統,例如 reiserfs 及 XFS 等檔案系統的支援。 此外,存在已久的 Windows vfat, msdos 及 iso9660 的光碟檔案系統, 還有網路檔案系統如 nfs, smbfs 等等,都可以被支援。這個欄位就是寫這些檔案系統的地方啊!

    4. 檔案系統參數
      每個檔案系統還有很多參數可以加入的,例如中文編碼的 iocharset=big5,codepage=950 之類的,當然還有很多常見的參數, 雖然之前在 mount 已經提過一次,這裡我們利用表格的方式再次的說明一下:
      參數內容意義
      async/sync
      非同步/同步
      是否允許磁碟與記憶體中的資料以同步寫入的動作?使用 async 這個非同步寫入的方式會比較快速一些。
      auto/noauto
      自動/非自動
      在開機的時候是否自動掛載該磁區?既然設定在這個區域內了, 當然希望開機的時候自動掛載囉!
      rw/ro
      可讀寫/唯讀
      讓該磁區以可讀寫或者是唯讀的型態掛載上來,如果是 vfat 之類的非 Linux 傳統磁區,您不想讓 Linux 變更的話,那麼使用 ro 也不錯!能夠提供有效的保護呢!
      exec/noexec
      可執行/不可執行
      限制在此檔案系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的, 那麼可以設定為 noexec 會比較安全,相對的,會比較麻煩!
      user/nouser
      允許/不允許使用者掛載
      是否允許使用者使用 mount 指令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 囉,因為太不安全了,因此這裡應該要設定為 nouser 囉!
      suid/nosuid
      具有/不具有 suid 權限
      該檔案系統是否允許 SUID 的存在?一般而言,如果不是 Linux 系統的磁區,而是一般資料的 partition ,那麼設定為 nosuid 確實比較安全一些!畢竟有 SUID 是蠻可怕的一件事。
      usrquota 注意名稱是『 usrquota 』不要拼錯了!這個是在啟動 filesystem 支援磁碟配額模式,更多資料我們在第四篇再談。
      grpquota 注意名稱是『grpquota』,啟動 filesystem 對群組磁碟配額模式的支援。
      defaults 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上,預設情況使用 defaults 設定即可!

    5. 能否被 dump 備份指令作用
      在 Linux 當中,可以利用 dump 這個指令來進行系統的備份的。而 dump 指令則會針對 /etc/fstab 的設定值,去選擇是否要將該 partition 進行備份的動作呢! 0 代表不要做 dump 備份, 1 代表要進行 dump 的動作。 2 也代表要做 dump 備份動作, 不過,該 partition 重要度比 1 小。

    6. 是否以 fsck 檢驗磁區
      開機的過程中,系統預設會以 fsck 檢驗我們的 partition 內的 filesystem 是否完整 (clean)。 不過,某些 filesystem 是不需要檢驗的,例如虛擬記憶體 swap ,或者是特殊檔案系統, 例如 /proc 與 /sys 等等。所以,在這個欄位中,我們可以設定是否要以 fsck 檢驗該 filesystem 喔。 0 是不要檢驗, 1 是要檢驗, 2 也是要檢驗,不過 1 會比較早被檢驗啦! 一般來說,根目錄設定為 1 ,其他的要檢驗的 filesystem 都設定為 2 就好了。

    所以說,如果我想要將我們剛剛練習時,建立的 /dev/hdb5 這個 ext3 的 filesystem 掛載到 /mnt/hdb5 時, 並且在開機的時候就已經自動的掛載好,那麼就可以將底下這一行寫入到 /etc/fstab 當中了:
    /dev/hdb5  /mnt/hdb5  ext3   defaults  2  2
    
    很簡單吧!所以啦,以後您自己建立的磁碟檔案系統想在開機的時候掛載好時,就在 /etc/fstab 加入吧! 此外,這個 /etc/fstab 還有什麼特殊功能呢?還記得使用 mount -a 時,我們提到的該參數參考檔案吧?!沒錯啊!就是這個 /etc/fstab 啊!而且,一般來說, 當我們編輯 /etc/fstab 後,為了避免可能的錯誤,通常就會以 mount -a 這個指令來測試看看呢!這是很重要的一個測試動作喔!

    另外,您也必須要瞭解到,除了這些磁碟檔案格式之外, 其實在系統裡面還有一些特殊的格式可以掛載來幫助系統的運作的! 例如上表當中非特殊字體的那幾行字!

    而 /etc/fstab 是開機時的設定檔,不過,實際 filesystem 的掛載是記錄到 /etc/mtab 與 /proc/mounts 這兩個檔案當中的。每次我們在更動 filesystem 的掛載時,也會同時更動這兩個檔案喔!但是,萬一發生您在 /etc/fstab 輸入的資料錯誤,導致無法順利開機成功,而進入單人維護模式當中,那時候的 / 可是 read only 的狀態,當然您就無法修改 /etc/fstab ,也無法更新 /etc/mtab 囉~那怎麼辦? 沒關係,可以利用底下這一招:
    [root@linux ~]# mount -n -o remount,rw /
    
    加上 -n 則不更新 /etc/mtab ,加上 -o 則提供額外的參數設定。 利用這一動作,嘿嘿!您的 / 就可以讀寫,那麼自然就能夠更新檔案內容囉~

    特殊裝置 loop 掛載

    除了常見的軟、硬碟掛載之外,我們還可以掛載特殊裝置喔!舉例來說,利用我們的硬碟內的檔案模擬出來的裝置! 也就是說,當我的硬碟內有一個 2GB 的檔案時,我可以將這個檔案『模擬』成為一個獨立的裝置, 然後用這個裝置來掛載使用喔!當然啦,這個 2GB 的大檔案要能夠被掛載時, 他必須是一個『被格式化過的檔案』才行!底下我們就來玩一玩這個咚咚。

    建立大型檔案
    首先,我們得先有一個大的檔案吧!怎麼建立這個大檔案呢?在 Linux 底下我們有一支很好用的程式 dd 可以用來建立空的檔案喔!詳細的說明請先翻到後面一章 壓縮指令的運用 來查閱,這裡鳥哥僅作一個簡單的範例而已。 假設我要建立一個空的檔案在 /tmp/loopdev ,那可以這樣做:
    [root@linux ~]# dd if=/dev/zero of=/tmp/loopdev bs=1024k count=2048
    2048+0 records in
    2048+0 records out
    # 這個指令在下一小節也會談到,那個 if 是 input file,
    # of 是 output file ,至於 bs 是每個 block 大小,
    # count 則是總共幾個 bs 的意思。不過,測試時,注意 /tmp 
    # 那個 partition 的大小啊!
    
    格式化
    很簡單就建立起一個 2GB 的檔案了吶!!接下來當然是格式化囉!
    [root@linux ~]# mke2fs -j /tmp/loopdev
    mke2fs 1.35 (28-Feb-2004)
    loopdev is not a block special device.
    Proceed anyway? (y,n) y
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    262144 inodes, 524288 blocks
    26214 blocks (5.00%) reserved for the super user
    ....以下省略.....
    
    掛載
    那要如何掛載啊?利用 mount 的特殊參數,那個 -o loop 的參數來處理!
    [root@linux ~]# mount -t ext3 -o loop /tmp/loopdev /media/cdrom/
    [root@linux ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /tmp/loopdev           2064208     35880   1923472   2% /media/cdrom
    
    多了個獨立的裝置給您使用喔!其實就是那個 2GB 的檔案內容啦! 這東西看起來似乎沒有什麼用途的樣子,不過,如果您未來想要玩 Linux 上面的『虛擬主機』的話, 也就是以一部 Linux 主機再切割成為數個獨立的主機系統時,類似 VMware 這類的軟體, 在 Linux 上使用 xen 這個軟體,他就可以配合這種 loop device 的檔案類型來進行根目錄的掛載, 真的非常有用的喔! ^_^

    虛擬記憶體之建置

    我們前面談了很多各式各樣的 filesystem ,不過,您曉得在安裝的時候設定的那一個『 虛擬記憶體 (swap) 』要如何增加嗎?舉個簡單的例子吧,鳥哥的 Sun 主機上面,由於跑的程式太龐大了,通常 swap 需要開啟到 1GB 左右,但是呢,有的時候還是會不夠的!在 Linux 當中,如果您需要使用到很大量的虛擬記憶體,偏偏當初給的 swap 磁區不夠大,那要怎麼辦呢? 有什麼方法可以來達成:
    • 設定一個 swap partition ?
    • 建立一個虛擬記憶體的檔案?
    怎麼說呢?基本上,虛擬記憶體就是將硬碟規劃出一個區間,讓記憶體的資料可以經由硬碟來讀取罷了, 那麼如果有 swap file 也就夠了對不對!是呀!所以這裡我們使用兩種方法來嘗試建立一下 swap 的擴增吧! 另外, swap 的建立其實也很簡單啊!同樣的需要先建立出 swap 這個裝置或者是檔案後, 將他格式化成為 swap 的格式,最後將他掛載到系統上即可!那就來實作看看吧!

    建立虛擬記憶體裝置

    第一種正規的方法是『直接再加一棵硬碟,並且將其中某個磁區規劃為 swap 的 filesystem 』, 呵呵,說的容易,做起來更容易!實際的動作為:
    1. 以『 fdisk /dev/hd[a-d] 』先建立一個 partition ,還記得 fdisk 怎麼做嗎?回去複習一下吧!簡單的來說,就是先 (1)建立一個 partition,然後 (2)將該 partition 的 ID 改為 82 這一個 swap 的磁碟檔案格式代號就對 啦!這樣這一步驟就 OK 囉!

    2. 以『 mkswap /dev/hd[a-d][1-16] 』的方式來將您剛剛建置出來的 partition 『格式化為 swap 的檔案格式』,很簡單吧!這樣就格式化 OK 囉!

    3. 再來則是將 swap 啟動,啟動的指令為『 swapon /dev/hd[a-d][1-16] 』,這樣就能啟動了!很簡單吧!這樣 swap 就自動加入到記憶體容量裡頭去了!
    那麼如何將 swap 關掉呢?呵呵!很簡單呀!就是直接給他 swapoff 就對了!

    例題一:如果您的系統是以鳥哥建議的方式來安裝的,那麼系統應該有一塊剩餘的空間。 請將該剩餘的空間格式化成為一個 swap device ,並且掛載到系統上!

    建立虛擬記憶體檔案

    那麼萬一我不想新增加一個磁區呢?可不可以使用 swap file 的方式來新增硬碟呀!當然可以囉! 而且步驟還蠻簡單的呢!基本的流程就是:
    1. 以 dd 指令來建立 swapfile ;
    2. 以 mkswap 來將 swapfile 格式化為 swap 的檔案格式;
    3. 以 swapon 來啟動該檔案,使成為 swap ;
    4. 以 swapoff 來關閉該檔案!
    嗯!多說無益!我們來實際的將您的主機系統上面新增 64MB 的虛擬記憶體吧!如果可能的話, 請您在您的系統上面實際的操作一次底下的步驟,我想,您應該馬上會瞭解實際的操作流程的! (底下的步驟是可以復原的!!別擔心,不過 mkswap 這個指令的下達要小心一點就是了!)
    1. 使用 dd 這個指令來新增一個 64MB 的檔案在 /tmp 底下:
      [root@linux ~]# dd if=/dev/zero of=/tmp/swap bs=4k count=16382
      16382+0 records in
      16382+0 records out
      # dd 這個指令是用來轉換檔案並且 copy 用的;
      #    if 指的是要被轉換的輸入檔案格式 /dev/zero 可以由 man zero 來查看內容;
      #    of 指的是輸出的檔案,我們將之輸出到 /tmp/swap 這個檔案;
      #    bs 指的是一個磁區佔用幾個 kb ;
      #    count 指的是要使用多少個 bs ,所以最後的容量為 bs*count = 4k * 16382 ~ 64MB
      
      如上所述,我們將建立一個檔名為 /tmp/swap 的檔案,且其內容共有 64MB 左右大小的檔案;

    2. 使用 mkswap 將 /tmp/swap 這個檔案格式化為 swap 的檔案格式:
      [root@linux ~]# mkswap /tmp/swap
      Setting up swapspace version 1, size = 67096576 bytes
      # 請注意,這個指令在下達的時候請『特別小心』,因為下錯字元控制,
      # 將可能使您的 filesystem 掛掉!
      

    3. 使用 swapon 來將 /tmp/swap 啟動囉!
      [root@linux ~]# free
                   total       used       free     shared    buffers     cached
      Mem:         62524      60200       2324          0        716      19492
      -/+ buffers/cache:      39992      22532
      Swap:       127004       2620     124384
      
      [root@linux ~]# swapon /tmp/swap
      # 不要懷疑!這樣就已經將虛擬記憶體增加 64 MB 囉!如果您需要每次都啟動該檔案,
      那麼將 swapon /tmp/swap 寫入 /etc/rc.d/rc.local 當中即可!
      
      [root@linux ~]# free
                   total       used       free     shared    buffers     cached
      Mem:         62524      60240       2284          0        724      19492
      -/+ buffers/cache:      40024      22500
      Swap:       192524       2620     189904
      

    4. 使用 swapoff 關掉 swap file
      [root@linux ~]# swapoff /tmp/swap
      
    沒錯,就這麼簡單的將虛擬記憶體給他新增囉!趕快來去試試看去! 不過,如果您的 FC4 從來沒有經過 update 的話,那麼可能會發生一些小困擾, 困擾的原因在此: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=164937 , 因為我們尚未學習如何以 rpm 安裝軟體,所以這裡的練習您可以先略過!

    虛擬記憶體的限制

    說實話,虛擬記憶體在目前的桌上型電腦來講,存在的意義已經不大了!這是因為目前的 x86 主機所含的記憶體實在都太大了 (一般入門級至少也都有 256MB 了),所以,我們的 Linux 系統大概都用不到虛擬記憶體 (swap) 這個玩意兒的。不過, 如果是針對伺服器或者是工作站這些常年上線的系統來說的話,那麼,無論如何,swap 還是需要建立的。

    因為 swap 主要的功能是當實體記憶體不夠時,則某些在記憶體當中所佔的程式會暫時被移動到 swap 當中,讓實體記憶體可以被需要的程式來使用。另外,如果您的主機支援電源管理模式, 也就是說,您的 Linux 主機系統可以進入『休眠』模式的話,那麼, 運作當中的程式狀態澤會被紀錄到 swap 去,以作為『喚醒』主機的狀態依據!。 另外,有某些程式在運作時,本來就會利用 swap 的特性來存放一些資料段, 所以, swap 來是需要建立的!只是不需要太大!

    不過, swap 在被建立時,是有限制的喔!
    • 在核心 2.4.10 版本以後,單一 swap 量已經沒有 2GB 的限制了,
    • 但是,最多還是僅能建立到 32 個 swap 的數量!
    • 而且,由於目前 x86_64 (64位元) 最大記憶體定址到 64GB, 因此, swap 總量最大也是僅能達 64GB 就是了!

    本章習題練習:

    ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    • 如何增加一顆新的硬碟在你的 Linux 系統當中?請詳述流程:
    • 安裝硬碟:關掉 Linux 主機電源,調整 Hard Disk 的 Jump (master 或 slave),串接在 IDE 的介面,請注意,留意你增加的硬碟所串接的 IDE 介面為哪一個插槽,例如你插在 IDE2 的 Master ,則你的硬碟應為 hdc;此外,需要特別留意的是,目前的機器中,如果是 ATA 66 以上的排線(那種很密的排線),那麼 master 或者是 slave 在排線上的順序是固定的!底端的是 Mater 而中間的是 Slave ,這點請稍微注意呦!

      新增硬體於BIOS:開啟電腦後,按 del 鍵進入 BIOS,選擇 IDE Hard Disk Detector 字樣的選項, 讓BIOS去捉硬碟,然後再選擇 Save and Exit;不過,較新的機器通常都可以自動偵測了!但是, 如果你的機器是舊型的,那麼還是手動來增加硬碟吧!

      Linux 系統偵測:如果你的 Linux 系統有啟動 kudzu 這個服務時,那麼開機就會自動去偵測新的硬體裝置! Fedora Core IV 預設是有開啟這項服務的,除非你關掉他了!OK,假設你有開啟這項服務,那麼開機進入 Linux 的時候,系統會告訴你有捉到一個新的硬體,你可以按 『configure』由系統直接安裝即可;

      格式化硬碟:以 root 的身份進入 Linux 後,執行以下兩個程式:fdisk /dev/hd[a-d] 與 mke2fs /dev/hd[a-d][1-16] 。

      建立 mount point:假設我的這顆硬碟要掛在 /disk3 下面,那麼就需要 : mkdir /disk3

      開機自動載入( mount ):再來則是以 vi 修改 /etc/fstab 檔案,讓每次開機把這個硬碟直接掛入系統中。

      安裝完成:你可以使用 mount -a 來將全部的裝置重新掛載一遍,或者是重新開機就可以啦!
    • 假設條件:我原先規劃的 /home 只有 1GB ,但是目前的使用者日眾,所以容量不足!我想要增加一棵 8GB 的舊硬碟,要如何作?!
    • 將硬碟加入 Linux 系統中:利用剛剛上一題的方式將你的硬碟加入到 Linux 系統中,亦即是使用 fdisk 與 mke2fs 建立了 ext2 的檔案格式的硬碟!好了,假設該硬碟的代號為 /dev/hdc1 好了!

      掛載新硬碟:由於我需要將新舊磁區都掛上來,這樣才有辦法將資料由舊硬碟移到新硬碟上面,OK! 我就建立一個暫存的目錄,稱為 /disk-tmp:
        mkdir /disk-tmp
        mount -t ext2 /dev/hdc1 /disk-tmp
      如此一來則 /disk-tmp 就是新掛上來那顆 8 GB 的硬碟啦!

      移動資料:好了!現在開始將資料 copy 到新掛上的硬碟上面吧!
        cd /home
        tar -zcvf /disk-tmp/home.tar.gz *
        cd /disk-tmp
        tar -zxvf home.tar.gz
      上面的指令會將目前舊有的 /home 底下的東西完全的壓縮之後移動到 /disk-tmp/home.tar.gz 這個壓縮檔,然後再到 /disk-tmp 底下將他解壓縮!這樣資料就複製到新掛上來的硬碟啦! 卸載舊的,掛上新的:好了,那麼我們就開始來測試一下吧!你可以這樣做:
        umount /home
        mount -t ext2 /dev/hdc1 /home
      注意呦!如果你的 /home 底下原本就沒有掛載磁區的話,那麼你就可以直接將 /home 底下的資料都砍掉,然後在掛上新的那顆硬碟就好了!而 home.tar.gz 這個檔案就可以用作為備份之用!

      開機執行:同樣的,如果要設定成開機就掛上這顆新的硬碟,那就修改 /etc/fstab 檔案吧!
    • 如果磁區 /dev/hda3 有問題,偏偏他是被掛載上的,請問我要如何修理此一磁區?
    • umount /dev/hda3
      fsck /dev/hda3
    • 我們常常說,開機的時候,『發現硬碟有問題』,請問,這個問題的產生是『filesystem 的損毀』,還是『硬碟的損毀』?
    • 特別需要注意的是,如果您某個 filesystem 裡面,由於操作不當,可能會造成 Superblock 資料的損毀, 或者是 inode 的架構損毀,或者是 block area 的記錄遺失等等,這些問題當中,其實您的『硬碟』還是好好的, 不過,在硬碟上面的『檔案系統』則已經無法再利用!一般來說,我們的 Linux 很少會造成 filesystem 的損毀, 所以,發生問題時,很可能整個硬碟都損毀了。但是,如果您的主機常常不正常斷電,那麼, 很可能硬碟是沒問題的,但是,檔案系統則有損毀之虞。此時,重建檔案系統 (reinstall) 即可! 不需要換掉硬碟啦! ^_^
    • 當我有兩個檔案,分別是 file1 與 file2 ,這兩個檔案互為 hard link 的檔案,請問, 若我將 file1 刪除,然後再以類似 vi 的方式重新建立一個名為 file1 的檔案, 則 file2 的內容是否會被更動?
    • 這是來自網友的疑問。當我刪除 file1 之後, file2 則為一個正規檔案,並不會與他人共同分享同一個 inode 與 block ,因此,當我重新建立一個檔名為 file1 時,他所利用的 inode 與 block 都是由我們的 filesystem 主動去搜尋 meta data ,找到空的 inode 與 block 來建立的, 與原本的 file1 並沒有任何關連性喔!所以,新建的 file1 並不會影響 file2 呢!

    參考資料:

    修改歷史:
    • 2002/07/15:第一次完成
    • 2003/02/07:重新編排與加入 FAQ
    • 2004/03/15:修改 inode 的說明,並且將連結檔的說明移動至這個章節當中!
    • 2005/07/20:將舊的文章移動到 這裡
    • 2005/07/22:將原本的附錄一與附錄二移動成為附錄 B 啦!
    • 2005/07/26:做了一個比較完整的修訂,加入較完整的 ext3 的說明~
    • 2005/09/08:看到了一篇討論,說明 FC4 在預設的環境中,使用 mkswap 會有問題。
    • 2005/10/11:新增加了一個目錄的 link 數量說明!
    • 2005/11/11:增加了一個 fsck 的 -f 參數在裡頭!
    • 2006/03/02:參考:這裡的說明,將 ext2/ext3 最大檔案系統由 16TB 改為 32TB。
    • 2006/03/31:增加了虛擬記憶體的相關說明在 這裡
    • 2006/05/01:將硬碟磁區的圖做個修正,感謝網友 LiaoLiang 兄提供的資訊!並加入參考文獻!
    • 2006/06/09:增加 hard link 不能連結到目錄的原因,詳情參考:http://phorum.study-area.org/viewtopic.php?t=12235
    • 2006/06/28:增加關於 loop device 的相關說明吶!
    • 2006/09/08:加入 mknod 內的裝置代號說明 ,以及列出 Linux 核心網站的裝置代號查詢。
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x