Linux 基礎學習篇 - Mandrake 9

第七章、磁碟與硬體管理 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2004/03/16

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

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

認識硬碟

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

    物理組成:


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

    圖一、硬碟盤示意圖
     

    圖二、磁柱示意圖
     
    首先,硬碟裡面一定會有所謂的磁頭 ( Head )在進行該硬碟盤上面的讀寫動作;而當磁頭固定不動,硬碟盤轉一圈所畫出 來的圓就是所謂的磁軌( Track );而如同我們前面剛剛提到的,一塊硬碟裡面可能具有多個硬碟盤,所有 硬碟盤上面相同半徑的那一個磁軌就組成了所謂的磁柱( Cylinder )。例如上圖二所示 意,在兩個硬碟盤上面的同一個磁軌就是一個磁柱啦!這個磁柱也是磁碟分割( partition )時的最小單位了;另外,由圓心向外劃直線,則可將磁軌再細分 為一個一個的磁區( Sector ),這個磁區就是硬碟盤上面的最小儲存物理量了!通常一個 sector 的大小約為 512 Bytes 。以上就是整個硬碟的基本元件。

    磁碟分割 ( Partition )


    在瞭解了硬碟的物理元件之後,再接著下來介紹的就是硬碟的分割( Partition )囉!為什麼要進行硬碟分割啊?!因為我們必須要告訴作業系統:『我這 塊硬碟可以存取的區域是由 A 磁柱到 B 磁柱』,如此一來,作業系統才能夠控制硬碟磁頭去 A-B 範圍內的磁柱存取資料;如果沒有告訴作業系統這個資訊,那麼作業系統就無法利用我們的硬碟來進行資料的存取了,因為作業系統將無法知道他要去哪裡讀取資料 啊!這 就是磁碟分割( Partition )的重點了:也就是記錄每一個分割區( Partition )的起始與結束磁柱!好了,那麼這個分割區的起始與結束磁柱的 資料放在哪裡呢?!那就是我們在 Linux 安裝與多重開機技巧 那個章節提到的 主要開機磁區( Master Boot Recorder, 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 的話,那麼剩下的空間就還能再分割兩個 partition !

    檔案系統( Filesystem )


     
    在告知系統我的 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 最多僅能容納一個檔案!這有什麼問題呢?舉例來說好了,假如您的 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 的檔案系統( 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);
    • 該檔案的存取模式;
    • 該檔案的類型;
    • 該檔案的建立日期(ctime)、最近一次的讀取時間(atime)、最近修改的時間 (mtime);
    • 該檔案的容量;
    • 定義檔案特性的旗標(flag),如 SetUID...;
    • 該檔案真正內容的指向 (pointer);
     
    至於一個 inode 的大小為 128 bytes 這麼大!好了,那麼我的 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 區域裡面),然後根據該關連資料讀取該檔案所在的 inode ,並再進一步經由檔案的 inode 來取得檔案的最後內容!舉個例子來說,假設我們要讀取 /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 的檔案內容。
整個讀取的流程大致上就是這樣,不過這裡有幾點小事情要提醒一下:
  • 在目錄底下的檔案數如果太多而導致一個 Block 無法容納的下所有的關連性資料時,Linux 會給予該目錄多一個 Block 來繼續記錄關連資料;
  • 一個檔案所佔用的 Block 都會記錄在該檔案所在的 inode 內,所以硬碟的磁頭可以直接去讀取各個 Block ,除非該檔案所儲存的各個 Block 真的很離散(事實上不太可能發生),否則在 Linux 的 ext2 當中,是不需要進行磁碟重組的!
  • inode 數量與 Block 的大小在格式化的時候就已經被設定好了,通常一個 Block 的大小為 4 Kbytes,至於 inode 的數量則依據不同的設定而異,基本的設定為 ( 硬碟大小 / 一個 inode 所控制的容量 ) 。舉例來說,我有一個 1 GBytes 的硬碟,我希望該硬碟中 inode 的數量只要 block 的一半就好了,那麼就可以設定一個 inode 控制的容量為 8 Kbytes ,則 inode 數量共有: ( G * 1024M/G * 1024K/M )/( 8 K ) = 131072 個 inode 囉!而 inode table 則佔去了 131072 * 128 byte = 16777216 bytes = 16384 Kbytes。也就是說,這一個 1GB 的硬碟還有沒任何資料時,就少了 16 MBytes 的容量啦!(用在 inode table 上面)。
  • 因為一個 inode 只能記錄一個檔案的屬性,所以 inode 數量比 block 多是沒有意義的!舉上面的例子來說,我的 Block 規劃為 4 Kbytes ,所以 1GB 大概就有 262144 個 4Kbytes 的 block ,如果一個 block 對應一個 inode 的話,那麼當我的 inode 數量大於 262144 時,多的 inode 將沒有任何用處,徒然浪費硬碟的空間而已!另外一層想法,如果我的檔案容量都很大,那麼一個檔案佔用一個 inode 以及數個 block ,當然 inode 數量就可以規劃的少很多啦!
  • 格式化 Linux 的 ext2 檔案系統,可以使用 mke2fs 這個程式來執行!
  • 當 block 大小越小,而 inode 數量越多,則可利用的空間越多,但是大檔案寫入的效率較差;這種情況適合檔案數量多,但是檔案容量小的系統,例如 BBS 或者是新聞群組( News )這方面服務的系統;
  • 當 Block 大小越大,而 inode 數量越少時,大檔案寫入的效率較佳,但是可能浪費的硬碟空間較多;這種狀況則比較適合檔案容量較大的系統!


Linux 檔案系統的運作

好了,知道了 Linux 標準的 ext2 檔案系統的狀況後,再來瞭解一下那麼 Linux 系統在運作時,他是如何進行資料的存取呢?!我們知道,整個電腦主機當中,輸出輸入 (I/O) 最快速的應該是 CPU 的快取了,然後則是主記憶體,至於硬碟的存取則比前兩個慢上許多。為了讓 Linux 加快整個系統的存取效率,因此在 Linux 上面通常採取非同步處理( asynchronously )的方式。什麼是非同步呢?舉例來說:『當系統讀取了某一個檔案, 則該檔案所在的 區塊資料會被載入到記憶體當中,所以該磁碟區塊就會被放置在主記憶體的緩衝快取區中,若這些區塊的資料被改變時,剛開始資料僅有主記憶體的區塊資料會被改 變,而且在緩衝區當中的區塊資料會被標記為” Dirty “,這個時候磁碟實體區塊尚未被修正!所以亦即表示,這些” Dirty “區塊的資料必需回寫到磁碟當中,以維持磁碟實體區塊上的資料與主記憶體中的區塊資料的一致性。』
為什麼要這麼做呢?這是因為主記憶體的運作速度比起硬碟來實在是快太多了,萬一系統當中有一個檔案相當的大,而又持續性的存取,那麼由於較慢的硬碟存取速 度,將使得整個 Linux 速度被拖垮,所以才會使用非同步方式的資料處理啊!不過,也由於硬碟與主記憶體的資料可能沒有同步化,因此,如果 Linux 不正常關機( 例如跳電或者是當機 )時,則由於資料尚未回寫入磁碟當中,會導致系統在再次開機時,會花相當多的時間進行磁碟檢驗,同時也有可能造成磁碟的損毀啊!

查看硬碟或目錄的容量

