Linux磁盤與文件系統管理

    磁盤與文件系統管理這部分內容太多,看了兩遍,東西是弄明白了,但東西太多寫的時候無從下手,網上查了半天也找不到好的文章參考,看到的還是鳥哥的東西,爲了和前面後面文章銜接,所以只能copy這篇文章了,特此申明本文不是本人所寫而是鳥哥的,本人只是重新排版

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


    一、文件系統

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

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

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

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

      5、 不過,Block 單位的規劃並不是越大越好喔!怎麼說呢?因爲一個 Block 最多僅能容納一個檔案 (這裏指 Linux 的 ext2 文件系統)!這有什麼問題呢?舉例來說好了,假如您的 Block 規劃爲 4 KBytes ,而您有一個檔案大小爲 0.1 KBytes ,這個小檔案將佔用掉一個 Block 的空間,也就是說,該 Block 雖然可以容納 4 Kbytes 的容量,然而由於檔案只佔用了 0.1 Kbytes ,所以,實際上剩下的 3.9 KBytes 是不能再被使用了,所以,在考慮 Block 的規劃時,需要同時考慮到:

    • 檔案讀取的效能
    • 檔案大小可能造成的硬盤空間浪費

      因此,在規劃您的磁盤時,需要留意到您主機的用途來進行規劃較佳!例如 BBS 主機由於文章較短, 也就是說檔案較小,那麼 Block 小一點的好;而如果您的主機主要用在儲存大容量的檔案, 那麼考慮到效能,當然 Block 理論上,規劃的大一點會比較妥當啦!

     

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

     

    二、Linux 的 EXT2 文件系統( inode )

      1、看完了上面的說明,您應該對於硬盤有一定程度的認識了!好了,那麼接下來就是要談一談 Linux 的文件系統( Filesystem )囉!我們這裏以 Linux 最標準的 ext2 這個文件系統來作爲說明。在 Linux 系統當中,每個檔案不止有檔案的內容數據,還包括檔案的種種屬性,例如:所屬羣組、 所屬使用者、能否執行、檔案建立時間、檔案特殊屬性等等。由於 Linux 操作系統是一個多人多任務的環境,爲了要保護每個用戶所擁有數據的隱密性, 所以具有多樣化的文件屬性是在所難免的!在標準的 ext2 文件系統當中,我們將每個檔案的內容分爲兩個部分來儲存,一個是檔案的屬性,另一個則是檔案的內容。

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

      3、Block 已經在前面說過了,他是數據儲存的最小單位。那麼 inode 是什麼?簡單的說, Block 是記錄『檔案內容數據』的區域,至於 inode 則是記錄『該檔案的相關屬性,以及檔案內容放置在哪一個 Block 之內』的信息。 簡單的說, inode 除了記錄檔案的屬性外,同時還必須要具有指向( pointer )的功能,亦即指向檔案內容放置的區塊之中,好讓操作系統可以正確的去取得檔案的內容啊! 底下幾個是 inode 記錄的信息(當然不止這些):

    • 該檔案的擁有者與羣組(owner/group);
    • 該檔案的存取模式(read/write/excute);
    • 該檔案的類型(type);
    • 該檔案建立或狀態改變的時間(ctime)、最近一次的讀取時間(atime)、最近修改的時間(mtime);
    • 該檔案的容量;
    • 定義檔案特性的旗標(flag),如 SetUID...;
    • 該檔案真正內容的指向 (pointer);

       4、inode的數量不大小也是在格式化時就已經固定了,除此之外 inode 還有些什麼特性?


    •  每個 inode 大小均固定爲 128 bytes;
    •  每個檔案都僅會佔用一個 inode 而已;
    •  承上,因此文件系統能夠建立的檔案數量與 inode 的數量有關;
    •  系統讀取檔案時需要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合才能
      夠開始實際讀取 block   的內容。

             一般的一個inode中有 12個直接記錄block 一個間接,一個雙間接,一個三間接記錄區inode的圖形結構

           


    5、在前面linux檔案管理當中提到過利用 ls 查詢檔案所記載的時間,就是 atime / ctime / mtime 三種時間。這三種時間的意義我們已經在前一章的touch指令介紹時提過,這三種時間就是記錄在 inode 裏面的啦~ 如果回到前一章,您會發現,我們可以利用ls的相關功能來查詢到時間喔!而默認的顯示時間是 mtime 。

     

    6、[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 來儲存該檔案!

    7、要注意的是, inode 本身並不紀錄文件名,而是記錄檔案的相關屬性,至於文件名則是記錄在目錄所屬的 block 區域! 那麼檔案與目錄的關係又是如何呢?就如同上面的目錄提到的,檔案的相關鏈接會記錄在目錄的 block 數據區域, 所以當我們要讀取一個檔案的內容時,我們的 Linux 會先由根目錄 / 取得該檔案的上層目錄所在 inode , 再由該目錄所記錄的檔案關連性 (在該目錄所屬的 block 區域) 取得該檔案的 inode , 最後在經由 inode 內提供的 block 指向,而取得最終的檔案內容。我們以 /etc/crontab 這個檔案的讀取爲例, 他的內容資料是這樣取得的:

     


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

    8、一塊 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 的檔案內容。

    9、整個讀取的流程大致上就是這樣,如果您想要實作一下以瞭解整個流程的話,可以這樣試做看看:


    (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 找到關連性囉!

    10、所以您知道,目錄的最大功能就是在提供檔案的關連性,在關連性裏面, 當然最主要的就是『檔名與 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 數量越少時,大檔案寫入的效率較佳,但是可能浪費的硬盤空間較多; 這種狀況則比較適合檔案容量較大的系統!

    11、簡單的歸納一下, 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 字符。

    12、另外,關於 partition 的使用效率上,當您的一個 partition 規劃的很大時,例如 100GB 這麼大, 由於硬盤上面的數據總是來來去去的,所以,整個 partition 上面的檔案通常無法連續寫在一起, 而是填入式的將數據填入沒有被使用的 block 當中。如果檔案寫入的 block 真的分的很散, 此時就會有所謂的檔案離散的問題發生了。雖然我們的 ext2 在 inode 處已經將該檔案所記錄的 block number 都記上了,所以資料可以一次性讀取,但是如果檔案真的太過離散,確實還是會發生讀取效率低落的問題。 果真如此,那麼可以將整個 partition 內的數據全部複製出來,將該 partition 重新格式化, 再將數據給他複製回去即可解決。

     

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

     

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

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

     

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

    2、我們將整個 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 數據存放區。

    3、如果想要知道某個 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 等等。

    4、透過這些記錄,我們可以很輕易的就知道哪些 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 囉。經由上面兩個動作,我們知道一筆數據寫入硬盤時, 會有這兩個動作。

    5、數據的不一致 (Inconsistent) 狀態

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

     

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

     

    7、稍微瞭解了所謂數據不一致的狀態後,再來要了解的,就是,那麼爲何要有日誌式文件系統的產生呢? 我們已經在linux文件系統中 當中提到過一些文件系統的注意事項, 也提過日誌式 (Journal) 文件系統的相關功能,這裏我們再稍微深入的討論一下。

     

    8、剛剛提到了,在 EXT2 文件系統當中,要進行檔案的寫入時,會將數據分別在數據存放區與 metadata 區記錄下來, 若當這兩個動作無法一次完成時,就會造成所謂的不一致現象。若發生不一致現象, 因爲系統不知道是那個檔案發生不一致現象,所以就會將整個 filesystem 做一致性的檢查,如此一來,很費時啊! 想一想,如果在我們的 filesystem 當中,要是能夠規劃出一個區塊,專門來記錄寫入或修訂檔案時的步驟, 那不就可以簡化一致性檢查的步驟了?也就是說:

    (1)、當系統要寫入一個檔案的時候,會先在日誌記錄區塊中紀錄:某個檔案准備要寫入磁盤了;

    (2)、開始寫入檔案的權限與數據;

    (3)、開始更新 metadata 的數據;

    (4)、完成數據與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的紀錄。

    9、在這樣的程序當中,萬一數據的紀錄過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄區塊, 就可以知道那個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 真的就可以達到快速修復 filesystem 的能力了!這就是日誌式檔案最基礎的功能囉~ 那麼我們的 ext2 可達到這樣的功能嗎?當然可以啊! 就透過 ext3 即可! ext3 是 ext2 的升級版本,並且可向下兼容 ext2 版本呢! 所以囉,目前我們才建議大家,可以直接使用 ext3 這個 filesystem 啊! ^_^

     

    四、Linux 文件系統的運作

    1、我們知道整個 ext2/ext3 的數據存取是透過 journal 與 metadata 還有數據存放區在紀錄的。 不過,實際上, Linux 文件系統在運作的時候,真的要將數據直接存放到硬盤上面嗎?! 有沒有更有效率的作法?

     

     2、我們來看看整部計算機的運作當中,那個數據的訪問速度最慢呢?數據處理最快速的地方應該是 CPU 了, 接下來則是主存儲器 (RAM) ,至於硬盤,哈哈!沒錯,速度可是比 CPU 還有 RAM 要慢的很多很多。 爲了讓 Linux 加快整個系統的存取效率,因此在 Linux 上面通常採取異步處理( asynchronously )的方式。

     

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

     

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

     

    五、掛載點的意義 (mount point)

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

     

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

     

    3、那麼來看看系統中如果主要分爲 / 與 /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 支持的文件系統

      1、 雖然 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

    2、想要知道您的 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, 省去我們需要自行設定讀取文件系統的定義啊~方便很多!


    七、文件系統的簡單操作

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


    2、磁盤與目錄的容量:

    在文字接口底下有什麼方法可以查看目前的磁盤最大容許容量、已經使用掉的容量、 目前所在目錄的已使用容量?還有還有,怎麼知道目前目錄底下使用掉的硬盤容量呢? 以及如何查詢目前的 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

     3、這是用來顯示目前磁盤的總容量與剩餘可用容量的指令!需要注意的是, 由於我們的檔案或者是外掛的磁盤都是加在『 / 』底下,所以當根目錄沒有空間的時候, 嘿嘿!你的 Linux 系統可能大概就要掛了吧~當然囉!你可以將你的數據放置在加掛的硬盤中, 那麼如何知道目前哪一個磁盤還有多少空間呢?!

     4、這裏要請大家再複習一下,我們的硬盤扇區規劃中, primary 扇區每一顆硬盤最多隻允許 4 個,其他的就放置在 Extended 扇區中了!而,硬盤的代號與 IDE 的插槽是有關係的! 如果忘記了,那就回去複習一下吧!好了!假設我只有一棵硬盤,且放在 IDE 的 master ,那麼我的硬盤就是 /dev/hda 囉!而在這顆硬盤中的分割扇區就可以由 /dev/hda1 開始向上加!

     

    5、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

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

     

    • Hard Link (硬式連結或實際連結)

    在前一節當中,我們提到檔案的讀取方式爲:

    (1)、先由一層一層的目錄取得檔案相關的關連數據,

    (2)、再到對應的 inode 取得檔案的屬性,以及檔案內容數據所在的 Block ,

    (3)、最後到 Block area 取得檔案的數據。

    那麼 hard link 怎麼製作檔案的連結呢?!很簡單, Hard Link 只是在某個目錄下新增一個該檔案的關連數據而已!

     

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

     

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

     

    4、一般來說,使用 hard link 設定鏈接文件時,磁盤的空間與 inode 的數目都不會改變! 由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據,所以當然不會用掉 inode 與磁盤空間囉!

     


    5、由於 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 喔!

     

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

     

    7、不過,不幸的是,由於 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
    # 怕了吧?!竟然無法正常的開啓這個檔案呢~


    8、要注意囉!使用 ln 如果不加任何參數的話,那麼就是 Hard Link 囉!如同上面的情況,增加了 hard link 之後,可以發現使用 ls -l 時,顯示的 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什麼事情呢?呵呵! passwd-hd 的內容還是會跟原來 passwd 相同,但是 passwd-so 就會找不到該檔案啦!就是這樣!瞭解了嗎?!

     

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

     

    10、此外,如果你做了底下這樣的連結:

    ln -s /bin /root/bin

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

     

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

    12、關於目錄的 link 數量:

    或許您已經發現了,那就是,當我們以 hard link 進行『檔案的連結』時,可以發現,在 ls -l 所顯示的第二字段會增加一纔對,那麼請教,如果建立目錄時,他默認的 link 數量會是多少? 讓我們來想一想,一個『空目錄』裏面至少會存在些什麼?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那麼,當我們建立一個新目錄名稱爲 /tmp/testing 時,基本上會有三個東西,那就是:

    • /tmp/testing
    • /tmp/testing/.
    • /tmp/testing/..

    13、而其中 /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 數量的意義了嗎?! ^_^


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

    1、對於一個系統管理者 ( root ) 而言,磁盤的的管理是相當重要的一環,尤其近來硬盤已經漸漸的被當成是消耗品了 ..... 好了,如果我們想要在系統裏面新增一顆硬盤時,應該有哪些動作需要做的呢?有幾個動作囉:(1)、對磁盤進行分割,以建立可用的 partition ;

    (2)、對該 partition 進行格式化( format ),以建立系統可用的 filesystem;

    (3)、若想要仔細一點,則可對剛剛建立好的 filesystem 進行檢驗;

    (4)、在 Linux 系統上,需要建立掛載點 ( 亦即是目錄 ),並將他掛載上來;

    當然囉,在上述的過程當中,還有很多需要考慮的,例如磁盤分區槽 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 與 block 的數量應該如何規劃等等的問題。但是這些問題的決定, 都需要與您的主機用途來加以考慮的~所以,在這個小節裏面,鳥哥僅會介紹幾個動作而已, 更詳細的設定值,則需要以您未來的經驗來參考囉!


    2、磁盤分區: 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 ,所以,
    # 就肯定還有剩餘空間拉!等一下我們就用這個來測試囉!


    3、還記得我們剛剛在 認識 EXT2 文件系統 裏面提到的 partition 部分內容嗎?其實 fdisk 最主要的工作就是在修改『 partition table 』 而已,並沒有實際的將硬盤切切割割的啦!他會定義出某一個 partition 是由 n1 磁柱到 n2 磁柱之間這樣的信息!因此,如果硬盤分割錯誤時,只要在 format 之前將 partition tables 復原,那麼就可以將硬盤原來的數據救回來囉!所以,一個好的管理員,有時候也會將自己的 partition table 記錄下來,以備不時之需呀!

     

    4、這個 fdisk 只有 root 才能執行,此外,請注意, 使用的『裝置名稱』請不要加上數字,因爲 partition 是針對『整個硬盤裝置』而不是某個 partition 呢!所以執行 fdisk /dev/hdb1 就會發生錯誤啦!要使用 fdisk /dev/hdb 纔對!那麼我們知道可以利用 fdisk 來查閱硬盤的 partition 信息外,底下再來說一說進入 fdisk 之後的幾個常做的工作!


    5、刪除磁盤分區槽

    剛剛的 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 就能夠離開囉~

    6、新增磁盤分區槽

    那麼如何新增 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 這個指令吧!


     

    7、磁盤格式化:

    [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 指令!


     

    8、磁盤檢驗: 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 才行(目前幾乎一定都會支持的啦!)


     

    9、磁盤掛載與卸除

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

     

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

     

    (3)、而要將文件系統掛載到我們的 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

    (4)、就可以依照 /etc/fstab 的參數內容將所有的磁盤給他重新掛上去!此外,需要注意的是,由於 Linux 系統中,每一個路徑都有可能是一個獨立的扇區系統, 所以需要將每個扇區系統都掛上各自的掛載點!詳細的內容請回去參考一下上一篇Linux 文件系統 的說明。另外, 由於各個扇區的文件系統可能並不相同,所以您必須先要了解該扇區的文件系統, 這樣纔可以進行 mount 的工作!如何知道該磁盤的文件格式呢?可以使用fdisk 來顯示的功能即可!

     

    (5)、另外,如果您沒有加上 -t 的參數,那麼系統會默認嘗試以 /etc/filesystems 內的文件系統格式來測試一下是否可以將裝置掛載上來呢!

     

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

     

    (7)、另外,我們也可以利用 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),均可接受啦!


     

    十、磁盤參數修訂:

    1、某些時刻,您可能會希望修改一下目前磁盤的一些相關信息,舉例來說,磁盤的 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 代碼是:

     

     

    硬盤代號

    Major

    Minor

    /dev/hda

    3

    0~63

    /dev/hdb

    3

    64~127

    /dev/hdc

    22

    0~63

    /dev/hdd

    22

    64~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
    .....其他省略.....

    2、這個東西也挺有趣的,主要的功能是用來修改『磁盤的表頭數據』,也就是 label 啦。 那是甚麼東西呢?如果你使用過 Windows 的檔案總管的話,那麼應該會曉得, 每個驅動器號後面都有個名稱吧,呵呵!那個就是 label 囉。這個東西除了有趣之外, 也會被使用到一些配置文件案當中,舉例來說,當我們在掛載磁盤的時候,除了利用磁盤的代號之外 (/dev/hdxx) 也可以直接利用磁盤的 label 來作爲掛載的磁盤掛載點喔!基本上, 就是那個 /etc/fstab 檔案的設定囉!

     

    3、因爲某些 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
    # 我的機子沒有很好啦~這樣的速度.....差強人意~

    4、我們都知道目前的 IDE 硬盤主要的傳輸模式爲 ATA 模式,最近 (2002年)已經出到了 ATA 133 了!不過,傳統上, ATA 66 就已經很厲害了!新的 IDE 硬盤也沒有辦法完全利用 ATA 100 呢!但是,你知道嗎?有沒有開啓 ATA 這個傳輸信道的 DMA 模式, 對於硬盤的存取效率差很大呦!

     

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


     

    十一、設定開機掛載:

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


    2、各式磁盤掛載與 中文編碼掛載還有 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 ,但是結果卻忘記將該扇區掛載上來!嗯!這樣需要重新安裝嗎?! 當然不需要了!又不是被入侵!那麼該如何掛載上來呢?!

     

    3、就如同前面說的,由於一個目錄可能代表了一個扇區,因此你必須要先建立一個目錄, 然後再將此扇區掛載上你的 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

    1、剛剛上面說了許多,那麼可不可以在開機的時候就將我要的扇區都掛好呢?!這樣我就不需要每次進入 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


    2、其實這個 /etc/fstab 就是將我們使用 mount 來掛載一個裝置到系統的某個掛載點, 所需要下達的指令內容,將這些內容通通寫到 /etc/fstab 裏面去,而讓系統一開機就主動掛載囉~ 那麼 mount 下達指令時,需要哪些參數?不就是『裝置代號、掛載點、文件系統類別、參數』等等, 而我們的 /etc/fstab 則加入了兩項額外的功能,分別是備份指令 dump 的執行與否, 與是否開機進行fsck 掃瞄磁盤呢~

     

    3、我這個人比較龜毛一點,因爲某些 distributions 的 /etc/fstab 檔案排列方式蠻醜的, 雖然每一欄之間只要以空格符分開即可,但就是覺得醜,所以通常鳥哥就會自己排列整齊, 並加上批註符號,就是 # 字號,來幫我記憶這些信息!由上面的說明,我們知道 /etc/fstab 內總共有六欄,分別來談一談每一欄的內容吧!

  1. 磁盤裝置代號或該裝置的 Label:
    這個就是裝置代號啦!將您需要的裝置代號給他填上去吧!! 不過,還記得我們的 filesystem 可以擁有標頭名稱吧 (Label)? 沒錯,我們也可以利用 Label 來掛載文件系統喔!例如上表當中的特殊字體的第一行, 我的根目錄 (/) 就是以 Label 名稱爲 / 的磁盤分區槽來掛載的啊! 利用 label 掛載時,您必須要知道您的磁盤內的 label 名稱,可以利用dumpe2fs 來讀取, 也可以利用 e2label來更改標頭名稱啊。 在知道了 label 名稱後,最後就可以利用 LABEL=(your label name) 來設定您的裝置囉~

  1. 掛載點 (mount point):
    就是掛載點啊!掛載點是什麼?一定是目錄啊~要知道啊!!!
  2. 磁盤分區槽的文件系統:
    就如同我們在這個章節一開始就談到的, Linux 在傳統上面,使用的是 ext2/ext3 等文件系統, 目前則加入了很多日誌式文件系統,例如 reiserfs 及 XFS 等文件系統的支持。 此外,存在已久的 Windows vfat, msdos 及 iso9660 的光盤文件系統, 還有網絡文件系統如 nfs, smbfs 等等,都可以被支持。這個字段就是寫這些文件系統的地方啊!
  3. 文件系統參數:
    每個文件系統還有很多參數可以加入的,例如中文編碼的 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 設定即可!

  1. 能否被 dump 備份指令作用:
    在 Linux 當中,可以利用 dump 這個指令來進行系統的備份的。而 dump 指令則會針對 /etc/fstab 的設定值,去選擇是否要將該 partition 進行備份的動作呢! 0 代表不要做 dump 備份, 1 代表要進行 dump 的動作。 2 也代表要做 dump 備份動作, 不過,該 partition 重要度比 1 小。
  2. 是否以 fsck 檢驗扇區:
    開機的過程中,系統默認會以 fsck 檢驗我們的 partition 內的 filesystem 是否完整 (clean)。 不過,某些 filesystem 是不需要檢驗的,例如虛擬內存 swap ,或者是特殊文件系統, 例如 /proc 與 /sys 等等。所以,在這個字段中,我們可以設定是否要以 fsck 檢驗該 filesystem 喔。 0 是不要檢驗, 1 是要檢驗, 2 也是要檢驗,不過 1 會比較早被檢驗啦! 一般來說,根目錄設定爲 1 ,其他的要檢驗的 filesystem 都設定爲 2 就好了。

4、所以說,如果我想要將我們剛剛練習時,建立的 /dev/hdb5 這個 ext3 的 filesystem 掛載到 /mnt/hdb5 時, 並且在開機的時候就已經自動的掛載好,那麼就可以將底下這一行寫入到 /etc/fstab 當中了:


/dev/hdb5  /mnt/hdb5  ext3   defaults  2  2

5、很簡單吧!所以啦,以後您自己建立的磁盤文件系統想在開機的時候掛載好時,就在 /etc/fstab 加入吧! 此外,這個 /etc/fstab 還有什麼特殊功能呢?還記得使用mount -a 時,我們提到的該參數參考檔案吧?!沒錯啊!就是這個 /etc/fstab 啊!而且,一般來說, 當我們編輯 /etc/fstab 後,爲了避免可能的錯誤,通常就會以 mount -a 這個指令來測試看看呢!這是很重要的一個測試動作喔!

 

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

 

7、而 /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 掛載

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

 

建立大型檔案:

(1)、首先,我們得先有一個大的檔案吧!怎麼建立這個大檔案呢?在 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
....以下省略.....

掛載

(2)、那要如何掛載啊?利用 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 的文件類型來進行根目錄的掛載, 真的非常有用的喔! ^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章