瞭解了硬碟之後,接下來當然要知道我的 Linux 系統裡面還剩下多少磁碟空間囉!嗯,那麼在文字介面底下有什麼方法可以查看目前的磁碟最大容許容量、已經使用掉的容量、目前所在目錄的已使用容量?還有還 有, 怎麼知道目前目錄底下使用掉的硬碟容量呢?以及如何查詢目前的 inodes 數目?呵呵!底下我們就來談一談主要的兩個指令:
df 查看已掛載磁碟的總容量、使用容量與 inode 等等
du 查看檔案使用掉的容量有多少?

  • df

  • 語法:
    [root @tsai /root ]# df -[ikm]
    參數說明:
    -i:  使用 i-nodes 顯示結果
    -k:  使用 KBytes 顯示結果
    -m:  使用 MBytes 顯示結果
    範例:
    [root @test /root ]# df -k       <==以 KB 顯示磁碟空間
    Filesystem           1k-blocks      Used Available Use% Mounted on
    /dev/hda1              2118832    904600   1106600  45% /
    /dev/hda3               497861     37525    434632   8% /disk1
    none                     31220         0     31220   0% /dev/shm
    /dev/hda5               101089      4127     91743   5% /proxy1
    /dev/hda6               101089      4127     91743   5% /proxy2
    /dev/hda2              1004052     38360    914688   5% /var
    /dev/fd0                  1423      1405        19  99% /mnt/floppy
    說明:
    這是用來顯示目前磁碟空間的指令!需要注意的是,由於我們的檔案或者是外掛的磁碟都是加在『 / 』底下,所以當根目錄沒有空間的時後,嘿嘿!你的 Linux 系統大概就是掛了吧~(說個笑話!當初 我們系上有個研究生在管理 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:說的是磁區啦!另外,如果你有加掛軟碟的 話,那麼就 會出現如上表中最後一行囉!
    • 1k-blocks:說明底下的數字單位是 1KB 呦!如果你使用 df -m 則這一欄會出現 1M-blocks 囉!
    • Used :顧名思義,就是使用掉的硬碟空間啦!
    • Available :也就是剩下的磁碟空間大小;
    • Use% : 就是磁碟的使用率啦!如果使用率高達 90% 以上時,最好需要注意一下了,免得容量不足造成系統問題(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁碟!)。
    • Mounted on :就是磁碟掛載的目錄所在啦!例如 /dev/hda5 是掛載在 /proxy1 底下,而 /var 是 /dev/hda2 這個磁區囉!
    另外,需要注意的是,有的時後某些系統會出現 /proc 這個磁區,但是裡面的東西都是 0 ,不要緊張! /proc 的東西都是 Linux 系統所需要載入的系統資料,而且是掛載在『記憶體 當中』的,所以當然沒有佔任何的硬碟空間囉!
     

  • du

  • 語法:
    [root @test /root ]# du [-abckms] [目錄名稱]
    參數說明:
    [目錄名稱] 可以省略,如果省略的話,表示要統計目前所在目錄的檔案容量
    -a   :全部的檔案與目錄都列出來!預設值是指列出目錄的值!
    -b   :列出的值以 bytes 輸出
    -c   :最後加總 total !
    -k   :列出的值以 KB 輸出
    -m  :列出的值以 MB 輸出
    -s   :只列出最後加總的值!
    範例:
    [root @test /root]# du -m    <==列出 /root 底下的目錄與檔案所佔的容量以 MB 輸出
    [root @test /root]# du -s /home <==將 /home 底下的目錄與檔案的容量加總後輸出,這裡只會輸出總容量!
    說明:
    在 Windows 底下可以使用檔案總管來管理你的磁碟,在 Linux 底下也可以輕易的以 du 來知道目前磁碟的檔案容量耶!在預設的情況下,容量的輸出是以 KB 來設計的,如果你想要知道目錄佔了多少 MB ,那麼就使用 -m 這個參數即可囉!而,如果你只想要知道該目錄佔了多少容量的話,呵呵,使 用 -s 就可以啦!


    連結檔的介紹

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

    Hard Link:
      在前一節當中,我們提到檔案的讀取方式為:(1)先由一層一層的目錄取得檔案相關的關連資料,(2)再到對應的 inode 取得檔案的屬性,以及檔案內容資料所在的 Block ,(3)最後到 Block area 取得檔案的資料。那麼 hard link 怎麼製作檔案的連結呢?!很簡單, Hard Link 只是在某個目錄下新增一個該檔案的關連資料而已!
       
      舉個例子來說,我的 /home/vbird/crontab 為一個 hard link 的檔案,他連結到 /etc/crontab 這個檔案,也就是說,其實 /home/vbird/crontab 與 /etc/crontab 是同一個檔案,只是有兩個目錄( /etc 與 /home/vbird )記錄了 crontab 這個檔案的關連資料罷了!也就是說,我由 /etc 的 Block 所記錄的關連資料可知道 crontab 的 inode 放置在 A 處,而由 /home/vbird 這個目錄下的關連資料, crontab 同樣也指到 A 處的 inode !所以囉, crontab 這個檔案的 inode 與 block 都沒有改變,有的只是有兩個目錄記錄了關連資料。
       
      一般來說,使用 hard link 設定連結檔時,磁碟的空間與 inode 的數目都不會改變!由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連資料,所以當然不會用掉 inode 與磁碟空間囉!(註:其實可能會改變的,那就是當目錄的 Block 被用完時,就可能會新加一個 block 來記錄,而導致磁碟空間的變化!不過,一般 hard link 所用掉的關連資料量很小,所以通常不會改變 inode 與磁碟空間的大小喔! )
       
      由於 hard link 是在同一個 partition 上面進行資料關連的建立,所以 hard link 是有限制的:
       
      1. 不能跨 Filesystem;
      2. 不能 link 目錄。
       

    Symbolic Link:
    相對於 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一個獨立的檔案,而這個檔案會讓資料的讀取指向他 link 的那個檔案內容!由於只是利用檔案來做為指向的動作,所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』,會一直說『無法開啟某檔案!』。這裡還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所建立的檔案為一個獨立的新的檔案,所以會佔用掉 inode 與 block 喔!
    由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連資料被殺掉了,也沒有關係,只要有任何一個目錄下存在著關連資料,那麼該檔案就不會不見!舉上面的例子來說,我的 /etc/crontab 與 /home/vbird/crontab 指向同一個檔案,如果我刪除了 /etc/crontab 這個檔案,該刪除的動作其實只是將 /etc 目錄下關於 crontab 的關連資料拿掉而已, crontab 所在的 inode 與 block 其實都沒有被變動喔!不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了,說的天花亂墜,看您也差不多快要昏倒了!沒關係,實作一下就知道怎麼回事了!要製作連結檔就必須要使用 ln 這個指令呢!

    • ln

    • 特別留意,底下的案例中,我們是將系統的設定檔 copy 到 /root/test 底下進行測試用的,請不要在 /etc/ 底下做,未來我們的工作目錄都會在 /root/test 底下進行,這有個好處,是可以讓您清楚的知道,這是用來 test 用的啦!
    語法:
    [root @test /root ]# ln [-s] [來源檔] [目的檔]
    參數說明:
    -s   :提供 symbolic line 的連結!
       如果直接以 ln 不加任何參數的話,那麼就屬於 hard link 囉!
    範例:
    [root @test /root]# mkdir test
    [root @test /root]# cd test
    [root @test test]# cp /usr/bin/passwd .

    0. 原本的資訊:
    [root @test /test]# ll 
    -rw-r--r-- 1 root     root        13476 Jun 26 11:31 passwd
    [root @test /test]# du -k <==查看該目錄下的佔用硬碟空間
    20

    1. Hard Link 資訊:
    [root @test /test]# ln passwd passwd-hard
    [root @test /test]# ll
    total 32
    -rw-r--r-- 2 root     root        13476 Jun 26 11:31 passwd
    -rw-r--r-- 2 root     root        13476 Jun 26 11:31 passwd-hard
    注意看,上面那 個數字變成 2 囉!這裡說的是關連資料有兩處!
    [root @test /test]# du -k
    20  <==注意看,容量並沒有變大!因為是 link 檔案呀!

    2. Symbolic Link 資訊:
    [root @test /test]# ln -s passwd passwd-soft; ll
    -rw-r--r--    2 root     root        13476 Jun 26 11:31 passwd
    -rw-r--r--    2 root     root        13476 Jun 26 11:31 passwd-hard
    lrwxrwxrwx    1 root     root            6 Jun 26 11:37 passwd-sofe -> passwd
    注意囉!該 Symbolic Link 的檔案是有容量的呦!
    注意囉, passwd-soft 會指到另外一個檔案去,而且,最前面屬性顯示 l ,
    此外,他是一個 獨立的檔案!先殺掉 passwd 後,我們分別 more 一下內容:

    3. 用 more 來試試看是怎樣?! 
    [root @test test]# rm passwd
    rm: remove regular file `passwd'? y
    [root @test test]# more passwd-hard
    ………(正常顯 示)
    [root @test test]# more passwd-soft
    passwd-soft: No such file or directory

    說明:
    要注意囉!使用 ln 如果不加任何參數的話,那麼就是 Hard Link 囉!如同上面的情況,增加了 hard link 之後,可以發現 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什麼事情呢?呵呵! passwd-hard 的內容還是會跟原來 passwd 相同,但是 passwd-soft 就會找不到該檔案啦!就是這樣!瞭解了嗎?!還有,跟 cp 也不一樣呦!因為雖然 Hard Link 的檔案看起來是有容量的,但是基本上還是指向原來的檔案,所以囉,整體容量是沒有增大的啦!
     
    而如果 ln 使用 -s 的參數時,就做成差不多是 Windows 底下的『捷徑』的意思( Symbolic Link,較常用! )不過,需要特別注意的是, Linux 的 link 與 Windows 的捷徑是不一樣的東西!舉個例子說,當你在 Windows 建立一個捷徑時,你可以在這個捷徑內修改任何資料,而你的原始資料並不會跟著變!不過,當你修改 Linux 下的 link 檔案時,則更動的其實是『原始檔』,呵呵,所以不論你的這個原始檔被連結到哪裡去,只要你修改了連結檔,呵呵!原始檔就跟著變囉!以上面為例,由於你使用 -s 的參數建立一個名為 passwd-soft 的檔案,則你修改 passwd-soft 時,其內容與 passwd 完全相同,並且,當你按下儲存之後,被改變的將是 passwd 這個檔案!
     
    此外,如果你做了底下這樣的連結:
    ln –s /bin /root/bin
    那麼如果你進入 /root/bin 這個目錄下,『請注意呦!該目錄其實是 /bin 這個目錄,因為你做了連結檔了!』所以,如果你進入 /root/bin 這個剛剛建立的連結目錄,並且將其中的資料殺掉時,嗯! /bin 裡面的資料就通通不見了!這點請千萬注意!並不是 /root 底下的資料都是 root 的!還需要注意一下該屬性才行!
     
    基本上, Symbolic link 的用途比較廣,所以您要特別留意 symbolic link 的用法呢!未來一定還會常常用到的啦!


    切割與格式化硬碟:

    對於一個系統管理者 ( root ) 而言,硬碟的的管理是相當重要的一環,尤其近來硬碟已經漸漸的被當成是消耗品了.....好了,如果我們要 partition 一顆新的硬碟,要使用什麼程式來工作?而如果已經 partition 好了,又要如何來格式化呢?剛剛我們提到了 inodes 這個東西,那麼使用格式化 ( format ) 的軟體可以怎樣的來格式化好我們所需要的 inodes 的大小呢?這裡我們就來談一談囉!
    fdisk  硬碟切割 partition 的工具
    mke2fs 就是 Linux 底下重要的 format 格式化的工具
    e2label 修改硬碟的 label (表頭名稱) 的工具!
    mknod  新增硬體對應檔的工具!

    • fdisk

    • 語法:
      [root @test /root ]# fdisk [-l] [裝置名稱] 
      參數說明: 
      -l  :直接列出該硬碟裝置的 partition table
      範例: 
      [root @test root]# fdisk /dev/hdb<==分割我的 hdb 磁碟,記得後面不接數字

      Command (m for help): 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)

      Command (m for help): p <==印出目前的磁碟分割狀態

      Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
      Units = cylinders of 8064 * 512 bytes

         Device Boot    Start       End    Blocks   Id  System
      /dev/hdb1   *         1       250   1007968+  83  Linux

      Command (m for help):q <==不儲存離開 fdisk

      [root @test root]# fdisk -l /dev/hdb<==直接秀出這顆硬碟當中的 partition 

      Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
      Units = cylinders of 8064 * 512 bytes

         Device Boot    Start       End    Blocks   Id  System
      /dev/hdb1   *         1       250   1007968+  83  Linux

      說明:
      還記得我們剛剛在認識硬碟裡面提到的部分內容 嗎?其實 fdisk 最主要的工作就是在修改『 partition table 』而已,並沒有實際的將硬碟切切割割的啦!他會定義出某一個 partition 是由 n1 磁柱到 n2 磁柱之間這樣的資訊!因此,如果硬碟切割錯誤時,只要在 format 之前將 partition tables 復原,那麼就可以將硬碟原來的資料救回來囉!所以,一個好的管理員,有時候也會將自己的 partition table 記錄下來,以備不時之需呀!這個 fdisk 只有 root 才能執行,此外,請注意,使用的『裝置名稱』請不要加上數字,因為 partition 是針對『整個硬碟裝置』而不是某個 partition 呢!所以執行 fdisk /dev/hdb1 就會發生錯誤啦!要使用 fdisk /dev/hdb 才對!底下說一說進入 fdisk 之後的幾個重要參數吧!
      註:您可以使用 fdisk 在您的硬碟上面胡搞瞎搞的進行實際操作,都不打緊,但是請『千萬記住,不要按下 w 即可!』離開的時候按下 q 就萬事無妨囉!
      • 硬碟資訊:通 常我們需要知道這顆硬碟的資訊時,直接按下『 p 』就可以瞭解了,例如上面的例子中,我的一棵硬碟切割呈上面的模樣,而我的 System 除了一個 swap 之外,其他的都是屬於 ext2 的呦!
      • 刪除磁區: 如果我要刪除一個以存在的磁區時,就需要:
        1. fdisk /dev/hdb :先進入 fdisk 畫面;
        2. p :先看一 下磁區的 資訊,假設要殺掉 /dev/hdb1;
        3. d :這個時 候會要你 選擇一個 partition ,就選 1 囉!
        4. w :儲存到磁碟資料表中,並離開 fdisk ;當然囉,如果你反悔了該怎麼辦!?呵呵,直接按下 q 就可以取消剛剛的刪除動作了!
        5. [root@test root]# fdisk /dev/hdb

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

             Device Boot    Start       End    Blocks   Id  System
          /dev/hdb1   *         1       250   1007968+  83  Linux

          Command (m for help): d
          Partition number (1-4): 1

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

             Device Boot    Start       End    Blocks   Id  System
          看!原 先的 partition 不見了,如果確定儲存就按下 w ,否則按下 q 趕緊離開!

           
      • 新增磁區:那 麼如何增加一個磁區呢?前提之下是你的硬碟必須還有硬碟空間才行!
        1. fdisk /dev/hdb :先進入 fdisk 畫面中;
        2. n:新增一個磁 區,這個 時候系統會問你,如果您已經具有 extended 磁區時,那麼系統會問您,您要新增的是 Primary 還是Logical ,而如果您還沒有 extended ,那麼系統僅會問你要新增 Primary 還是 Extended,除此之外,如果您已經用完了四個 P + E 的話,那麼就僅有 Logical 可以選擇啦!請再回到剛剛說明硬碟的地方再次的複習一下吧!如果是選擇 primary 的話,請按 p ,否則請按 e 或 l 。
        3. p :由於選 擇為 primary 所以就會按下 p 囉!
        4. 1-4 :primary 只允許四個,(仍然比 Windows 只允許一個好的多了!),所以這裡請按尚未被使用的那一個磁區囉!
        5. w :同樣的儲存離開囉!
           
          [root @test root]# fdisk /dev/hdb

          Command (m for help): p <==印出資訊

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

             Device Boot    Start       End    Blocks   Id  System
          /dev/hdb1   *         1       250   1007968+  83  Linux

          Command (m for help): n < ==選擇新增
          Command action
             e   extended
             p   primary partition (1-4)
          e  <==輸入 e 來新增 extended 囉!
          Partition number (1-4): 2
          First cylinder (251-523, default 251):   <== 這裡按 Enter 即可!用預設值!
          Using default value 251
          Last cylinder or +size or +sizeM or +sizeK (251-523, default 523): +100M

          Command (m for help): p <==再印出資訊

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

             Device Boot    Start       End    Blocks   Id  System
          /dev/hdb1   *         1       250   1007968+  83  Linux
          /dev/hdb2           251       276    104832    5  Extended  <==這行即是新增的!

          Command (m for help): n < ==再次新增
          Command action
             l   logical (5 or over)
             p   primary partition (1-4)
          l<==這次選擇 logical 的 l 哩!
          First cylinder (251-276, default 251):   <== 這裡按 Enter 即可!用預設值!
          Using default value 251
          Last cylinder or +size or +sizeM or +sizeK (251-276, default 276): +100M

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

             Device Boot    Start       End    Blocks   Id  System
          /dev/hdb1   *         1       250   1007968+  83  Linux
          /dev/hdb2           251       276    104832    5  Extended
          /dev/hdb5           251       276    104800+  83  Linux   <==這行即是新增的!

          透過上面的例子,您可以清楚的看到,呵呵!第一個 logical 是在 5 號呦!OK!在 fdisk 完成之後,請記得使用 mke2fs 格式化囉!另外,請注意,如果過程中進行錯誤時,那麼趕緊按下 q 離開即可! 
       
      • 操作環境的說明: 以 root 的身份進行硬碟的 partition 時,最好是在單人維護模式底下比較安全一些,此外,在進行 fdisk 的時候,如果該硬碟某個 partition 還在使用當中,那麼很有可能系統核心會無法重新載入硬碟的 partition table ,解決的方法就是將該使用中的 partition 給他卸載,然後再重新進入 fdisk 一遍,重新寫入 partition table ,那麼就可以成功囉!
      • 注意事項: 另外,請注意一下,雖然一顆硬碟最大的邏輯磁區可以到達 64 顆( 總數,包含 1~4 的 primary partition ),但 是並非所有的 Linux distribution 都會將所有的邏輯磁區對應的磁碟代號都寫入系統當中,以 Red Hat 為例,他僅列出 1~16 個代碼,其他的您就得自己動手做啦!至於 Mandrake 的話,他則是使用自己偵測的,當您以 fdisk 設定好了 partition table 之後,磁碟對應的磁碟代號就會自動的在您的 /dev/ 裡頭設定完成囉!不過,有的時候您還是得自己設定一下磁碟代碼啦!如何設定呢?就使用 mknod 這個指令吧!

    • mke2fs

    • 語法:
      [root @test /root ]# mke2fs [-b block-size] [-i inode-size]
      [root @test /root ]# mke2fs [-c]
      [root @test /root ]# mke2fs [-L]
      [root @test /root ]# mke2fs [-j]
      參數說明:
      -b   :在設定每個資料區塊佔用的大小,目前支援的大小有 1024, 2048, 4096 三種! 
      -i   :設定 inode 值!
      -c   :檢查錯誤磁碟,會比較慢呦! 
      -L   :規劃設定這個磁區的 label (表頭名稱) 
      -j   :建立 ext3 這個 journaling 的檔案格式
      範例:
      [root @test /root]# mke2fs /dev/hda5 
      以 mke2fs 預設的條件( ext2 )格式化 /dev/hda5 這個裝置

      [root @test /root]# mke2fs -c /dev/hda5
      在格式化的過程 中一起檢查硬碟 

      [root @test /root]# mke2fs –j -b 8192 -i 8192 /dev/hda5 
      改變 block 由 4096 預設值改為 8192 

      [root @test /root]# mke2fs /dev/fd0      <==格式化軟碟呀! 
      mke2fs 1.26 (3-Feb-2002) 
      Filesystem label= 
      OS type: Linux 
      Block size=1024 (log=0) 
      Fragment size=1024 (log=0) 
      216 inodes, 1680 blocks 
      84 blocks (5.00%) reserved for the super user 
      First data block=1 
      1 block group 
      8192 blocks per group, 8192 fragments per group 
      216 inodes per group 
      Writing inode tables: done 
      Writing superblocks and filesystem accounting information: done 

      This filesystem will be automatically checked every 35 mounts or 
      180 days, whichever comes first.  Use tune2fs -c or -i to override.

      說明:
      這是用來將磁碟格式化成 Linux 系統檔的指令。基本上,只要寫入對的裝置檔案就可以了。例如我們要格式化軟碟的話,或是新的硬碟 hda5 等等!這個指令通常是在新的硬碟上面切割完之後,再加以格式化的!另外,如果要將舊的磁區格式化成 ext2 格式的話,就使用這個指令吧!進行當中顯示的訊息有點像上面的最後幾行,系統會顯示目前的格式化的預設值!而如果要設定不同的 Block ( 就是前面提到的一個邏輯 sector 的大小 ),就可以使用 -b 這個參數!請注意囉,預設的情況下, Block 是 4096!此外,您也可以自訂 inode table 呢!而,當沒有指定的時 候, mke2fs 使用 ext2 為格式化檔案格式,若加入 –j 時,則格式化為 ext3 這個 Journaling 的 filesystem 呦!
       

    • e2label

    • 語法:
      [root @test /root ]# e2label [/dev/hd...] [label_name] 
      參數說明: 
      範例: 
      [root @test /root]# e2label /dev/hda1 / 
      上面的案例為將 /dev/hda1 這個磁碟槽的名字設定為 / 啦!
      說明:
      這個東西也挺有趣的,主要的功能是用來修改『磁碟的表頭資料』,也就是 label 啦。那是甚麼東西呢?如果你使用過 Windows 的檔案總管的話,那麼應該會曉得,每個磁碟機代號後面都有個名稱吧, 呵呵!那個就是 label 囉。這個東西除了有趣之外,也會被使用到一些設定檔案當中, 舉例來說,當我們在掛載磁碟的時候,除了利用磁碟的代號之外 (/dev/hdxx) 也可以直接利用磁碟的 label 來作為掛載的磁碟掛載點喔!基本上,就是那個 /etc/fstab 檔案的設定囉!

    • mknod

    • 語法:
      [root @test root]# mknod [device] [bcp] [Major] [ Minor]
      參數說明:
      b  :設定節點成為周邊儲存設備檔
      c  :設定節點成為周邊設備如滑鼠等
      p  :建立 FIFO
      範例:
      [root@test /]# cd /dev
      [root@test dev]# ll hda*
      lr-xr-xr-x    1 root     root           32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc
      lr-xr-xr-x    1 root     root           33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1
      lr-xr-xr-x    1 root     root           33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2
      [root@test dev]# ll ide/host0/bus0/target0/lun0/
      total 0
      brw-------    1 root     root       3,   0 Jan  1  1970 disc
      brw-------    1 root     root       3,   1 Jan  1  1970 part1
      brw-------    1 root     root       3,   2 Jan  1  1970 part2
      [root@test dev]# mknod hda3 b 3 3<==注意到囉!那個 3 3 就是上面的數值
      [root@test dev]# ll hda*
      lr-xr-xr-x    1 root     root           32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc
      lr-xr-xr-x    1 root     root           33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1
      lr-xr-xr-x    1 root     root           33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2
      brw-r--r--    1 root     root       3,   3 Oct 22 17:16 hda3
      說明:
      mknod 在平時是幾乎不會使用到的,但是某些時候,確實有可能會出問題!這個指令的設定方法中,必需要取得設備的 Major ( 主要 ) 與 Minor ( 次要 ) 的數值後,才能夠設定完整!上面是我的 Mandrake 9.0 在 P-166 MMX 上面的情況,由於之前僅分割成兩槽,所以僅到達 /dev/hdb2 而已,如果要 hdb3 的話,那麼除了 fdisk 完成之後, Mandrake 會自行多設定一個之外,否則就要自己來囉!而由這個裝置的內容說明上面,我們可以這樣定義一下:
      硬碟代號
      Major
      Minor
      /dev/hda
      3
      0 ~ 63
      /dev/hdb
      3
      64 ~ 127
      /dev/hdc
      22
      0 ~ 63
      /dev/hdd
      22
      64 ~ 127
       

    檢查硬碟與資料同步化寫入

    現在也建立好了新的 partition 了,也 format 好了,那麼有沒有其他的關於硬碟的工作需要來進行呢?有的,就是需要怎樣來檢查硬碟有沒有壞軌呢?那個就是 fsck 這個工具的用途啦!此外,您會發現到,在 / 這個目錄底下 ( 其實只要有掛載硬碟的那個目錄底下都有這個目錄 ) 會有一個特殊的目錄,就是『 lost+found 』這個目錄啦!對的!就是當你處理完 fsck 之後,如果程式有發現到任何的錯誤的檔案,就會將該檔案的資料給他丟到這個目錄當中,嘿嘿!所以當你發現你的 Linux 目錄當中有這個檔案時,不要擔心,那個是正常的啦!而且只有掛載 partition 的目錄才會有這個預設的目錄囉!
     
    還有,由於在 Linux 系統當中,為了增加系統效能,通常系統預設就是一些資料會寫在記憶體當中,並不會直接將資料寫入硬碟裡面,這是因為記憶體的速度要比硬碟快上若干倍呀!但 是有個問題就發生了,萬一系統由於『跳電』或者是其他的莫名原因,造成系統的 shutdown 時,唉呀!怎麼辦?!系統就完蛋啦!所以囉,我們需要在某些特定的時候讓資料直接回存到硬碟之中呀!了乎!這裡提供幾個慣用的指令,其中,那個 fsck 是相當重要的,請參考其用法囉!
    fsck       檢查硬碟有沒有壞軌的工具
    badblocks 跟 fsck 一樣,但是 fsck 的功能比較強,所以這個指令可以不學!
    sync 將    記憶體中的資料給他同步化寫入硬碟中

  • fsck

  • 語法:
    [root @test /root ]# fsck [-Aar] [裝置名稱]
    參數說明:
    -A   :依據 /etc/fstab 的內容,將所有的裝置都掃瞄一次(通常開機過程中就會執行此一指令)
    -a   :自動修復檢查到的有問題的磁區,所以你不用一直按 y 囉!
    -r   :一定要讓使用者決定是否需要修復,這與上一個 -a 剛好相反!
    範例:
    [root @test /root]# fsck -a /dev/hda5 <==檢查 /dev/hda5 這個磁區有沒有錯誤!
    說明:
    這是用來檢查與修正硬碟錯誤的指令。注意:通常只有身為 root 且你的系統有問題的時候才使用這個指令,否則在正常狀況下使用此一指令,可能會造成對檔案的危害!通常使用這個指令的場合都是在 系統出現極大的問題,導致你在 Linux 開機的時候得進入單人單機模式下進行維護的行為時,才必須使用此一指令!另外,如果你懷疑剛剛格式化成功的硬碟有問題的時後,也可以使用 fsck 來檢查一下硬碟呦!其實就有點像是 Windows 的 scandisk 啦!此外,由於 fsck 在掃瞄硬碟的時候,可能會造成部分 filesystem 的損壞,所以『要執行 fsck 的時候,請將該 partition umount 一下!』,然後再去執行!
     
    常常我們會發現,在比較老舊的機器上(例如我的 p-166),如果主機不正常的關機(例如跳電囉!),那麼硬碟很可能會出現錯誤的狀況!這個時候 Linux 就無法正常的開機!這個時候就需要輸入 root 的密碼,以登入單人維護模式(run level 1),然後下達 fsck -a /dev/hdxxx 來檢查你的硬碟!等到確認成功之後,就使用 reboot 來重新啟動吧!

    • badblocks

    • 語法:
      [root @test /root ]# badblocks [-svw] [裝置名稱] 
      參數說明:
      -s   :在螢幕上列出進度
      -v   :可以在螢幕上看到進度
      -w   :使用寫入的方式來測試,建議不要使用此一參數,尤其是待檢查的裝置已有檔案時!
      例:
      [root @test /root]# badblocks -sv /dev/hda1 
      說明:
      這是用來檢查硬碟或軟碟磁區有沒有壞軌的指令!跟 Windows 的 scandisk 相同功能啦!不過由於 fsck 的功能比較強,所以目前大多已經不使用這個指令了!

  • sync

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

    關於軟碟開機片:

    嗯!搞定了上面的動作了沒?!好了,如果搞定了的話,現在我們來製作一個可以開機 的軟碟開機片好了!怎麼製作呢?呵呵!就是利用 mkbootdisk 囉!
    mkbootdisk 製作軟碟開機片
    fdformat   這是用來『低階格式化』軟碟的工具

  • mkbootdisk

  • 語法:
    [root @test /root ]# mkbootdisk --device /dev/fd0 `uname -r`
    參數說明:
    --device   :後面接裝置!通常接的就是軟碟啦 /dev/fd0 !
    範例:
    [root @test /root]# mkbootdisk --device /dev/fd0 `uname -r`   <==建立可開機軟碟!!
    說明:
    這是製作開機磁片的指令,其中,『 `uname -r` 』是目前 Linux 系統所使用的核心版本,如果你有多個核心版本的話,你以可以直接輸入核心版本。例如在我的系統中,舊的核心還是有保留的,所以我都會至少有兩個核心,在我 管理的某部主機中,核心為 2.4.7 及 2.4.18 ,那麼如果我要直接以 2.4.18 來開機的話,就可以使用
    mkbootdisk --device /dev/fd0 2.4.18
    建立軟碟開機片一直是個好主意!他可以在你求助無門的時候給你莫大的幫助喔!所以,建立一個新的軟碟開機片是一個好主意啦!

    • fdformat

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

    各式磁區的掛載

    要將上面我們所建立起來的硬碟或軟碟正式的在 Linux 上面啟用時,一定需要將他掛載上檔案系統!而所謂的『掛載點』則是該硬碟所在的目錄,且在該目錄下的所有目錄都歸在 該硬碟所有!假設一個情況好了,我們的 / 為 /dev/hda1 而 /home 為 /dev/hda2 ,那麼在 /home/test 底下的咚咚就也都歸 /dev/hda2 這個 partition 所有囉!而需要特別留意的是,由於掛載檔案系統需要掛載點,所以掛載的時候得先建立起掛載的目錄才行!除此之外,如果您要用來掛載的目錄裡面並不是空的, 那麼掛載了檔案系統之後,那麼原目錄下的東西就會暫時的消失。舉個例子來說,假設您的 /home 原本是屬於根目錄 / 底下的 partition 所有,底下原本就有 /home/test 與 /home/vbird 兩個目錄。然後你想要加入新的硬碟,並且直接掛載 /home 底下,那麼當您掛載上新的 partition 時,則 /home 顯示的是該 partition 的內容,至於原 先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了!注意喔!並不是被覆蓋掉,而是 暫時的隱藏了起來,等到 partition 被 umount 之後,則該目錄的內容就會再次的跑出來啦!

    • mount

    • 語法:
      [root @test /root ]# mount [-ahlV] 
      [root @test /root ]# mount -t type /dev/hdxx /mountpoint
      [root @test /root ]# mount -o [options]
      [root @test /root ]# umount /mountpoint
      參數說明:
      -a   :依照 /etc/fstab 的內容將所有相關的磁碟都掛上來!
      -h   :只列出 mount 相關的參數,並不掛載任何裝置
      -l   :列出目前已經掛載的裝置、檔案系統名稱與掛載點!
      -V   :列出 mount 的版本資訊
      type :將後面 /dev/hdxx 這個裝置以 type 的檔案格式掛載到 /mountpoint 這個點,
            常見的 type 有底下幾個:
            vfat, msdos       :這個是支援 Windows 系統的檔案格式,尤其是 vfat 常用!
            ext, ext2         :這個就是 Linux 的主要檔案格式啦!
            iso9660           :光碟機的檔案格式
            nfs, ntfs, ufs    :Windows 2000 使用 NTFS 格式呀!
      -o  :這個參數後面接的咚咚可多了!可用的資料可不少呢!
         rw    :讓 mount 的磁區為可讀寫
         suid   :允許該磁區可以設定檔案為 SUID 的狀態!
         exec   :允許該磁區可以執行 binary 的檔案!
         auto   :允許該磁區可以使用 mount -a 的參數設定!
          nouser :禁止其他人(非 root 之使用者)使用掛載功能!這是預設值!
          async  :允許磁區可以進行非同步記錄(記憶體與硬碟不同步!最常用!)
          defaults:同時具有 rw, suid, dev, exec, auto, nouser, async 這些功能的設定值!
          nosuid :不許該磁區具有 SUID 的檔案屬性!
         ro    :設定為唯讀屬性!
          remount :讓系統本來掛載的磁區重新被掛載!
      範例:
      [root @test /root]# mount -a
      [root @test /root]# mount -t iso9660 /dev/cdrom /mnt/cdrom<==掛上光碟
      [root @test /root]# mount -t vfat /dev/fd0 /mnt/floppy   <==掛上 windows 檔案系統的軟碟
      [root @test /root]# mount -t ext2 /dev/fd0 /mnt/floppy   <==掛上 Linux   檔案系統的軟碟
      [root @test /root]# mount -t ext2 /dev/hdc6 /home        <==掛上 Linux 檔案格式硬碟
      [root @test /root]# mount -o remount,rw /          <==讓根目錄重新掛載為可讀!
      說明:
      這個指令只有 root 才能執行!如果你不想要單獨的將某個磁碟掛上來,那麼執行:
      mount -a
      就可以依照 /etc/fstab的的參數內容將所有的磁碟給他重新掛上去!此外,需要注意 的是,由於 Linux 系統中,每一個路徑都有可能是一個獨立的磁區系統,所以需要將每個磁區系統都掛上各自的掛載點!詳細的內容請回去參考一下上一篇 Linux 檔案系統 的說明。另外,由於各個磁區的檔案系統可能並不相同,所以您必須先要瞭解該磁區的檔案系統,這樣才可以進行 mount 的工作!如何知道該磁碟的檔案格式呢?可以使用 fdisk 來顯示的功能即可!
       
      請注意呦!由於 mount 之後的檔案格式是沒有辦法直接被拿掉的!尤其在使用 fsck 檢查你的硬碟時,更是不能掛上硬碟的!而如何將硬碟至掛載點卸載呢?呵呵,就直接使用 umount 即可囉!
       
      底下分別談一談各個裝置的掛載情況:這裡可能先要強調一個觀念,在 Windows 底下,磁碟分割是以 A, B, C, D, .... 等等的方式來劃分的,然而在 Linux 或 Unix 系統之下,卻是以目錄來代表,也就是說,一個目錄很可能就是一個磁區了! 舉個例子來說,通常 Linux 預設的軟碟掛載的地點在 /mnt/floppy 這裡!呵呵!那麼如果你需要軟碟的資料時,就將 /dev/fd0 這一個裝置(前面提過囉!這個是周邊存取裝置的一個設備檔案類型)掛上 /mnt/floppy 就可以啦!然後你進入到 /mnt/floppy 就可以讀取軟碟的資料囉!OK!在這裡也必須要介紹一下 mount 這個指令喔!
       
      • 掛載軟碟:

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

      • 在某些 Linux distribution 底下,例如 Red Hat 7.2 在預設的狀態下是將 CDROM 視為一個模組,預設的核心並沒有將他載入,所以,如果你需要在 Red Hat 7.2 裡面掛載 CDROM 的話,有兩個解決的方法:
         
        一個是直接將 CDROM 的模組載入系統中,這個動作比較簡單,而且你也可以將這個指令直接寫到 /etc/rc.d/rc.local 裡面去即可!
         
        [root @test / ]# modprobe cdrom
        [root @test / ]# modprobe ide-cd 
        [root @test / ]# mount -t iso9660 /dev/cdrom /mnt/cdrom 
        [root @test / ]# umount /mnt/cdrom
         
        前兩行是模組的載入,而第三行是掛載 CDROM ,第四行則是卸載!此外,由於預設的 CDROM 掛載就是以 iso9660 的 type 來做的,所以你也可以直接寫成 mount /dev/cdrom /mnt/cdrom 就可以囉!
         
        另外一個解決的方法是將 CDROM 的模組編譯進核心當中!又有兩種方式,一個是直接下載新的核心來編譯,另一個則是直接以 Red Hat 出的更新版的核心來直接升級就可以啦!如果是使用 up2date 的話,那麼升級核心是很簡單的啦!
         
      • 掛載 Windows 磁區:

      • 如果萬一你在安裝系統的時候忘記將 Windows 的 VFAT 格式的磁區 mount 上你的 Linux 時,該怎麼辦?!這種現象最常發生在多系統共存的環境中!例如再原有的 Windows 98 或 Win2000 上面安裝 Linux ,但是結果卻忘記將該磁區掛載上來!嗯!這樣需要重新安裝嗎?!當然不需要了!又不是被入侵!那麼該如何掛載上來呢?!就如同前面說的,由於一個目錄可能 代表了一個磁區,因此你必須要先建立一個磁區,然後再將此磁區掛載上你的 Linux 目錄,就可以啦!另外,由於需要將磁區掛在目錄下,所以你還得需要瞭解你的 Windows 磁區是在哪一個硬碟周邊中喔!如何知道你的 Windows 磁區呢?就使用 fdisk 吧!假設你的 Windows 是在 Primary IDE 的硬碟,那麼應該就是 /dev/hda 囉!則你可以這樣做:
         
        [root @test / ]# fdisk –l /dev/hda
        Disk /dev/hda: 255 heads, 63 sectors, 524 cylinders 
        Units = cylinders of 16065 * 512 bytes 

           Device Boot    Start       End    Blocks   Id  System 
        /dev/hda1             1       268   2152678+  83  Win95 FAT32 
        /dev/hda2   *       269       395   1020127+  83  Linux 
        /dev/hda3           396       459    514080   83  Linux 
        /dev/hda4           460       524    522112+   5  Extended 
        /dev/hda5           460       472    104391   83  Linux 
        /dev/hda6           473       485    104391   83  Linux 
        /dev/hda7           486       498    104391   82  Linux swap 
        /dev/hda8           499       511    104391   83  Linux 
        /dev/hda9           512       524    104391   83  Linux 

         
        使用 fdisk 指令的話就可以知道你的 Win95 FAT32 的磁區在哪一個,在上表中,顯示的是 /dev/hda1 這一個磁區囉!那麼假設我要將 Windows 的目錄建置在 /mnt/win98 裡面呢?就這樣做吧:
         
        [root @tsai / ]# mkdir /mnt/win98 
        [root @tsai / ]# mount -t vfat /dev/hda1 /mnt/win98 
        [root @tsai / ]# mount -t vfat -o iocharset=cp950 /dev/hda5 /mnt/win98
         
        如此一來就將 Windows 的系統掛到 Linux 裡面囉!簡單吧!請注意,上面那個第三行所使用的參數可以讓您的 Windows 98 的磁區當中的檔案顯示出正確的中文呦!
         
      • 安裝新硬碟:

      • 再來個新問題!那麼我如果想要安裝一顆新硬碟呢?呵呵,也是很簡單啦,就跟在 Windows 底下一樣!需要先 fdisk 然後在 format ,之後就可以順利的掛上 Linux 系統囉!假設我安裝的硬碟在 Primary 的第二個 IDE 上面,也就是 /dev/hdb 上,那麼整個步驟應該就會是:
         
        [root @test / ]# fdisk /dev/hdb 
        ....... (以下省略!直接以 fdisk 分割好硬碟啦!) 

        [root @test / ]# mke2fs /dev/hdb1 
        在 Linux 中的 format 是 mke2fs 這一個指令喔! 
        上面的指令 在將你的硬碟磁區格式化成 Linux 的 ext2 格式啦! 

        [root @test / ]# mkdir /disk2 
        建立一個目 錄名稱為 /disk2 ,預計用來掛載你的新硬碟 

        [root @test / ]# mount -t ext2 /dev/hdb1 /disk2 
        將硬碟掛上 Linux 系統囉!

         

    • umount

    • 語法:
      [root @test root]# umount [-f] [device|mount_point]
      參數說明:
      -f  :強制將該檔案系統退出,最常使用在無法退出的 NFS 檔案系統中了!
      範例:
      [root @test root]# umount /home
      說明:
      就是直接將 mount 上來的檔案系統給他卸載即是!卸載之後,可以使用 df 看看是否還存在呢?!

    設定開機時即掛載的方式:

    剛剛上面說了許多,那麼可不可以在開機的時候就將我要的磁區都掛好呢?!這樣我就不需要每次進入 Linux 系統都還要在掛載一次呀!當然可以囉!那就直接到 /etc/fstab 裡面去修修就行囉!不過,在開始說明前,這裡要先跟大家說一說系統掛載的一些限制:
    • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
    • 其它 mount point 必須為已建立的目錄﹐可以任意指定﹐但一定要遵守必須的系統目錄架構原則。
    • 所有 mount point 在同一時間之內﹐只能掛載一次。
    • 所有 partition 在同一時間之內﹐只能掛載一次。
    • 如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
    好了,那麼我們進入 /etc/fstab 看一看吧:
     
    [root @test / ]# more /etc/fstab
    # History:
    # ==================================================
    # When          Who     What
    # 2002/10/19    VBird   This file had been modified by me.
    # ==================================================
    # device        MountPoint      filesystem      parameters      dump    fsck
    /dev/hda1       /               ext3            defaults        1       1
    /dev/hda2       swap            swap            defaults        0       0
    LABEL=/backup   /backup         ext3            defaults        1       1
    none            /dev/pts        devpts          mode=0620       0       0
    none            /proc           proc           defaults        0       0
    /dev/hda3       /mnt/win98      vfat            defaults,iocharset=big5,codepage=950 0 0
     
    我這個人比較龜毛一點,因為 Mandrake 9.0 的 /etc/fstab 檔案排列方式蠻醜的,雖然每一欄之間只要以空白字元分開即可,但就是覺得醜,所以通常我就會自己排列整齊,並加上註解符號,就是 # 字號,來幫我記憶這些資訊!總共有六欄,分別來談一談吧!
    1. 磁區或標頭:就是磁區啦!不過,如果是在安裝的時候有給 予一個 label (標頭) 的話,那麼使用 label 也可以,例如上面的 LABEL=/backup 那一行。而如果是我們增加新的磁區的話,那麼這裡就必須要使用『磁區』了!例如新安裝一個硬碟在 /dev/hdd1 當中,那麼這裡就寫 /dev/hdd1 囉!那麼如果我還是想要使用 label 來掛載呢?!就使用 e2label 來建立 label name 啦!  e2label 的用法在前一章有說明,忘了的話,快去看看先!

    2.  
    3. 掛載的目錄點:就是 mount 的掛載點啦!

    4.  
    5. 該磁區的檔案格式:目前 Linux 大都使用 ext2, ext3, reiserfs 等等的,不過,如果你有使用 Windows 的檔案格式的話,那麼就可以使用 vfat 囉!目前支援的格式還有 iso9660( 光碟 ), msdos, minix, nfs, swap 等等的檔案格式;

    6.  
    7. 檔案格式參數區:這個就重要了!有哪些磁碟參數可以參考呢? 在前一章的 mount 指令裡面介紹了一些些,這裡再更詳細的提出說明如下:

    8.  
      參數
      內容意義
      async/sync
      非同步/同步
      是否允許磁碟與記憶體中的資料以同步寫入的動作?使用 async 這個非同步寫入的方式會比較快速一些。
      auto/noauto
      自動/非自動
      在開機的時候是否自動掛載該磁區?既然設定在這個區域內了,當然希望開機的時 候自動掛載囉!
      rw/ro
      可讀寫/唯讀
      讓該磁區以可讀寫或者是唯獨的型態掛載上來,如果是 vfat 之類的磁區,您不想讓 Linux 變更的話,那麼使用 ro 也不錯!能夠提供有效的保護呢!
      exec/noexec
      可執行/不可執行
      限制在此檔案系統內是否可以進行『執行』的工作?如果是純粹用來儲存資料的, 那麼可以設定為 noexec 會比較安全,相對的,會比較麻煩!
      user/nouser
      允許/不許
      是否允許使用者使用 mount 指令來掛載呢?一般而言,我們當然不希望 user 身份的人能使用 mount 囉,因為太不安全了,因此這裡應該要設定為 nouser 囉!
      suid/nosuid
      具有suid/沒有suid
      該檔案系統是否允許 SUID 的存在?一般而言,如果不是 Linux 系統的磁區,而是一般資料的 partition ,那麼設定為 nosuid 確實比較安全一些!畢竟有 SUID 是蠻可怕的一件事
      usrquota
      啟動使用者磁碟配額模式支援
      grpquota 
      啟動群組磁碟配額模式支援!
      defaults
      同時具有 rw, suid, dev, exec, auto, nouser, async 這些功能,所以預設情況中,使用這個即可!
       
      另外,如果有興趣的話,還可以加上類似『iocharset=big5,codepage=950』 這種額外的功能參數以啟動中文編碼的支援,更詳細的資料可以 man mount 搜尋呢!
       
    9. 是否可以被 dump 指令備份:這一列在說明,使用 dump 指令來備份時時,該磁區是否跟著一起動作?如果沒有數字的話則以 0 帶入!由於我們希望有備份的功能,所以這裡當然就開啟( 1 )囉!

    10.  
    11. 檢驗磁區:這個數字在用來以 fsck 檢驗磁區用的!在開機與關機的時候,通常 Linux 希望檢驗一下磁區,所以這裡需要設定一下。通常 root (就是根目錄 / 啦)需要設定為 1 ,而其他的檔案系統( filesystem )就設定為 1 即可!當然囉!由於 proc 及 swap 與 windows 並不需要以 fsck 來檢驗,所以就可以設定為 0 囉!
    所以,假如我要新增加一個 /dev/hdb1 並且掛載在 /disk2 這個目錄下的話,那麼我就在該檔案的最底加上一行:
     /dev/hdb1      /disk2         ext2    defaults      1   1
    或者我直接在這個檔案上面規劃好之後,再下達: mount -a 那麼程式就會自動的將 /etc/fstab 裡面的資訊讀出,並且依據裡面的情況來掛載磁區喔!如此一來,每次開機的時候都會自動的建立好對應的咚咚啦!
     
    有經驗的朋友大概都還蠻清楚的,就是 /etc/fstab 寫錯了的時候(最常發生在 quota 設定的時候)會造成無法開機的窘境,因此,通常我們都會把自己所想要的資料給他寫在 /etc/fstab 之後,以 mount  –a 驅動看看,此外,如果錯誤已經造成了呢?那也不要太擔心,由於錯誤造成了,所以根目錄 / 預設會變成唯讀屬性,這個時候就得要進行 remount 的工作了,亦即下達:
     mount  –n  –o  rw,remount  /
    這樣應該就可以將磁碟掛載成為可讀寫了!
     
    此外,您必須瞭解的是, /etc/fstab 寫的是您的設定檔,但是目前的系統所掛載的資訊則是記錄在 /etc/mtab 這個檔案中喔!這個檔案會即時的進行更新,如果您重新手動掛載你的檔案 系統,那麼這個 mtab 就會跟著變動囉!

    虛擬記憶體 Swap:

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

    • Swap partition ( 建立虛擬記憶體的磁區 ):

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

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

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

    • Swap file ( 建立虛擬記憶體檔案 ) :

    • 那麼萬一我不想新增加一個磁區呢?可不可以使用 swap file 的方式來新增硬碟呀!當然可以囉!而且步驟還蠻簡單的呢!基本的流程就是:
      1. 以 dd 指令來建立 swapfile ;
      2. 以 mkswap 來將 swapfile 格式化為 swap 的檔案格式;
      3. 以 swapon 來啟動該檔案,使成為 swap ;
      4. 以 swapoff 來關閉該檔案!
      嗯!多說無益!我們來實際的將您的主機系統上面新增 64MB 的虛擬記憶體吧!如果可能的話,請您在您的系統上面實際的操作一次底下的步驟,我想,您應該馬上會瞭解實際的操作流程的!(底下的步驟是可以復原的!!別 擔心,不過 mkswap 這個指令的下達要小心一點就是了!)
      1. 使用 dd 這個指令來新增一個 64MB 的檔案在 /tmp 底下:
      2. [root@test /root]# 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 左右大小的檔案;
         
      3. 使用 mkswap 將 /tmp/swap 這個檔案格式化為 swap 的檔案格式:
      4. [root@test /root]# mkswap /tmp/swap
        Setting up swapspace version 1, size = 67096576 bytes
        請注意,這個指 令在下達的時候請『特別小心』,因為下錯字元控制,將可能使您的 filesystem 掛掉!
         
      5. 使用 swapon 來將 /tmp/swap 啟動囉!
      6. [root@test /root]# free
                     total       used       free     shared    buffers     cached
        Mem:         62524      60200       2324          0        716      19492
        -/+ buffers/cache:      39992      22532
        Swap:       127004       2620    124384
        [root@test /root]# swapon /tmp/swap
        不要懷疑!這樣 就已經將虛擬記憶體增加 64 MB 囉!如果您需要每次都啟動該檔案,
        那麼將 swapon /tmp/swap 寫入 /etc/rc.d/rc.local 當中即可!
        用 free 這個指令查看一下您的系統囉!
        [root@test /root]# free
                     total       used       free     shared    buffers     cached
        Mem:         62524      60240       2284          0        724      19492
        -/+ buffers/cache:      40024      22500
        Swap:       192524       2620    189904
         
      7. 使用 swapoff 關掉 swap file
      8. [root@test /root]# swapoff /tmp/swap
        就直接給他關掉 囉!
    沒錯,就這麼簡單的將虛擬記憶體給他新增囉!趕快來去試試看去!

    磁碟效能:

    我們都知道目前的 IDE 硬碟主要的傳輸模式為 ATA 模式,最近 (2002年) 已經出到了 ATA 133 了!不過,傳統上, ATA 66 就已經很厲害了!新的 IDE 硬碟也沒有辦法完全利用 ATA 100 呢!但是,你知道嗎?有沒有開啟 ATA 這個傳輸通道的 DMA 模式,對於硬碟的存取效率差很大呦!好了!我們來測試一下磁碟的效能吧!
  • hdparm

  • 語法:
    [root @test /root ]# hdparm [-cdmXTt] [裝置名稱] 
    參數說明:
    -c   :提供 32 位元的存取模式,支援的型態有:
          -c0:關閉 32 位元存取模式
          -c1:開啟 32 位元存取模式
          -c3:以較為特殊的 sync 模式開啟 32 位元存取模式(建議值)
    -d   :是否啟動硬碟的 DMA 模式, 0 為關閉, 1 為開啟。
    -m   :設定 multiple sector I/O 的模式,通常預設為 16 ,建議值亦為 16 。
    -X   :設定 IDE/ATA 模式的項目,支援如下的設定:
          -X34:開啟 DMA mode 2       (ATA)
          -X66:開啟 ultra DMA mode 2 (ATA66)
    -T   :測試暫存區 cache 的存取效能
    -t   :測試硬碟的實際存取效能 (較正確!)
    例:
    [root @test /root]# hdparm -Tt /dev/hda   <==測試 hda 這顆硬碟的 cache 與實際效能
    [root @test /root]# hdparm -d0 /dev/hda<==關閉 DMA 模式!
    [root @test /root]# hdparm -d1 -c3 -X66 /dev/hda<==開啟 DMA 模式在 DMA 66 ,並且開啟 32 位元存取模式
    說明:
    這個指令必須要 root 才能執行!此外,需要特別注意, -X 這個參數是很危險的參數設定,除非您非常瞭解您的硬碟架構,否則不建議自行設定,因為 manual page 上面就有說明到這一點~~不過,無論如何,目前大於 2GB 以上的硬碟至少都已經支援了 DMA 33 了!因此,使用 -X66 應該都是可行的!較常建議的硬碟 DMA 開啟功能項目如下:
    hdparm -d1 -X66 -m16 -c3 /dev/hda
    另外,基本上目前的 Linux 預設都是開啟 DMA 的模式,因此這個指令的功能相對的重要性就降低了!不過,有一點仍然相當的重要,就是 Linux 預設的 -c 是關閉的,亦即是 -c0 的狀態,所以你可以增加上面的 -c3 來開啟 32 位元的存取模式呦!當然了,如果你的硬碟真的是很老舊的,那麼就不要開啟的好!好了!那麼如何開機就啟動 DMA 模式呢?!你可以將上面那一段指令寫入 /etc/rc.d/rc.local 裡面即可!

    附錄一:第二延伸檔案系統 ext2

    這裡轉貼一篇關於 ext2 這個 Linux 檔案格式的主要特點:
     
    第二延伸檔案系統(ext2)介紹 (本文摘自小紅帽技術論壇)
     
    自從我們開始使用電腦後,大多數的使用者都曾經使用過檔案,而我們總是對關於硬碟如何正確 地儲存檔案感到好奇,它看起來似乎非常抽象,所以今天讓我們看一看 Linux 作業系統中較新的檔案系統版本『第二延伸系統( ext2 )』,並了解它各方面之用途。 
    這個檔案系統是主要來自於Andrew Tanenbaum 所寫的Minix檔案系統,它也是唯一可用在免費作業系統的檔案系統,稱之為Minix。它後來修正為 Linux 所慣用的檔案系統並稱為延伸檔案系統,到現在 Linux 的檔案系統稱為 ext2 (第二延伸檔案系統),它是延伸檔案系統中較新的版本並支援存取控制列(ACL)。 
    但是在著手研究 ext2 檔案系統之前,讓我們先了解檔案系統中之專有名詞的關聯。 
    • Block (區塊): 檔案在磁碟中被儲存在整數固定大小的區塊中,那區塊的大小通常是2的次方。在預設中,ext2檔案系統的區塊大小是4K。研究顥示,4K位元組對於一磁碟 區塊而言是最理想的大小,假如一個檔案的大小無法達成4K位元組的倍數時,那最後的磁碟區塊部分就會被浪費。在最不好的例子中幾乎在完整的區塊中就有一位 元組被浪費掉。 
      對於這情況有一點技巧,假如我們選擇了一個較大的區塊,則對於小的檔案而言會有一些磁 碟空間被浪費掉。另外一方面,假如我們使用一個非常小的區塊,則磁碟區塊數量會成指數的增加,因此對於檔案而言需有更多的搜尋時間。所以,選擇區塊大小必 須三思而後行。 
      當一個檔案被載入到記憶體時,那磁碟區塊會被放在主記憶體中之緩衝快取區,假如它們已 經變更了,區塊在緩衝區中會被標記為’Dirty’,其意指的是這些區塊必須先寫到磁碟中來維持磁碟上的區塊及在主記憶體中的區塊之一致性. 
    • Superblock:superblock 是在每個檔案系統開始的位置,其儲存資訊像是檔案系統的大小,空的和填滿的區塊,它們各自的總數和其他諸如此類的資料。要從一個檔案系統中存取任何檔案皆 須經過檔案系統中之superblock。如果superblock損壞了,它可能無法從磁碟中去取得資料。 
  • Inode: 對於檔案系統而言一個inode是在inode表格中的一個項目。Inode包含了所有檔案有關的資訊例如名稱、大小、連接的數量、資料建立之日期,修改 及存取的時間。它也包含了磁碟區塊的檔案指向(pointer)。pointer是用來記錄檔案被儲存在何處。 

  • Ext2fs公用程式
    現在讓我們來看看一些標準Linux版本之ext2fsprogs公用程式 

    • e2fsck 

    • 這個程式允許我們在ext2檔案系統上去執行檔案系統檢查,它像是Windows中之 Scandisk一樣,但卻是一種更有效的系統檢查方式。在此,我們可以加上一個檔案名稱來檢查上面之損壞區塊。 
    警告:絕對不要在任何已掛載的檔案系統上執行 e2fsck/fsck。假如我們想要去執行 fsck,我們應該卸下檔案系統後再去執行 fsck(亦即需要 umount 該磁區囉)。如果不這樣做,可能會讓檔案系統毀損。 
    • tune2fs 

    • 這允許我們去調整檔案系統的參數設定。在此,我們可以設定在兩個檔案系統檢查間之最大 掛載總數、容量標記、錯誤行為、變更保留的資訊和許多其他參數。 
    • dumpe2fs 

    • 這個程式將ext2檔案系統狀態輸出到標準的設備上。它對於分析問題以及存取一般關於 檔案系統用法的資訊是有幫助的。 
    • mke2fs 

    • 這個程式允許我們在先前尚未格式化的磁碟中,去建立一個ext2的檔案系統。它提供了 許多的選項包含區塊的大小、段落的大小、每一個inode的位元組到多種磁碟陣列的選項。mke2fs通常在第一次安裝的期間執行,並建立完成新的 root 及其他的檔案系統。(就相當於 DOS 底下的 format 程式啦!)
    • badblocks 

    • 這個程式去搜尋磁碟並檢查區塊是否已經損壞,它通常會在新的檔案系統安裝程式前執行, 但請不要在掛載好的檔案系統上執行。 
    在Linux檔案系統中最新的版本被稱為ext3,並已有 Journaling 之支援。Journaling 檔案系統對於所有已完成的步驟,持有記錄以及檢查點,所以假使系統當機時,它可以從最後的檢查點來還原檔案系統。

    附錄二:為何選擇 ext3 呢

    在最新的 Red Hat 7.2 當中,已經捨棄了 ext2 而改用支援 Journaling 的 ext3 這一個檔案格式了,那麼這兩個咚咚有什麼不一樣的呢?!底下有一篇翻譯過的文章,看看吧!
     
    Red Hat Linux 7.2 為何決定採用ext3檔案系統? 

    Red Hat決定在7.2版中使用ext3的格式來作為預設的檔案系統在,引起相當多熟悉Linux使用者的關注,但ext3並不是唯一的,也不是眾多日誌式 (journaling)檔案系統中最佳的。

    傳統的Linux檔案系統ext2,對於在相當小容量的硬碟上之小檔案而言是相當的 理想。隨著硬碟的容量及檔案大小大幅增加,整體性能會下滑。有些原因是來自讀取未有效利用的磁碟空間,有些原因是來自不正常關機或是電源中斷檔案系統的恢 復時間。檔案系統經由e2fsck在一個1GB的硬碟做檢查是毫不費力的,但相同的測試在40GB的硬碟上可能會相當的秏費時間。所以就有日誌式檔案系統 的誕生。 

    這些記錄硬碟狀態的檔案稱為日誌。所以在不正確關機之後重新啟動需要參考到日誌檔案 來重新回復檔案系統的狀態,而非將整個硬碟做掃描。同時,日誌式檔案系統可以有更高的硬碟空間使用效率及使資料在各種不同之檔案大小中能夠快速的讀取及寫 入。 

    Linux並不是只有一個日誌式的檔案系統,它有四個,或是說成三又二分之一個:  
     

    • Reiser檔案系統: 依照Hans Reiser的名字而取。Reiser是眾所皆知的一種新式快速記錄硬碟內容的檔案系統,它曾經被廣泛的使用超過一年,且這個檔案系統被推薦安裝在 SuSE7.1版及7.2版上。 
    • JFS檔案系統:經 由IBM所開發的,其設計的理念在於提供一高速的處理能力。IBM從2000年2月間開始經過一系列的測試版本,它的1.0版本已在六月底公開發表。 
    • XFS檔案系統:XFS 是SGI公司在Linux上所開發的日誌式檔案系統,它也提供了所有以完整發展為特色的日誌式檔案系統。 
    • ext3檔案系統:ext3 是之前所提及的二分之一日誌式檔案系統。為何只有一半呢?原因是ext3是一種疊在傳統ext2檔案系統上面並保有磁碟活動紀錄的日誌式檔案系統。所以當 不正確關機時,檔案的恢復速度會比ext2檔案系統來的快。但是,因為它是被結合在ext2中,它會遭受到一些老舊系統的限制並因此不能利用所有日誌式檔 案系統的完整功能。這樣並非是完全不好,因為ext3分割區並沒有不同於ext2檔案系統,因此如ext3損毀要回到ext2檔案系統卻是非常的簡單。 
    Red Hat是第一個採用ext3的公司,它嘗試性的將Linux檔案系統推向日誌式檔案系統。當公司計畫在7.2版的第二個測試版本採用ext3時,公司中首 席核心開發者Michael K. Johnson便迅速的提供一個原理的闡述: 
    “為什麼你想要從ext2轉換到ext3呢?有四個主要的理由: 可利用性、資料完整性、速度及易於轉換”。可利用性,他指出,這意味著從系統中止到快速重新復原而不是持續的讓e2fsck執行長時間的修復。ext3的 日誌式條件可以避免資料毀損的可能。他也指出”除了寫入若干資料超過一次時,ext3往往會較快於ext2,因為ext3的日誌使硬碟讀取頭的移動能更有 效的進行“。然而或許決定的因素還是在Johnson先生的第四個理由中。
    “它是可以輕易的從ext2變更到ext3來獲得一個強而有力的 日誌式檔案系統而不需要重新做格式化”他說道。”那是正確的,為了體驗一下ext3的好處是不需要去做一種長時間的,冗長乏味的且易於產生錯誤的備份工作 及重新格式化的動作”。
    修改歷史:
    • 2002/07/15: 第一次完成
    • 2003/02/07:重新編排與 加入 FAQ
    • 2004/03/15:修改 inode 的說明,並且將連結檔的說明移動至這個章節當中!
    其他連結
    環境工程模式篇
    鳥園討論區
    鳥哥舊站

    今日 人數統計
    昨日 人數統計
    本月 人數統計
    上月 人數統計