作者:陳柏菁 E-mail:pachingko@ms96.url.com.tw

第五章 檔 案 系 統

索引:
5.1 檔案系統介紹
  5.1.1 認識 ext2 及日誌式檔案系統
  5.1.2 資料存取原理及 inode 觀念 ---
ext2 (ext3) 檔案系統 (data blockinodeinode numbersuper block檔案系統結構)
ReiserFS 檔案系統
5.2 磁碟分割、格式化及掛載
  5.2.1 建立磁碟分割區 ---fdisk
  5.2.2 建立檔案系統 (格式化) --- mkfsmke2fsmkreiserfsmkswap
  5.2.3 掛載檔案系統 --- mountumount (lsof、fuser)
  5.2.4 df 及 du 指令 ---dfdu
5.3 設定開機自動掛載
  5.3.1 /etc/fstab 的介紹
  5.3.2 /etc/fstab 與 /etc/mtab
5.4 磁碟檢查
  5.4.1 進入維護模式的方式
  5.4.2 執行磁碟檢查 --- fscke2fsckreiserfsckbadblocks
5.5 df 與 du 指令 --- dfdu
5.6 連結檔
  5.6.1 符號連結檔
  5.6.2 硬式連結檔
  5.6.3 分割區空間不足的解決方式
5.7 磁碟限額管理
  5.7.1 確認 quota 套件的安裝
  5.7.2 設定 quota ---
相關指令:quotacheckquotaon (quotaoff)edquotarepquota
5.8 檔案搜尋 --- findwhichlocate (updatedb)


5.1 檔案系統介紹

 在第二章有提到過檔案系統的概念及目錄樹狀結構,相信各位應該還不健忘吧 !

 在 Linux 的目錄結構中,於根目錄底下的一些主要目錄,可以個別獨立成一個分割區,比如 /var、/usr、/tmp、/home、/boot、… 等等,當然每個分割區您都需要給它一個檔案系統。如果您有安裝過 windows 的經驗,應該很清楚的知道在安裝之前,需要先將所指定的分割區做格式化動作,這個行為,就是在製造一個檔案系統給該分割區的意思。

 每個分割區會有屬於自己的分割區類型 (partition type),以 windows 的 partition 來說,如 FAT32、NTFS 等,以 Linux 來說,如 Linux native 及 swap 等。Linux swap 是用來做虛擬記憶體的分割區,其 system id 為 82,至於 system id 為 83 者,則是 Linux native 的分割區,而在 Linux native 分割區上常見到的檔案系統如 ext2、ext3、reiserfs、JFS 等等。

5.1.1 認識 ext2 及日誌式 (journaling) 檔案系統

 如果您接觸 Linux 已有一段時間的話,應該曾經使用過 ext2 這個傳統的檔案系統,先來說說它的一些特色:

   支援最長檔名為 255 個字元。

   支援單一檔案的最大容量為 16 GB ~ 2 TB。

   支援單一分割區的最大容量為 2 TB ~ 16 TB。

   檔案的存取與管理,是以「inode」來實現。

   可加快系統執行效率。

 針對最後一個特色稍微做個補充 ﹔ext2 檔案系統,會把我們所更動的資料先暫存至記憶體的緩衝區內,直到緩衝區空間滿了或系統閒置時才回存磁碟。大家都知道記憶體處理資料的效能要比磁碟高上許多,所以採用這種非同步 (async) I/O 的處理方式,的確對其執行效能是加分的。

 雖然 ext2 的執行效能不錯,不過卻有一個比較大的缺點,就是萬一遇到了非預期的電力中斷或不正常關機時,可能會使得緩衝區裡頭的資料還來不及回存磁碟,因而造成資料的不完整性,所以在下次重新開機時,系統就會幫整個檔案系統做強迫性的磁碟檢查動作,看看是否有損壞或遺失的資料,假使此時您檔案系統裡的資料有好幾十 GB 甚至更多,那這個動作將會耗費您不少時間。

 至於日誌式的檔案系統是怎麼一回事呢 ? 所謂的「日誌」就是「紀錄」的意思,也就是會將系統欲做的更動,先行紀錄在日誌區塊裡,紀錄完成後,才開始進行資料的異動。萬一發生了斷電或不正常關機,在 reboot 後,系統會先去檢查日誌區塊裡的相關紀錄,如果發現紀錄裡頭有未完成的行為,那麼就只需針對這部分來進行處理即可,此時可能會繼續執行未完成的動作或者是取消這個動作,因此檔案系統回復的速度很快,而不必像 ext2 還需對整個檔案系統做磁碟檢查。所以使用日誌式的檔案系統,除了讓您在開機的時候節省不少寶貴時間以外,還可大大提高資料的完整性。

 以下列舉幾個常聽到的日誌式檔案系統:

  ext3
    ext3 檔案系統是在原本 ext2 檔案系統的特色下,再加上個日誌式功能,因此可以把它當成 ext2 的改良版,並且可以向下相容於 ext2。所以如果您系統原本是使用 ext2 檔案系統的話,可以很輕易的將其轉換成 ext3。 RedHat 是最早使用 ext3 的 distribution。
     
  reiserfs
    除了擁有日誌功能外,對存取大量小檔案的效能,較傳統的 ext2 還要快上許多。SuSE 預設就是使用這種檔案系統。
     
  XFS
    SGI 公司所研發,對於處理大型檔案有不錯的效果。
     
  JFS
    由 IBM 公司所研發,與 XFS 的特色差不多。


5.1.2 資料存取原理及 inode 觀念

 這裡分別針對 ext2 (ext3) 及 ReiserFS 來跟各位解說。

ext2 (ext3) 檔案系統

 欲了解 ext2 檔案系統的整個結構,需先清楚 block 及 inode 的觀念,而等有了這些基礎知識後,才有辦法對 ext2 檔案系統做進一步的了解。

  資料區塊 (data block) 的觀念
    在 ext2 (ext3) 檔案系統中, 資料的寫入是以區塊為單位,也就是說資料存放的最小儲存單位為區塊的意思,而其區塊的有效值為 1024、2048、4096 bytes。舉個例來說,假設檔案系統預設的區塊大小 (block size) 為 4096 bytes,當製造一個 100 bytes 的檔案時,將會佔用掉一個區塊,或許您會問,那剩下的空間可不可以提供給其他的檔案來存放呢 ? 答案當然是不行的 ﹔又如果製造了一個 5000 bytes 的檔案,由於一個區塊已不夠用,所以將會使用掉兩個區塊。

這裡所稱的區塊,是指用來存放檔案或目錄內容的地方,所以也稱其為資料區塊 (data block)。或許您又會問,系統中存在著那麼多的資料區塊,究竟是如何找到每個檔案目錄的內容是存放在哪個區塊呢 ? 要了解這個問題,就要先認識一下 inode 了。
     
  inode (index node) 的觀念
   

index node 顧名思義就是索引節點,那當然就是指引您找尋某些資料的意思囉 ! 一個 inode block 的大小為 128 bytes,其所存放的是該檔案的相關屬性及 pointer。檔案屬性部分如檔案類型、檔案的擁有者與所屬群組 ID、檔案存取權限、檔案大小、連結數及時間相關訊息等,而 pointer 主要是指出檔案內容所實際存放的區塊位置。

inode 裡頭存在著 12 個直接指標 (direct pointer),分別指向 12 個直接區塊 (direct data blocks)。而當您在建立一個很大的檔案時,可能這 12 個直接區塊不夠存放,此時就會使用到間接指標 (indirect pointer) 來尋找另一個可用的區塊,以便能夠指向更多的間接資料區塊 (indirect data blocks),那如果再不夠用,就會動用到 double indirect pointer 甚至 triple indirect pointer。

inode 結構圖大致以下:


圖一:inode 結構圖

從剛剛介紹的 inode 觀念裡,並沒有提到檔案名稱,因其不是存放在 inode 中,而是安置於上一層目錄的資料區塊裡頭。

     
  inode number
   

每個檔案目錄都必須要有其唯一的 inode,若撇開連結檔不講,十個檔案就會用掉十個 inode,一百個檔案就會用掉一百個 inode,而這些 inode 的集合就是所謂的 inode table。

當建立起一個檔案時,系統就會分配給它一個專用的 inode,並給予此檔案一個專屬的 inode number,爾後藉由這個 inode number,即可找到 inode table 裡該檔案的 inode 位置,因而能夠找到檔案內容所實際存放的區塊位置。

另外您還需了解目錄的資料區塊內容,在目錄的資料區塊裡,所存放的是其下的檔案目錄名稱,及這些檔案目錄的 inode number。以下圖來說,此目錄內存在著 file1 檔案及其 inode number,而藉由 file1 的 inode number,即可以找到 inode table 裡 file1 的 inode。


圖二: 目錄內容及 inode 關聯性圖示

當您將分割區格式化成 ext2 的檔案系統時,區塊數 (block count) 及 inode 數 (inode count) 就已經固定下來了,所以每個分割區都有它們固定的 block count 及 inode count。而在同一個 partiton 中的檔案目錄,都有其唯一的 inode number (排除連結檔),但不同 partition 之間的檔案目錄,其 inode number 就有可能會相同,因為每個 partition 的 inode table 是彼此獨立開來使用的。請參考以下例子:

barry@suse:~> ls -ldi / /var
2 drwxr-xr-x 25 root root 584 Aug 20 15:26 /
2 drwxr-xr-x 16 root root 392 Aug 13 20:27 /var

上面結果顯示根目錄及 /var 目錄的 inode number 同為 2,因為它們是分屬不同分割區的關係,所以 inode number 當然有可能是相同的。
     
  超級區塊 (Super Block)
    分割區最前面的那個區塊稱之為 Super Block,其內記載著檔案系統裡的一些相關重要資訊,比如 inode 大小與區塊大小、inode 數與區塊數、保留的區塊數 (幫 root 所保留的空間,為總區塊數的百分之五 )、已用掉的 inode 數與區塊數、剩下的 inode 數與區塊數、每個區塊群組所分配的區塊數、 … 等等。

當對檔案系統進行存取動作時,一定會先經過 Super Block,那萬一 Super Block 掛了,後果您可想而知,不過也不用太擔心啦,因為系統上是存在著一些備份的 super block 的。

Super Block 裡所存放的訊息,可藉由執行「tune2fs -l device-name」來取得:

suse:~ # tune2fs -l /dev/hda8
tune2fs 1.38 (30-Jun-2005)
Filesystem volume name: <none>
Last mounted on:     <not available>
Filesystem UUID:     2eb1771c-ba55-46f6-9fea-b346a8c0f79b
Filesystem magic number: 0xEF53
Filesystem revision #:  1 (dynamic)
Filesystem features:   has_journal filetype needs_recovery sparse_super
Default mount options:  (none)
Filesystem state:     clean
Errors behavior:     Continue
Filesystem OS type:    Linux
Inode count:       78312
Block count:       313236
Reserved block count:   15661
Free blocks:       295105
Free inodes:       78301
First block:       1
Block size:        1024
Fragment size:      1024
Blocks per group:     8192
Fragments per group:   8192
Inodes per group:     2008
Inode blocks per group: 251
Filesystem created:    Fri Jan 12 17:28:36 2007
Last mount time:     Fri Jan 12 17:28:42 2007
Last write time:     Fri Jan 12 17:28:42 2007
Mount count:       1
Maximum mount count:   21
Last checked:       Fri Jan 12 17:28:36 2007
Check interval:      15552000 (6 months)
Next check after:     Wed Jul 11 17:28:36 2007
Reserved blocks uid:   0 (user root)
Reserved blocks gid:   0 (group root)
First inode:       11
Inode size:        128
Journal inode:      8
Default directory hash: tea
Directory Hash Seed:   358df2dd-aa83-4b3a-ac94-edd371ce5019
Journal backup:      inode blocks
     
  檔案系統的結構
   

以上觀念都有了之後,接著就來談 ext2 檔案系統的整個架構。當您對某個 partition 格式化成 ext2 的檔案系統時,除最前面的 512 bytes 為 boot sector 外,其他區域則是由數個區塊群組 (block group) 所構成的。

在 partition 裡的第一個 block group (圖三中的 Block Group 0) 中的第一個 block,為 Primary Super Block,至於存在於其他 block groups 中的 Super Block,則稱為 Backup Super Block,所以萬一主要的超級區塊損壞時,還會有備份的超級區塊來讓您對檔案系統做正常存取噢。

接著來探討每個 Block Group 是由哪幾個部分來組成的,請參考下圖:


圖三:檔案系統架構圖

區塊群組結構圖中的超級區塊部分,請參考上一點的說明,這裡只針對其他部分來解說:

˙ Group Descriptor:記載一些資料記錄區所在的位置,比如 Block Bitmap 及 Inode Bitmap 等。
˙ Block Bitmap:紀錄資料區塊目前的使用狀況。從這裡可以了解哪些區塊已使用,哪些未使用。
˙ Inode Bitmap:紀錄 inode 的使用狀況。從這裡可以了解哪些 inode 已使用,哪些未使用。
˙ Inode table:存放檔案屬性及 pointer 等資料。
˙ Data Blocks:這是檔案資料真正存放的地方。

要了解區塊群組裡所存放的詳細資訊,可以執行「dumpe2fs device-name」來觀察:

suse:~ # dumpe2fs /dev/hda8
     :
前面部分是 super block 的訊息,與剛剛看到的一樣,所以就省略囉 !
Group 0: (Blocks 1-8192)
 Primary superblock at 1, Group descriptors at 2-3
 Block bitmap at 4 (+3), Inode bitmap at 5 (+4)
 Inode table at 6-256 (+5)
 0 free blocks, 1997 free inodes, 2 directories
 Free blocks:
 Free inodes: 12-2008
Group 1: (Blocks 8193-16384)
 Backup superblock at 8193, Group descriptors at 8194-8195
 Block bitmap at 8196 (+3), Inode bitmap at 8197 (+4)
 Inode table at 8198-8448 (+5)
 7633 free blocks, 2008 free inodes, 0 directories
 Free blocks: 8752-16384
 Free inodes: 2009-4016
      : 略

以 上面內容裡的 Group1 來做說明好了:

˙ Blocks 8193-16384Group 1 的範圍是從第 8193 個區塊至第 16384 個區塊。
˙ Backup superblock at 8193備份超級區塊在第 8193 個區塊。
˙ Group descriptors at 8194-8195Group descriptors 在第 8194 及 8195 這兩個區塊。
˙ Block bitmap at 8196:第 8196 個區塊處,紀錄著區塊目前的使用狀況。
˙ Inode bitmap at 8197:第 8197 個區塊處,紀錄著 inode 的使用狀況。
˙ Inode table at 8198-8448:Inode table 是存放在第 8198 ~ 8448 個區塊中。
˙ Free blocks: 8752-16384:還可以使用的區塊範圍,是從第 8752 ~ 16384 個區塊 (共 7633個)。
˙ Free inodes: 2009-4016:尚可使用的 inode,其 inode number 是從 2009 ~ 4016 (共 2008 個)。 

一般所謂的 metadata,就是指 Super Block、Block bitmap 及 Inode bitmap 這些紀錄資料,那像 inode table 及 data block 就稱為資料儲存區域。而在談到 ext2 檔案系統時,不是有提到不正常關機後會造成資料的不完整性,這就是因為資料儲存區域與 metadata 的紀錄不相符所造成的。

了解了這個觀念後,來補充一下日誌式檔案系統的運作。當您在修改一個檔案時,會先將您要採取的這個動作紀錄在日誌區塊裡,然後才開始正式的寫入檔案,並記錄在 metadata 中,而當以上步驟都整個完成後,會再次的寫入日誌區塊,表示已經完成了檔案的修改動作了。

 介紹完 ext2 檔案系統後,最後以存取 /etc/passwd 做範例,看看整個存取流程是如何:

  1. 先從 superblock 裡找到根目錄的 inode,再依 inode 中的 pointer,找到了根目錄所在的 block 位置。
  2. 從 / block 取得 etc 的 inode number,因而找到了 etc 的 inode,並依 pointer 找到了 etc 的 block。
  3. 從 etc 的 block,得到 passwd 的 inode number,因而找到了 passwd 的 inode。
  4. 最後就根據 passwd 的 inode,而找到其實際存放的 block,這就是 passwd 的內容了

Tips一般所謂的 block count,約略是將分割區的大小,去除以資料區塊大小所得到的數值。比如分割區大小為 512 MB,一個資料區塊為 2048 Bytes,則用 512 x 1024 x 1024 去除以 2048,而可得到 262144 個 block count。

至於 inode count,是將分割區大小,去除以預計給每一個 inode 所指向檔案的儲存空間大小 ( bytes-per-inode ) 所得到的數值。假設分割區還是 512 MB,而系統規劃每一個 inode 所指向的檔案,其儲存空間大小為 4096 Bytes,則 512 x 1024 x 1024 去除以 4096,而可得到 131072 個 inode count。

如您了解了以上的觀念後,應該知道 inode count 比 block count 還多是沒啥用處的,舉個例子來說,假使 inode count 為 262144,block count 為 131072,那當我們所建立的每個檔案都小於一個資料區塊大小時,則最多只能建立 131072 個檔案,也就是說最多只會用掉 131072 個 inode,結果您會發現系統還會剩下一半的 inode,但卻無法再製造任何的檔案,所以 inode count 大於 block count 是不具任何意義的。

如果今天我們所製造的每個檔案都很大,有可能會造成磁碟空間都用盡了,但卻還有 inode 可用的現象發生 ﹔反過來說,如果建立了很多的小檔案,那就有可能會造成 inode 用光了,但尚有磁碟空間可使用的狀況。

ReiserFS 檔案系統

 直接就來說明這個檔案系統的幾個特色:

  提高磁碟空間之利用:
    ReiserFS 的檔案系統,其檔案目錄的資料是被存放在一個叫平衡樹系 (balanced binary tree) 的資料結構內,對小檔案而言,可直接儲存在樹葉節點而非其他地方,且是依照檔案實際大小來做儲存。
  優異的磁碟儲存效能:
    ReiserFS 的檔案系統中,小型檔案的資料及 inode 資訊可儲存在一起,因此在對檔案做存取時,只需存取一次便能取得所有的資訊。
  動態分配 inode:
    ReiserFS 其 inode 配置是採取動態分配,而不是像 ext2 檔案系統在建立起來後,就有一定的 inode count。
  可回收使用空間:
    ReiserFS 檔案系統中,目錄的空間配置採動態分配,對於此目錄已佔用的磁碟空間,於日後目錄內容縮減時還可以做回收,而 ext2 的檔案系統就做不到這一點。在 ext2 中,若某個目錄已佔用 8192 bytes 的空間,現在將此目錄內容刪除至 4096 bytes 時,實際上這個目錄還是佔據著 8192 bytes 的空間。
  快速回復資料:
    當系統不正常關機後,於下次開機時,可利用日誌功能來追蹤之前的資料變更,因此可快速回復整個檔案系統的資料。

5.2 磁碟分割、格式化及掛載

 當整個作業系統安裝完畢後,或許您還會想要有另外獨立的空間來作為其它的用途,比方說想把將來的備份資料儲存在作業系統外的分割區中,或者針對一些特定目錄來給予其專用的分割區 (如 /var/spool/mail) 等。至於要如何實現這樣的規劃呢 ? 不要急,因為這就是現在要介紹的主題。

 以下開始要為大家說明,如何在硬碟上新增一個分割區,並且讓這個分割區至最後能夠被我們來存取使用。要達到這個目的就必須執行以下三個步驟:

  執行磁碟分割來新增分割區。
 
將此分割區進行格式化,也就是建立檔案系統
 
執行分割區掛載,來把這個 partition 掛載至根目錄下的某個點。

 接著下來的各小節,就是針對這些步驟做介紹。

5.2.1 建立磁碟分割

 這裡會使用 fdisk 這個指令來建立分割區,fdisk 幾乎可適用在所有的 distribution 上頭。

指令 fdisk

 管理 partition table 的工具,常用來建立及刪除 partition。

指令語法
fdisk device
fdisk -l [device ...]
fdisk -s partition ...

參數說明
-l 列出裝置的 partition table,如 /dev/hda、/dev/hdb、/dev/sda 等。
-s 列出所指定分割區的大小,如 /dev/hda3、/dev/hdb5、/dev/sda2 等。

基本範例
suse:~ # fdisk -l /dev/hda

Disk /dev/hda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes


  Device Boot   Start    End   Blocks  Id  System
/dev/hda1        1    638   5124703+  7  HPFS/NTFS
/dev/hda2       639    1913  10241437+  7  HPFS/NTFS
/dev/hda3  *     1914   1926   104422+ 83  Linux
/dev/hda4       1927   4865  23607517+  f  W95 Ext'd (LBA)
/dev/hda5      1927   2122   1574338+ 83  Linux
/dev/hda6      2123   2579   3670821  83  Linux
/dev/hda7      2580   2710  1052226  83  Linux
/dev/hda8      2711   2749   313236  83  Linux
/dev/hda9      2750   2788   313236  82  Linux swap / Solaris
# 顯示第一顆硬碟的分割表。若未指定 device ,則會引用 /proc/partitions 中的資料。 

suse:~ # fdisk -s /dev/hda3
104422
# 列出第一顆硬碟的第三個分割區大小。

 接著來看個修改 partition table 的範例。

範例說明
# 進入 fdisk 的修改畫面:
suse:~ # fdisk /dev/hda

The number of cylinders for this disk is set to 4865.
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)

Command (m for help) :


 如不曉得接下來要執行什麼指令,可先輸入 m 來尋求幫忙:

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)


Command (m for help):

 針對以上所列出之指令,舉幾個較常用到的做說明:

指 令 執 行 事 項
a

設定啟動旗標。

d 刪除分割區
l 列出分割區類型與 system id 的對照一覽表。
n 新增一個分割區。
p 列出 partition table。
q 未儲存所做的改變而離開。
t 改變分割區的 system id。
w 將所做的修改寫入 partition table 並離開。

 了解大略指令用法後,接著就開始做練習囉。

 首先輸入 p 指令,來列出目前的 partition table:

Command (m for help) : p ← 輸入 p 指令。

Disk /dev/hda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot   Start    End   Blocks  Id  System
/dev/hda1        1    638   5124703+  7  HPFS/NTFS
/dev/hda2       639    1913  10241437+  7  HPFS/NTFS
/dev/hda3  *     1914   1926   104422+ 83  Linux
/dev/hda4       1927   4865  23607517+  f  W95 Ext'd (LBA)
/dev/hda5      1927   2122   1574338+ 83  Linux
/dev/hda6      2123   2579   3670821  83  Linux
/dev/hda7      2580   2710  1052226  83  Linux
/dev/hda8      2711   2749   313236  83  Linux
/dev/hda9      2750   2788   313236  82  Linux swap / Solaris

Command (m for help) :

 再來輸入 n 指令,以新增分割區:

Command (m for help) : n ← 輸入 n 指令。
#
如果目前 partition table 裡只有 hda1 及 hda2 時,那在輸入 n 來建立分割區時,
# 您將會看到 e(extended) 及 p(primary partition) 這兩個選項,不過在這裡
# 因為筆者磁碟裡的primary partiton 早就用完了,所以不會看到這個詢問畫面噢。

First cylinder (2789-4865, default 2789) : 
# 以上為設定新增分割區的起始磁柱,使用預設值即可,所以直接按下 Enter 鍵。

Using default value 2789
Last cylinder or +size or +sizeM or +sizeK (2789-4865, default 4865) :
+500 M
# 這是設定結束磁柱大小。由於磁柱換算成 MB 或 GB 不好計算,因此這裡可允許您
# 以 K、MG 等單位來做輸入,讓系統幫您自動換算出近似的 Last cylinder。

Command (m for help) :

 分割區大小設定完成後,可輸入 p 指令來檢查一下:

Command (m for help) : p

Disk /dev/hda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

  Device Boot   Start    End   Blocks  Id  System
/dev/hda1        1    638   5124703+  7  HPFS/NTFS
/dev/hda2       639    1913  10241437+  7  HPFS/NTFS
/dev/hda3  *     1914   1926   104422+ 83  Linux
/dev/hda4       1927   4865  23607517+  f  W95 Ext'd (LBA)
/dev/hda5      1927   2122   1574338+ 83  Linux
/dev/hda6      2123   2579   3670821  83  Linux
/dev/hda7      2580   2710  1052226  83  Linux
/dev/hda8      2711   2749   313236  83  Linux
/dev/hda9      2750   2788   313236  82  Linux swap / Solaris

/dev/hda10      2789    2850   497983+ 83  Linux
← 多了這一行噢

Command (m for help) :

 如一切 ok 的話,即可輸入 w 指令,來將剛剛修改過後的結果寫入 partition table,並退出 fdisk:

Command (m for help) : w ← 輸入 w 指令。
The partition table has been altered!


The kernel still uses the old table.
The new table will be used at the next reboot.
 
Syncing disks.
# 以上訊息是提示您 reboot 後,此 partition table 才會生效。
suse:~ #

 其他像輸入 d 指令可以刪除 partition ﹔輸入 t 指令可改變 partition 的 system id ,如不曉得 system id 是多少,可以輸入 l 指令來查詢。這些基本操作請自行練習看看。


5.2.2 建立檔案系統 (格式化)

 當成功建立起磁碟分割區後,必須製造一個檔案系統來給它使用,即所謂的分割區格式化。而此處會介紹 mkfsmke2fsmkreiserfs 等指令,來幫我們完成這個工作。另外還有個 mkswap 指令,在稍後也會一併說明。

指令 mkfs


 建立 Linux 檔案系統的指令。

指令語法
mkfs [-t fstype] [fs-options] device

 device 為要進行格式化的那個裝置名稱,如 /dev/hda3、/dev/sda5、/dev/fd0 等 ﹔而 -t 是用來指定分割區要建立的檔案系統類型 ﹔至於 fs-options 中比較常用的是 -c ,這個參數主要是讓您在建立檔案系統前,先檢查有無壞軌。

範例說明
suse:~ # mkfs -t msdos /dev/fd0
# 將磁片格式化成 msdos 的檔案系統。

suse:~ # mkfs -t ext2 -c /dev/hda10
suse:~ # mkfs.ext2 -c /dev/hda10
# 以上兩個指令都是要將 /dev/hda10 格式化成 ext2 的檔案係統,並在格式化前檢查
# 有無壞軌。 執行 mkfs 時,若未指定檔案系統類型,則預設就是 ext2。

suse:~ # mkfs -t ext3 /dev/hda10
suse:~ # mkfs.ext3 /dev/hda10
# 將 /dev/hda10 格式化成 ext3 的檔案系統。

suse:~ # mkfs -t reiserfs /dev/hda10
# 格式化成 SuSE 預設的 reiserfs 檔案系統。


指令 mke2fs

 建立 ext2 或 ext3 檔案系統的指令。

指令語法
mke2fs [-b block-size] [-i bytes-per-inode] [-j]
    [-N number-of-inodes] device

參數說明
-b 指定資料區塊大小。其有效值為 1024、2048、4096 bytes。
-c 建立檔案系統前,先檢查有無壞軌。
-i

設定每一個 inode 所指向的檔案,其預計所能儲存的空間大小 ( bytes-per-inode )。

-j 建立 ext3 日誌式檔案系統。
-N 指定 inode count。
-L 格式化同時,指定檔案系統標籤 (fs label)。fs label 可以用來替代裝置名稱來使用。

範例說明
suse:~ # mke2fs -j /dev/hda10
# 將 /dev/hda10 格式化成 ext3 的檔案系統。不加這個參數時,就是建立 ext2 檔案系統。

suse:~ # mke2fs -b 2048 -i 4096 -L test /dev/hda10
# 將 /dev/hda10 格式化成 ext2 的檔案系統,並指定其資料區塊大小為 2048 bytes,然後
# 規劃每個 inode 所指向檔案的儲存空間大小為 4096 bytes,最後則是使用 -L 來指定
# /dev/hda10 的 fs-label 為 test。

suse:~ # tune2fs -l /dev/hda10
# 列出 superblock 的資料,藉此檢視一下剛剛對此分割區所設定的相關數據有無符合。

# tune2fs 只能運用在 ext2/ext3 檔案系統上。這裡再介紹兩個 tune2fs 常用參數給大家參考:
# -j:把原本的 ext2 檔案系統轉換成 ext3。
# -L:用來修改檔案系統標籤,其語法為 "tune2fs -L new-label device"。

指令 mkreiserfs (mkfs.reiserfs)

 建立 ReiserFS 檔案系統的指令。

指令語法:
mkreiserfs [-b block-size] [-l LABEL] device

參數說明:
-b 指定資料區塊大小。其有效值為 512、1024、2048、4096、8192 bytes。
-l 指定檔案系統標籤 (fs-label)。

範例說明:
suse:~ # mkreiserfs /dev/hda10 
# 格式化成 ReiserFS 的檔案系統。

suse:~ # mkreiserfs -b 1024 -l testlabel /dev/hda10
# 格式化成 ReiserFS 的同時,指定其區塊大小為 1024 bytes,檔案系統標籤為 testlabel。

suse:~ # reiserfstune /dev/hda10
# 查看 block size 及 LABEL 是否有符合您所做的設定。

指令 mkswap

 mkswap 指令,可針對分割區或檔案進行格式化的動作,以產生可提供系統使用的 swap 區域。而這個地方主要是針對分割區來做介紹。

 假使您已經使用 fdisk 成功新增了一個新的分割區 /dev/hda11,那以下就針對此分割區來進行 mkswap:

範例說明
suse:~ # mkswap /dev/hda11
Setting up swapspace version 1, size = 509927 kB
# 將 /dev/hda11 格式化成 swap 的格式。

suse:~ # swapon /dev/hda11
# 在格式化完成後,不要忘了啟用 swap 交換區。啟用之後您可執行 free 指令去做個確認。
# 若要關掉 swap,執行 "swapoff /dev/hda11" 即可。


5.2.3 掛載檔案系統

 前面已經學會了如何新增分割區及格式化,目前就只差一個掛載的步驟,等學會了掛載後,就可以開始對這個檔案系統作存取了。您必須要把 Linux 所支援的檔案系統,掛載至根目錄下的某個目錄或子目錄中,這樣才能夠開始對其進行存取,這個被掛載的目錄或子目錄就稱為掛載點 (mount point)。所以將檔案系統掛載至掛載點的動作就叫做掛載 (mount) 啦。

 不過這裡要注意的是掛載點的選擇,首先掛載點必須是一個已經存在的目錄,而且最好是一個空目錄 (可自行建立),但千萬不要選擇根目錄下的一些重要目錄作為掛載點,那要是真的這樣做會發生什麼事呢 ? 舉個例子,如果剛剛上面所建立的分割區 /dev/hda10,您把它掛載至 /home,那麼您在 /home 目錄中所看到的將會是 /dev/hda10 的內容,而原本 /home 裡頭的資料將會暫時的消失,所以想當然爾,使用者此時自然就無家目錄可用了,除非等您執行卸載 (umount) 後,才再讓 /home 回復到原來的內容。

 了解這個道理後,您可以想想看,如果我把 /dev/hda10 掛載到 /etc 會產生什麼嚴重的後果 ?

 Li
nux 本身能支援很多的檔案系統,如 minix、ext2、ext3、reiserfs、ntfs、vfat、msdos、iso9660 (CD-ROM)、udf (DVD-ROM),以及像 nfs、smbfs 這類的網路檔案系統等等,要存取這些檔案系統就必須將它們掛載進來,而執行掛載任務的就是 mount 這個指令。

指令 mount

 掛載檔案系統的指令。

指令語法
mount [-t fs-type] [-n] [-o options] device-name mount-point
mount [-l]
mount -a

 只單純執行 mount 指令時,會將目前已掛載的檔案系統全部列出來。 /etc/mtab (mount table) 是用來動態紀錄檔案系統的掛載訊息。當您掛載檔案系統後,會在 /etc/mtab內紀錄這些掛載紀錄,而在卸載檔案系統時,此檔案系統的掛載紀錄即從 /etc/mtab 中被移除。

參數說明
-l 如您有為檔案系統設立標籤 (label),那麼執行「mount -l」時,所輸出的 mount table 裡,會顯示檔案系統標籤。
-n 執行掛載時,若加上這個參數,將不會把此掛載紀錄寫入 /etc/mtab 之中。如果您的 /etc 目錄是處在一個唯讀的檔案系統中,就需要用到這個參數。
-a 將 /etc/fstab 裡的檔案系統全部掛載起來,不過有設定 noauto 選項的檔案系統除外。
-t 指定要掛載的檔案系統類型。
-L 當檔案系統有設定 fs-label 時,那麼執行掛載時,可以使用「-L Label」來代替裝置名稱。比如 /dev/hda10 的 fs-label 為 test,則可以執行「mount -L test /mnt/hda10」來將此 partition 掛載進來。
-o 掛載檔案系統時,可以使用「-o」來額外指定一些選項進去,不過有少部分選項,只有設定在 /etc/fstab 時才能發揮效用。
以下大略列出一些選項來提供參考:
˙ exec:表示存在於檔案系統上的 binary file 能被執行。相反選項為 noexec。
˙ suid:檔案系統的 binary file,如具有 SUID 或 SGID 屬性,則能發揮這個屬性的效用。相反選項為 unsuid。
˙ user:允許一般使用者掛載該檔案系統,不過當使用者執行掛載後,只有該使用者及 root 可以執行卸載。如想讓每個使用者都可以執行掛載及卸載,則需改用 users 選項。相反選項為 nouser。
˙ sync:檔案系統 (只限於 ext2、ext3 及 ufs) 所採取的是同步 I/O,也就是將系統所做的更動,讓磁碟與記憶體做同步寫入。相反選項為 async。
˙ ro、rw:將檔案系統掛載成唯讀 (ro) 或可讀可寫 (rw)。
˙ dev:能於檔案系統上,解析出字元裝置或區塊裝置。相反選項為 nodev。
˙ remount:對於已經掛載的檔案系統,執行重新掛載的動作。
˙ auto:在 /etc/fstab 裡的檔案系統有設定 auto 選項時,則於開機過程會被自動掛載 ﹔另外在命令列上執行「mount -a」時,也能自動掛載這些檔案系統。相反選項為 noauto。
˙ defaults:defaults 就等於以下選項的組合:rw、suid、dev、exec、auto、nouser、async。

範例說明
# 先建立 /dev/hda10 的掛載點 /mnt/hda10:
suse:~ # mkdir /mnt/hda10

# 執行掛載(假設剛剛已把 /dev/hda10 格式化成 reiserfs 的檔案系統):
suse:~ # mount -t reiserfs /dev/hda10 /mnt/hda10

# 完成掛載後,可用 "df" 或 "mount" 指令,檢查看看是否有掛載:

suse:~ # df
Filesystem
   1K-blocks   Used  Available Use% Mounted on
/dev/hda5
     1261012  591192   669820  47% /
/dev/hda3
     104376   36764     67612  36% /boot
/dev/hda8
     514028   32876   481152  7% /home
/dev/hda6
     2522028  1775520   746508  71% /usr
/dev/hda7
     514028   93596   420432  19% /var
/dev/hda10      497900   32840   465060  7% /mnt/hda10 
# df 指令在 5.5 節會說明。

suse:~ # umount /mnt/hda10
# 執行卸載。umount 指令等一下會說明。

# 將 device 掛載成唯讀的檔案系統:
suse:~ # mount -o ro /dev/hda10 /mnt/hda10

# 做個測試看看:
suse:~ # cd /mnt/hda10
suse:/mnt/hda10 # touch testfile
touch: cannot touch `testfile': Read-only file system
# 因剛剛 /dev/hda10 已被掛載成 read-only,所以無法新增檔案。


# 重新掛載成可讀寫的檔案系統:
suse:~ # mount -o rw,remount /mnt/hda10
# 這裡是針對 mount-point 來進行 remount,當然您要針對 device 也是可行的。

# 再來練習掛載 cdrom,先製造個掛載點:
suse:~ # mkdir /mnt/cdrom

# 執行掛載 (光碟片可不要忘了先放進去噢):
suse:~ # mount -t iso9660 /dev/cdrom /mnt/cdrom

 除了以上介紹的範例外,mount 還有另外一個比較特殊的用法,就是把某個目錄掛載至另一個目錄,其語法如下:

   mount --bind olddir newdir

 這樣一來,您就可以對這兩個目錄存取相同的內容。

Tips執行 mount 指令時,沒使用 -t 參數來指定檔案系統類型也是可以的,因為系統會根據 /etc/filesystems 去尋找您合用的檔案系統。

指令 umount

 卸載檔案系統的指令。

指令語法
umount [device|mount-point]

 umount 可以針對裝置名稱掛載點來進行卸載,不過卸載前,記得要先將目錄切離目前的掛載點,否則無法執行卸載。

範例說明
suse:/mnt/hda10 # umount /mnt/hda10
umount: /mnt/hda10: device is busy
umount: /mnt/hda10: device is busy
# 看到沒,因為您目前的工作目錄就在掛載點上,所以無法進行卸載。

suse:/mnt/hda10 # cd
suse:~ # umount /mnt/hda10
# 切離掛載點後,就可以成功卸載了。

# 不過有時候您會發現雖然目前的工作目錄不是在掛載點上,但還是無法進行卸載:
suse:~ # umount /home
umount: /home: device is busy
umount: /home: device is busy

# 此時可使用 lsof 或 fuser 指令檢查一下:
suse:~ # lsof /home
COMMAND  PID USER FD TYPE DEVICE  SIZE NODE NAME
bash   3990 barry cwd  DIR   8,2  808  54 /home/barry
vi    4354 barry cwd  DIR   8,2  808  54 /home/barry
vi    4354 barry  4u REG   8,2 12288  29 /home/barry/.file.swp

#
lsof 即 list open files 之意,可列出程式所開啟的 file,此 file 可以是一般檔案、
# 目錄、裝置等。而從以上的結果可以看出, bash 及 vi 兩支程式目前正在存取 /home , 
# 因此才無法對 /home 進行卸載。

suse:~ # fuser -vm /home

      USER   PID  ACCESS  COMMAND
/home:   barry  3990  ..c..   bash
      barry  4498  F.c..   vi

# 如此也可輕易看出存取 /home 的相關程式為何。

# 若想終止所有程式對 /home 的存取,可再加上個 -k 參數即可:
suse:~ # fuser -vmk /home

# 存取 /home 的程式被終止後,應該就能順利卸載了。
suse:~ # umount /home


5.3 設定開機自動掛載


 各位或許會覺得納悶,為何登入系統後,也沒執行 mount 指令,但卻可以正常的存取每個 partition ? 這就是因為 /etc/fstab 這個檔案的關係啦。/etc/fstab 紀錄著檔案系統的相關資訊,其為系統於開機過程中必須去讀取的一個重要檔案。

 /etc/fstab 的內容共分六個欄位,如下所示:


 device  mount-point  fs-type  options dump  fsck
  裝置     掛載點   檔案系統類型   選項   備份  磁碟檢查

 看了這個內容後,有沒有感覺跟我們在命令列上執行 mount 指令時很像,沒錯,其實系統在開機過程中,就是根據這裡的設定,來將 device 掛載至 mount-point 上頭,所以在開機完成後,便可很輕鬆的存取每個 partition。

 了解了 /etc/fstab 的重要性後,接下來的第一小節即是要介紹這個檔案。

5.3.1 /etc/fstab 的介紹

 先瀏覽一下其大致內容:

suse:~ # cat /etc/fstab
/dev/hda5  /        reiserfs  acl,user_xattr  1 1
/dev/hda3  /boot      reiserfs  acl,user_xattr  1 2
/dev/hda8  /home      reiserfs  acl,user_xattr  
1 2
/dev/hda6  /usr       reiserfs  acl,user_xattr  1 2
/dev/hda7  /var       reiserfs  acl,user_xattr  1 2
/dev/hda9  swap       swap    defaults     0 0
proc     /proc       proc     defaults      0 0
sysfs     /sys       sysfs    noauto       0 0
usbfs     /proc/bus/usb  usbfs    noauto       0 0
devpts    /dev/pts     devpts    mode=0620,gid=5  0 0
/dev/fd0   /media/floppy  auto     noauto,user,sync 0 0

 以下分別從第一至第六欄位依序做介紹:

  1. 裝置名稱
    分割區的裝置名稱,一般是使用 /dev/hdax (如 hda1、hda2、…) 或 /dev/sdax 來做設定,當然也可以使用 fs label 的方式來代替 device-name。

  2. 掛載點
    這個應該不成問題。

  3. 檔案系統類型
    指出此裝置的檔案系統為何。比較有意思的是 Floppy 在這個地方設定成 auto,這就類似於在命令列上執行 mount 時,未使用 -t 參數來指定檔案系統類型的意思差不多,也就是會根據 /etc/filesystems 來找尋合用的檔案系統,而該檔內容中,如於最後一行出現「*」,則表示會去讀取 /proc/filesystems,以套用合適的類型 (有 nodev 標籤的除外)。

  4. 掛載參數 (options):
    就是在 mount 指令中所介紹的那些選項,請自行參考 mount 那邊的說明。當這個欄位指定為 noauto 者,表示在開機過程不會自動掛載這些檔案系統。另外 acl (Access Control Lists) 及 user_xattr (Extended User Attributes) 這兩個選項,是用來讓該檔案系統支援存取控制表及檔案延伸屬性的。

  5. 備份 (dump):
    dump 是用來對 ext2 檔案系統進行備份的指令,而 dump 會根據 /etc/fstab 檔案中這個欄位的設定,來決定備份與否。當設定成 0,表示不做備份,那如果設定成 1,就表示要備份。

  6. 磁碟檢查 (fsck):
    設定系統開機時,fsck 程式執行檔案系統檢查的順序。其值可設定成 0、1 或 2﹔設定成 1,表示該檔案系統是在開機過程中,最優先做磁碟檢查的,由於根檔案系統須先於其它檔案系統作磁碟檢查,故應設為 1。而 root partition 以外的其他 Linux native partition 則設為 2,代表著根檔案系統檢查完畢後,接著也會對這些檔案系統進行檢查。至於非 Linux native 者就設成 0,表示 fsck 程式不會對這些檔案系統進行檢查。
    這裡還有一個地方要注意,以 ext2 來說,如果上一次您是正常關機的話,則在這次開機時並不會做 fsck,除非是不正常關機,或已到檔案系統最大掛載次數,或距上次執行 fsck 的時間間隔已到時,才會在下次開機時強迫做磁碟檢查。

 將檔案系統資訊設定在 /etc/fstab 還有另一個好處,就是當使用 mount 指令執行掛載時,可直接針對 device 或 mount-point 來進行掛載即可。舉例來說,假使在 /etc/fstab 有如下設定:

/dev/cdrom  /mnt/cdrom  iso9660  noauto,user  0 0

 此時掛載 cdrom 時,只需執行「mount /mnt/cdrom」或mount /dev/cdrom」就行了。

 另外在 SLES10 中,如果您已經登入 X-WINDOW 裡了,那當您將光碟片放入後,將可直接於視窗介面或文字介面下對其做存取,不需再額外執行掛載的動作。


5.3.2 /etc/fstab 與 /etc/mtab

 一般人容易把 /etc/fstab 及 /etc/mtab 這兩個檔案搞混,其實您只要針對檔名的解釋,就應該能很清楚做區分。fstab 是 file system table,mtab 是 mount table,前者顯示的是檔案系統的靜態資訊,並可設定下次開機時要自動掛載哪些檔案系統 ﹔後者是用來紀錄目前有掛載的檔案系統之動態資訊,會隨者您執行掛載或卸載的動作而呈現不同的內容。


 如果現在想查詢目前正掛載著哪些檔案系統,那麼可使用以下的方式來觀察:

# 以瀏覽檔案方式來觀察:
barry@suse:~> cat /proc/mounts
barry@suse:~> cat /etc/mtab

# 以指令方式來觀察:
barry@suse:~> mount [-l]
barry@suse:~> df

5.4 磁碟檢查

 剛開始接觸 Linux 的朋友,一定都有個經驗,就是只要遇到操作過程不順,或者無法正常開機時,就會把作業系統重灌一次,這是因為您對系統的相關知識認識的還不夠,不曉得遇到問題時該如何處理,所以才會一直重複安裝作業系統,而一旦您對系統慢慢熟悉之後,自然就懂得如何找出問題點以及如何除錯了。

 有很多時候造成無法開機的原因,都是因為系統檔案設定有誤,不過如果您確認系統一些與開機相關的重要檔案都沒設定錯誤,但還是無法順利開啟作業系統時,那可能就要執行磁碟檢查了。

 這裡主要是介紹像 fsck、reiserfsck 這幾個磁碟檢查的工具,它們是用來檢查及修復 Linux 的檔案系統。在一般系統正常的情況下,不需使用這些工具,只有在檔案系統出問題時,才考慮去使用它。

 一般在執行磁碟檢查時,最好是能在維護模式 (單人模式、救援模式) 下進行,所以先學會如何進入維護模式是必要的。另外如果與開機相關的檔案設定有誤,而造成無法順利啟動系統時,也是需要進入維護模式才能修改檔案。

5.4.1 進入維護模式的方式

 以下介紹幾種進入 SuSE 維護模式的方法:

  單人模式
    於 grub 選單畫面中,先選取您要開啟的 Linux 作業系統,接著到畫面最底下的 [Boot Options] 處輸入數字 1 ,然後按下 Enter 鍵即可,而在您成功輸入 root 密碼後,即能順利進入。
     
  救援模式
    先把安裝光碟放入,然後從光碟開機,接著在選單畫面選取「Rescue System」再按下 Enter 鍵,最後應該會看到「login:」的登入提示,此時請輸入 root 帳號進入即可。再來請執行以下的步驟:

 ˙ 掛載根目錄:執行「mount /dev/hda5 /mnt」。
 ˙ 將 /dev 掛載至 /mnt/dev:執行「mount --bind /dev /mnt/dev」。
 ˙ 改變根目錄位置:執行「chroot /mnt
 ˙ 把 /etc/fstab 中的其它 partition 掛載進來:執行「mount -a

當系統維護完畢要重新開機前,請先執行 exit 指令來退出 chroot,然後再執行「init 6」來 reboot 就行了。
     
  Failsafe 模式
    在 grub 選單畫面上選擇 Failsafe,然後以 root 來登入就行了。Failsafe 模式是以指定的核心參數來開啟 Linux,當您系統出問題時,可嘗試利用這種方式來進入。

5.4.2 執行磁碟檢查

 執行磁碟檢查之前,請先把即將進行磁碟檢查的分割區 umount,或者 remount 為 read-only ( 例如根目錄 ),然後才開始對該分割區執行檔案系統的檢查工作。再來介紹幾個檢查檔案系統的工具。

指令 fsck

 檢查及修復 Linux 檔案系統。

指令語法
fsck [options] device-name

參數說明
-t 指定被檢查裝置的檔案系統類型。
-A 對 /etc/fstab 所列的檔案系統進行檢查。這個參數會在開機過程中、於掛載檔案系統前,被核心來使用,只要是不正常卸載檔案系統時,就會對該檔案系統進行磁碟檢查。
-r 使用互動式交談模式來修復檔案系統。一般在執行磁碟檢查時,若發現有要修復的檔案,系統會詢問您是否要修復,等您回答後,才繼續進行下一個動作。
-a 不會提出詢問,而自動幫您修復檔案系統。

範例說明
suse:~ # fsck -t ext2 /dev/hda10
# 上式也可寫成 "e2fsck /dev/hda10"

suse:~ # fsck -a /dev/hda10
# 自動修復檔案系統,不做任何的詢問。

指令 e2fsck

 檢查及修復 ext2 或 ext3 的檔案系統。

常用參數

-c 檢查有無壞軌。
-p 不詢問使用者而自動修復檔案系統。與 -a 參數差不多意思 。
-y 執行磁碟檢查的過程中,對所有的詢問,系統會自動幫您回答 "yes"。

範例說明
suse:~ # e2fsck -c /dev/hda10
#
執行磁碟檢查前,先檢查有無壞軌。

suse:~ # e2fsck -y /dev/hda10
#
對所有是否修復檔案的詢問,自動幫您回答 yes。


指令 reiserfsck

 檢查 reiserfs 檔案系統的指令。另外亦可使用 fsck.reiserfs 來進行檢查工作。

範例說明
suse:~ # fsck.reiserfs /dev/hda10

Will read-only check consistency of the filesystem on /dev/hda10
Will put log info to 'stdout'

Do you want to run this program?[N/Yes] (note need to type Yes if you do): Yes
##########                         
reiserfsck --check started at Wed May 3 22:33:54 2006    確定要做磁碟檢查
##########
Replaying journal..
Reiserfs journal '/dev/hda10' in blocks [18..8211]: 0 transactions replayed
Checking internal tree..finished
Comparing bitmaps..finished
Checking Semantic tree:
finished
No corruptions found
There are on the filesystem:
Leaves 17
Internal nodes 1
Directories 30
Other files 65
Data block pointers 16 (0 of them are zero)
Safe links 0
##########
reiserfsck finished at Wed May 3 22:33:57 2006
##########

suse:~ # reiserfsck -y /dev/hda10
# 加上 -y 參數後,就不會看到 [ Do you want to run this program? ] 這個詢問了。


指令 badblocks

 這個指令可檢查您磁碟有無壞軌。

範例說明
suse:~ # badblocks -v /dev/hda10
# 加上 -v 參數,可以顯示檢查進度。

5.5 df 及 du 指令

 在 5.2.3 小節介紹掛載時,有提到可以利用 df 指令來檢視檔案系統的掛載資訊,而實際上這個指令的主要作用,是用來查看目前檔案系統所使用磁碟空間狀況。至於另一個 du 指令,則是顯示檔案目錄所使用磁碟空間情形。

指令 df

 
報告檔案系統所使用磁碟空間狀況。

指令語法
df [OPTION]... [FILE]...

參數說明
-k 以 KB 為單位,來顯示檔案系統所使用的磁碟空間狀況。此為預設值。
-h 會以適當的讀取格式來調整顯示的單位。
-T 列出檔案系統類型。
-t 指定要查看的檔案系統類型。
-i 列出檔案系統的 inode 訊息。

範例說明
suse:~ # df
Filesystem
   1K-blocks   Used  Available Use% Mounted on
/dev/hda5
     1261012  591192   669820  47% /
/dev/hda3
     104376   36764     67612  36% /boot
/dev/hda8
     514028   32876   481152  7% /home
/dev/hda6
     2522028  1775520   746508  71% /usr
/dev/hda7
     514028   93596   420432  19% /var
# 列出目前已掛載的檔案系統所使用磁碟空間的情形。內容中各欄位所代表意義,由左至右
# 裝置名稱、該檔案系統所佔用磁碟空間大小已使用空間、剩餘可用空間、空間使用率及
# 掛載點等。預設顯示的單位為 KB,如希望以 MB 做單位,則執行 df -m。

suse:~ # df -h
# 使用此參數,可讓所顯示磁碟空間大小的單位,視字元長度而自動調整。

suse:~ # df -T
# 讓所列出的內容中,多一個檔案系統類型的欄位。

suse:~ # df -i
# 檢視每個檔案系統 inode count 的資訊。此參數 ReiserFS 不適用,
# 因其 inode 是屬於動態分配的。


suse:~ # df -t reiserfs
# 只列出檔案系統類型為 reiserfs 者。

suse:~ # df /home/barry
Filesystem    1K-blocks   Used  Available Use% Mounted on
/dev/hda8      514028   32876   481152  7% /home
# df 之後,如有指定檔案或目錄時,則會顯示該檔案目錄所在分割區的使用空間情形。

指令 du

 計算檔案目錄所使用的磁碟空間大小。

指令語法
du [OPTION]... [FILE]...

參數說明
-k 以 KB 為單位,來列出檔案目錄所使用的磁碟空間情形。此為預設值。
-h 會以適當的讀取格式來調整顯示的單位。
-a 輸出的內容中,會包含檔案在內。
-s 列出檔案目錄所佔用的總空間數據。
-b 指定顯示單位為 bytes ﹔如要以 MB 為單位,則需使用 -m 參數。

範例說明
suse:~ # du
# du 後面未指定檔案目錄時,就是列出目前所在的工作目錄共使用了多少磁碟空間,這其中
# 包括此目錄樹系裡的所有檔案目錄都計算在內。
# 另外 du 預設的顯示單位為 KB,所以跟 "du -k" 是相同的。

suse:~ # du -b /etc/passwd
2074  /etc/passwd
# 顯示 passwd 的檔案大小為 2074 bytes,這跟使用長格式時所看到的檔案大小是一樣的。
# 另外如果是以預設的 KB 單位來做計算的話,則看到的結果會是 4 K,因為 SuSE 預設的
# 資料區塊大小是 4096 bytes。

suse:~ # du /etc/passwd
4  /etc/passwd

suse:~ #du /etc
# 計算 /etc 目錄共使用了多少磁碟空間。

suse:~ # du -a /var
# 加上 -a 參數後,會在螢幕上把所有檔案及目錄其使用的磁碟空間大小,都詳細的列出來。
# 如不加此參數,則在螢幕上輸出的內容裡,就只有目錄的資訊。

suse:~ # du -s /home
249  /home
# 只列出 /home 目錄所佔用的總空間數據。



5.6 連結檔


 在 Linux 中的連結檔有區分成兩種,分別是硬式連結檔 (hard link file) 與符號連結檔 (symbolic link file),而符號連結檔又稱為軟式連結檔 (soft link file)。至於建立連結檔所使用的指令為 ln,其基本語法如下:

指令語法
ln [OPTION]... TARGET [LINK_NAME]
ln [OPTION]... TARGET... DIRECTORY

 TARGET 是指所建立的連結檔是連結到哪裡,LINK_NAME 則是指那個即將建立的連結檔名稱 ﹔當 TARGET 有好幾個時,則最後一個引數必須是一個已經存在的目錄,這樣才能在這個目錄下建立與那些 TARGET 同名的連結檔出來。

參數說明
-s 建立符號連結檔時,所必須使用的參數。當不加此參數而建立起來的連結檔,就是硬式連結檔。
-f

如要建立的連結檔名稱已經存在時,則會先將此檔移除,然後再讓您建立起這個連結檔。

 接著以下兩小節,就個別針對這兩種連結檔來做說明。

5.6.1 符號連結檔


 剛剛前面提到的這兩種類型的連結檔,在運用上其實各有其優缺點,不過由於符號連結檔的優點多於它的缺點,所以還是有比較多的人喜歡使用符號連結檔。至於符號連結檔的相關特性說明如下:

可針對不同分割區內的檔案及目錄做符號連結。

target file 與 link file 的 inode number 不同。

target file 與 link file 的檔案屬性不同。

target file 或 link file 修改內容後,另一個檔案的內容也會跟著改。

target file 刪除後,link file 就看不到任何內容了。

 如對上面的說明有疑慮,請繼續參考以下的範例說明。

範例說明

# 這裡是假設 /home 及 /tmp 分屬不同分割區。
# 首先使用 root 身分在 /tmp 目錄下建立 testfile 檔案:
suse:~ # cp /etc/passwd /tmp/testfile

# 然後使用 barry 身分建立符號連結檔 softfile:
barry@suse:~> ln -s /tmp/testfile softfile
# 這就是針對不同分割區內的檔案,執行符號連結的範例。

# 針對目錄做符號連結範例:
barry@suse:~> ln -s /var softdir

# 使用長格式來比較檔案屬性及 inode number 是否不同:
barry@suse:~> ls -li /tmp/testfile softfile
37062 -rw-r--r-- 1 root root 1362 Feb 7 14:30 /tmp/testfile
  28 lrwxrwxrwx 1 barry users  13 Feb 7 14:32
softfile -> /tmp/testfile

# 接著請您使用 root 身分去修改 /tmp/testfile 的內容,完成後再觀察
#
softfile 的內容是否也有跟著改變,自己練習看看囉 !
# 另外要留意的是,barry 對這個符號連結檔的真正存取權限是與 TARGET file 相同的。

# 最後把 TARGET file 刪除,然後用 barry 登入,並對 softfile 做存取:

suse:~ # rm -f /tmp/testfile
barry@suse:~> cat softfile
cat: softfile: No such file or directory
# 其實符號連結檔說穿了,也只不過是個 pointer 罷了,其所指向的是一個 path-name ,
# 所以當 TARGET file 刪除後,自然就找不到連結檔了。

# 請繼續參考以下的範例:
barry@suse:~> ln -s /etc/passwd
barry@suse:~> ls
Documents bin passwd public_html
# 當忽略 LINK_NAME 時,就會在當前目錄下,建立一個與 TARGET file 同名稱的連結檔。

barry@suse:~> ln -s /etc/fstab passwd
ln: creating symbolic link `passwd' to `/etc/fstab': File exists
# 由於 passwd 這個檔名已經存在,所以無法成功建立連結檔。

barry@suse:~> ln -sf /etc/fstab passwd
# 加上 -f 參數後,即可先將 passwd 檔案移除,之後當然就能順利建立起連結檔了。

barry@suse:~> mkdir dir
barry@suse:~> ln -s /etc/passwd /etc/fstab dir
barry@suse:~> ls -l dir
lrwxrwxrwx 1 barry users 10 Feb 7 15:06 fstab -> /etc/fstab
lrwxrwxrwx 1 barry users 11 Feb 7 15:06
passwd -> /etc/passwd
# 此範例說明了當有多個 TARGET file 時,最後一個引數必須是一個已經存在的目錄。

5.6.2 硬式連結檔

 
由於硬式連結檔的形成,會受到一些條件的限制,因此不似符號連結檔般那麼受歡迎,不過話雖如此,還是有它的優點在啦。接著來看看硬式連結檔有哪些特性:

無法對不同分割區內的檔案做硬式連結。

不能針對目錄做硬式連結。

target file 與 link file 的 inode number 相同。

target file 與 link file 的檔案屬性相同。

target file 或 link file 修改內容後,另一個檔案的內容也會跟著改。

任何一個檔案刪除後,另一個檔案仍保有原內容。

範例說明

# 這裡還是假設 /home 及 /tmp 分屬不同分割區。
# 首先使用 root 身分在 /tmp 目錄下建立 testfile 檔案:
suse:~ # cp /etc/passwd /tmp/testfile

# 然後使用 barry 身分建立硬式連結檔 hardfile:
barry@suse:~> ln /tmp/testfile hardfile
ln: creating hard link `hardfile' to `/tmp/testfile': Invalid cross-device link
# 這是針對不同分割區內的檔案,建立硬式連結失敗後所顯示的訊息。

# 針對目錄做硬式連結:
barry@suse:~> ln /var hardfile
ln: `/var': hard link not allowed for directory
# 這是告知您無法對目錄做硬式連結啦。

# 接著使用 root 身分來複製 /etc/fstab 至 /home/barry 內:
suse:~ # cp /etc/fstab ~barry

# 再來使用 barry 身分建立硬式連結檔:
barry@suse:~> ln fstab hardfile

# 比較 target file 跟 hard link file 的相關屬性:
barry@suse:~> ls -li fstab hardfile
248 -rw-r--r-- 2 root root 865 Feb 7 15:40 fstab
248 -rw-r--r-- 2 root root 865 Feb 7 15:40 hardfile

# 注意到沒,兩個檔案的 inode number、權限、擁有者、擁有群組、… 全都相同


 最後可試著將 target file 或 link file 刪除,結果您會發現另外一個檔案的內容還是可以正常做存取。針對這個特色稍微做個補充 ﹔由於 target file 與 hard link file 的 inode number 是相同的,意即它們是指向同一個 inode,因此所存取的資料區塊是相同的 ﹔現在如果其中一個檔案被刪除了,那另一個檔案還可以保有這個 inode 及 data block 的資料,除非您將這兩個檔案都刪除後,此 inode 及 data block 的空間才能被釋放出來。

 其實平常在建立連結時,使用符號連結的機會較大,因為硬式連結畢竟有一些限制存在。而做連結的好處,除了可以節省磁碟空間外,也可以藉著修改 TARGET file,而讓所有連結至這個檔案的使用者,取得檔案內容的一致性。

5.6.3 分割區空間不足的解決方式

 符號連結檔其實還有個很好用的地方,就是可以暫時解決某個磁碟分割區空間不足的問題。舉個例子來說好了,假設 /home 及 /var 為各自獨立的 partition,而現在發現 /home 已經剩沒多少空間可用,但是 /var 的分割區還留有很多可用的空間,此時您就可以利用符號連結的方式來解決這個問題。詳細做法如下:

# 先將 /home 目錄複製到 /var 中:
suse:~ # cp -a /home /var/home

# 確定資料已完整複製過去後,再卸載 /home partition:
suse:~ # umount /home

# 移除 /home 目錄:
suse:~ # rm -rf /home

# 建立符號連結檔:
suse:~ # ln -s /var/home /home
# 如果剛剛 /home 目錄未事先移除的話,那這時候便會在 /home 目錄下
# 建立起一個 home 的符號連結檔噢。

# 以上就是大致的步驟。

# 若要回復原來的狀態,可以這麼做:
suse:~ # rm -rf /home
suse:~ # mkdir /home
suse:~ # mount /home

 上面的做法,是針對其它分割區還剩有很多空間時可以使用的,那萬一這顆硬碟已無多餘空間可利用時該怎麼辦呢 ? 此時就要考慮加掛一顆硬碟囉。實際做法也很簡單,首先先使用 fdisk 來新增分割區,比如是 /dev/hdb1,並且製造一檔案系統給他,然後接著按照以下的步驟進行:

# 先建立掛載點:
suse:~ #
mkdir /mnt/hdb1


# 將新增的 partition 掛載上去:
suse:~ # mount /dev/hdb1 /mnt/hdb1

# 把 /home 的內容複製到新增的分割區當中:
suse:~ # cp -a /home/* /mnt/hdb1

# 確定成功複製過去後,再執行卸載:
suse:~ # umount /mnt/hdb1

# 接著把原本掛載至 /home 的 partition 卸掉:
suse:~ # umount /home

# 再把剛剛那個新增的分割區掛載至 /home,這樣就大功告成了:
suse:~ # mount /dev/hdb1 /home

 最後請記得要到 /etc/fstab 裡去做個調整:

/dev/hdb1   /home   reiserfs   acl,user_xattr  1  2


5.7 磁碟限額管理 (Managing disk quota)

 quota 是用來對使用者或群組做不同的或相同的磁碟空間使用限制,且 quota 只能針對 partition 做限制,而無法針對 partition下的某個目錄設限。比如您想限制使用者在家目錄下的使用空間,那麼就可針對 /home partition 做 quota ﹔又如想限定使用者的信箱容量,則可針對 /var/spool/mail 來做 quota,當然前提是 /var/spool/mail 為一獨立的 partition。

5.7.1 確認 quota 套件的安裝

 在設定 quota 之前,請先確認 quota 套件有安裝,不過由於套件管理指令尚未學習到,因此先使用 YaST 來搞定。

  1. 進入 YaST2 控制中心後,選取 [軟體管理]:


                        圖一:YaST2 控制中心主畫面

  2. 於 [過濾器] 處選擇 [搜尋]:


                             圖二:套件管理畫面

  3. 輸入欲查詢的套件名稱:


              圖三:套件搜尋畫面

  4. 於 [動作] 處選擇 [選取]:


                       圖四:套件處理方式的畫面

    在圖四中,如果搜尋出來的 quota 套件,其名稱的左手邊有出現 [i] 時,表示此套件已安裝在系統上,如果套件名稱的左手邊都是空白的話,那當然就是沒安裝囉,此時就請將此套件 [選取] 起來。

  5. 沒問題的話,就選取 [接受]:


                           圖五:選取套件後的畫面

    注意到套件名稱的左手邊多出了個 [+] 的符號表示該套件已被選取。

  6. 放入安裝光碟並選取 [確定] 即可:


           圖六:提示插入光碟畫面

    接著就直接幫您把 quota 套件安裝上去了。

5.7.2 設定 quota

 套件問題解決之後,再來即是要開始設定 quota 了。以筆者的環境來說,/dev/hda8 是掛載到 /home,所以等等實做時,就針對 /home 這個 partition 來做 quota,以限定使用者在自己家目錄中的使用空間。

步驟一:讓 /home partition 上的檔案系統支援 quota 

 首先使用 vi 去編輯 /etc/fstab,並在 /home partition 那一行的 options 欄位處,補上 usrquotagrpquota,當然如果只想針對使用者做 quota,那就補上 usrquota 即可。

suse:~ # vi /etc/fstab
/dev/hda5
  /    reiserfs   acl,user_xattr  1 1
/dev/hda3  /boot   reiserfs   acl,user_xattr  1 2
/dev/hda8   /home   reiserfs   acl,user_xattr
,usrquota,grpquota 1 2
       :略              :略

步驟二:重新掛載 /home partition

 在設定 quota 的過程中,往往會讀入 /etc/mtab 的檔案內容,來作為執行的依據,因此您需要讓 /etc/mtab 檔案裡,準備要做 quota 的那個檔案系統支援 quota 才行,也就是在 options 欄位需要有 usrquota 或 grpquota 的相關紀錄存在。此時做法有兩種,第一種是藉由重新開機來讓 /etc/fstab 更新 /etc/mtab 的內容 ﹔第二種是藉由重新掛載該檔案系統,以更新其在 /etc/mtab 中的資料。這裡我們就選用第二種方式囉。

# 重新掛載 /home partition:
suse:~ # mount -o remount /home

# 確認一下/etc/mtab 中,/home partition 的 options 欄位有 usrquota 及 grpquota:
suse:~ # cat /etc/mtab | grep home
/dev/hda8  /home  reiserfs  rw,acl,user_xattr,usrquota,grpquota 0 0

步驟三:掃描磁碟空間使用情形,並產生 quota file 

 這裡是使用 quotacheck 指令,來掃描檔案系統的磁碟空間使用狀況,並建立 quuota file 於該檔案系統中。以下先來說說這個指令的基本用法。

指令 quotacheck

 此指令可用來掃描使用者及群組在這個做 quota 的 partition 裡,已使用的磁碟空間及 inode count,並會自動建立起 aquota.user 及 aquota.group 這兩個 quota file 於檔案系統中 (以本範例而言,就是在 /home 目錄下),而此 quota file 的內容,當然就是剛剛掃描結果後,所產生的靜態紀錄囉。

指令語法
quotacheck [-gufvm] -a|filesystem

 filesystem 是指定即將進行掃描的那個裝置名稱 (device-name) 或者是掛載點 (mount-point)。不過當您有使用 -a 參數時,就不需要指定 filesystem,也就是說 -a 參數及 filesystem 不能同時指定。

參數說明

-g 掃描群組目前已使用的磁碟空間及 inode count,並建立 aquota.group 檔案。
-u 掃描使用者目前已使用的磁碟空間及 inode count,並建立 aquota.user 檔案。
-v 顯示執行過程。
-m 正常在執行 quotacheck 時,會先將該檔案系統 remount 成 read-only 後,再進行掃描,等完成掃描後,才又再 remount 回 read-write。而當您加上 -m 參數後,就會忽略 remount 這個動作。
-f 此參數是用在 quota 啟用的狀態下,強迫執行掃描並寫入 quota file,不過不建議這樣做。
-a 根據 /etc/mtab 的內容,來掃描所有要做 quota 的檔案系統。

 了解了這個指令的用法後,接著就來對 /home partition 進行 quotacheck。

範例說明:
suse:~ # quotacheck -guv /home
# 掃描使用者及群組在 /home partition 裡,已使用的磁碟空間及 inode count,
# 並將掃描結果寫入 quota file 中。

# 如不指定 filesystem,那就直接使用 -a 參數:
suse:~ # quotacheck -guva

# 掃描過後,確認一下檔案系統中,是否已建立 quota file:
suse:/home # ls aquota*
aquota.group aquota.user
# 如果原本 /etc/mtab 的 options 欄位只有 usrquota 選項,而無 grpquota,
# 則此時您只會看到 aquota.user 這個 quota file 而已。

步驟四:啟動 quota

 利用 quotaon 指令來啟動 quota 的功能。

指令 quotaon

 就是啟用檔案系統 quota 功能的指令囉。

指令語法

quotaon [-guv] -a|filesystem

 filesystem 可以是 device-name 或 mount-point。而當您有使用 -a 參數時,就不需要指定 filesystem。

參數說明

-u 啟用使用者的 quota。
-g 啟用群組的 quota。
-v 顯示執行過程。
-a 依據 /etc/mtab 的內容,而將有設定 quota 選項的檔案系統,啟動其 quota 功能。另外如果您有設定開機時啟動 quota 的話,通常就會使用到這個參數來檢查 /etc/fstab,如此才能在開機過程啟動該檔案系統的 quota 功能。

範例說明

suse:~ # quotaon -guva
/dev/hda8 [/home]: group quotas turned on
/dev/hda8 [/home]: user quotas turned on

# 啟動使用者及群組的 quota。也可這麼執行:
suse:~ # quotaon -va
/dev/hda8 [/home]: group quotas turned on
/dev/hda8 [/home]: user quotas turned on

# 若只想啟動使用者 quota,則執行:
suse:~ # quotaon -uva
/dev/hda8 [/home]: user quotas turned on

# 如不使用 -a 參數,那就需指定 filesystem:
suse:~ # quotaon -guv /home
/dev/hda8 [/home]: group quotas turned on
/dev/hda8 [/home]: user quotas turned on

Tips:欲停用 quota 的話,執行 quotaoff 即可:quotaoff -va

步驟五:編輯 quota 限額

 
使用 edquota 指令來編輯 quota 限額。

指令 edquota

 edquota 是個 quota 的編輯器,用來編輯 quota file 中使用者或群組的 quota 限額。不過除了這個基本用法之外,edquota 還可以拿來做為複製用途,也就是將已經設定好的使用者或群組 quota,複製給其他使用者或群組來使用。另外 edquota 也可設定寬限時間,這部分等等會有說明。

指令語法
edquota [-p protoname] [-u|-g] username...|groupname...
edquota [-u|-g] -t

 protoname 是指要複製 quota 的來源使用者或群組名稱,比如您要將 user01 的 quota 限額複製給 user02 及 user03,那麼可執行「edquota -p user01 -u user02 user03」。

參數說明

-u 編輯使用者 quota。如 edquota -u username。
-g 編輯群組 quota。如 edquota -g groupname。
-p 複製使用者或群組的 quota 限額給其他的使用者或群組。
-t 設定對檔案系統的 soft time 限制。

範例說明一編輯使用者的 quota

suse:~ # edquota -u barry
# 進入編輯畫面後的操作方式,都與 vi 相同。
Disk quotas for user barry (uid 1000) :
 Filesystem   blocks   soft    hard    inodes soft  hard
 /dev/hda8     2929  8000
   10000     201   0    0

 先針對上面範例中所出現的幾個欄位做個說明:

  Filesystem:
    就是指那個做 quota 限額的 /home partition 囉
     
  blocks、inodes:
    blocks 及 inodes 是統計 barry 在 /home partition 上,已經使用的磁碟空間及 inode count,所以這兩個欄位不要去做修改。另外 blocks 的單位是 KB。
     
  soft:
    soft 是用來設定使用者或群組所能使用之磁碟空間或 inode count 的限制。當達到這 soft limit 時,螢幕上就會出現警告訊息,如「hda8: warning, user block quota exceeded.。不過雖然如此,只要在寬限期間 (預設七天)內及不超過上限 (hard limit) 的設定,那資料還是可以寫入這個分割區的。當此欄位設定成 0 時,表示不做限制。
     
  hard:
    hard 是用來設定使用者或群組所能使用磁碟空間或 inode count 的上限,也就是說,使用者無論如何都無法超過這裡所做的限制。當此欄位設定成 0 時,表示不做限制。

 以本範例的設定來說,當使用者 barry 所使用的磁碟空間達 soft limit 的 8000 KB 時,系統會提出警告,並開始預設七天寬限期的倒數計時,在此七天時間內,只要使用磁碟空間不超出 hard limit 的 10000 KB 的話,都可以持續寫入資料至該檔案系統,但若七天期限一到,縱使尚未超過 hard 的限制,亦無法再新增資料。所以當達到 soft limit 時,最好趕快在寬限時間內,把您使用的磁碟空間降至 soft limit 以下,這樣寬限時間的限制就會取消掉。

 或許您注意到本範例並未對 inode count 設限,因為 inode count 比較不好掌控磁碟空間的使用情形,當然若是您要同時對這兩者都設限,那倒也是可以的啦。


 在完成了以上的五個步驟後,可以先用 root 身分來檢視一下 barry 的 quota 限額:

suse:~ # quota -u barry
Disk quotas for user barry (uid 1000):
   Filesystem blocks quota limit grace files quota limit grace
   /dev/hda8  2929  8000 10000       201    0    0

# 如果有設定群組quota,則可執行 "quota -g groupname" 來檢視群組 quota 限額。

 要查看使用者自己的 quota 限額,直接執行 quota 指令即可:

barry@suse:~> quota
Disk quotas for user barry (uid 1000):
   Filesystem blocks quota limit grace files quota limit grace
   /dev/hda8  2929  8000 10000       201    0    0

範例說明二複製 quota 限額

suse:~ # edquota -p barry -u user01 user02
# 將 barry 的 quota 限額,複製一份予 user01 及 user02。

# 接著您可以做個確認:
suse:~ # quota -u user01 user02
Disk quotas for user user01 (uid 1004):
   Filesystem blocks quota limit grace files quota limit grace
   /dev/hda8   83  8000 10000       25   0    0

Disk quotas for user user02 (uid 1005):
   Filesystem blocks quota limit grace files quota limit grace
   /dev/hda8   75  8000 10000       24    0    0

 當您要複製 quota 限額給很多人時,可以事先將這些使用者名單寫入檔案內,然後才進行複製的動作:

suse:~ # vi /etc/quotauser
user01
user02
user03
 :

suse:~ # edquota -p barry -u `cat /etc/quotauser`

範例說明三修改 soft limit 期限

suse:~ # edquota -ut
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
 Filesystem    Block grace period    Inode grace period
 /dev/sda7       
5hours           7days        


 此即是針對使用者寬限時間的設定,筆者這個地方把它修改成 5 小時,也就是說,當使用者所使用的磁碟空間,一旦超過 soft limit 的限制時,此 5 小時的寬限時間就會開始倒數計時,如在這 5 小時內,不趕快將磁碟空間縮減至 soft limit 以下,則等時間一到,使用者便無法再新增任何資料。

 當寬限時間設定成 0,如 0minutes、0hours,是表示一旦超過 soft limit 時,即無法再使用磁碟空間。至於時間可以使用的單位有 seconds、minutes、 hours、days。
 

 接著再來談一下 quota 限額的查看方式。當管理者要檢視很多使用者或群組的 quota 限額時,如以前面所學,可能會這麼執行: 「quota -u user01 user02 …或者quota -g grp01 grp02 …」,但萬一要是為數眾多時怎麼辦 ? 這時候 repquota 指令就可以派上用場了。

指令 repquota

 此指令可用來回報檔案系統 quota 限額的概況。

指令語法
repquota [-vug] -a|filesystem...

參數說明
-g 檢視群組 quota 的使用狀況。
-u 檢視使用者 quota 的使用狀況。
-v 此參數可額外提供一些系統相關訊息。
-a 依據 /etc/mtab 裡有設定 quota 選項的檔案系統,檢視其 quota 的使用狀況。

範例說明

suse:~ # repquota -guva  
# 檢視使用者及群組 quota 的使用情形。

suse:~ # repquota -gv /home
# 檢視群組在 /home partition 所使用 quota 的情形。

Note:當使用 quotacheck 來產生 quota file 時,由於 quota file 的權限為 600,因此一般使用者無法使用 repquota 指令來檢視 quota 限額,除非將 quota file 權限調整成 644 之後才行。不過要調整 quota file 權限前,請記得先執行 "quotaoff -va" 來將 quota 功能關閉,否則無法進行修改。

5.7.3 設定群組 quota

 最後稍微提一下群組 quota 怎麼做。當設定群組 quota 限額時,只有在使用者的有效群組為這個要做 quota 的群組時,這些使用者才會受到群組 quota 的限制。這裡就舉個簡單的範例做說明:

# 先新增一個群組:
suse:~ # groupadd grp01

# 將使用者 barry 及 mary 的主要群組修改成 grp01:
suse:~ # usermod -g grp01 barry
suse:~ # usermod -g grp01 mary
# 如接著下來,barry 及 mary 都沒使用 newgrp 去變更其
有效群組,那麼此時他們的
# 有效群組就是這個主要群組。
# 再來可嘗試以這兩個一般帳號去建立一些檔案,看看這些檔案的擁有群組是否為 grp01。

# 編輯群組 quota:
suse:~ # edquota -g grp01
Disk quotas for group grp01 (gid 1000):
 Filesystem  blocks  soft  hard  inodes soft hard
 /dev/hda8      9  20000  25000     2   0   0


#
完成後,可以檢視一下此群組的 quota 限額:
suse:~ # quota -g grp01
Disk quotas for group grp01 (gid 1000):
 Filesystem  blocks  soft  hard  inodes soft hard
 /dev/hda8      9  20000  25000     2   0   0


# 至於剩下的測試工作就交給您自己囉。

 假使現在 barry 及 mary 的主要群組為 users,且是屬於 grp01 群組的成員,那這時候要測試群組 quota 就更容易了,因為只要以 barry 及 mary 的身分執行「newgrp grp01之後,他們的有效群組就是 grp01 了。看完了以上的說明,是不是覺得很 easy 呢。

Note:當使用者 quota 與該使用者的有效群組 quota 都做設定時,就以先到達的限制為主囉。

設定開機時啟動 quota 功能

 想要在每次開機時,都能自動啟用 quota 功能,則以下提供兩種方式給大家參考:

法一:利用 chkconfig 指令
suse:~ # chkconfig --level 35 boot.quota on
suse:~ # chkconfig boot.quota 35
# 以上兩種做法都可以。完成後,請做個確認:
suse:~ # chkconfig -l boot.quota
boot.quota   0 : off 1 : off 2 : off 3 : on 4 : off 5 : on 6 : off

法二:利用 boot.local 檔案
suse:~ # vi /etc/init.d/boot.local
/sbin/quotaon -va


5.8 檔案搜尋

 在 linux 系統上,存在著那麼多各式各樣的檔案,有想過要是哪天您想查詢某些特定的檔案所存在的位置該怎麼辦 ? 不要急,以下就會介紹幾個檔案搜尋的指令,透過這些指令的操作,便能幫您很快速的找到其所存在的位置。

指令 find

 find 指令,是依照您所指定的目錄,至其目錄樹系裡頭,遞迴地搜尋所要尋找的檔案。當執行「find /var」時,即是把 /var 目錄樹系裡的所有內容顯示出來。

指令語法
find [path...] [expression] [action]

 path 是我們所指定要搜尋的目錄路徑 ﹔expression 則表示可利用一些參數來指定所要搜尋的條件,這樣子就可以縮小搜尋的範圍 ﹔最後那個 action,是對於搜尋出來的結果,要採取什麼動作的意思。

expression 中的參數說明
-type filetype 根據檔案類型來做搜尋。常用到的 filetype 有 d (目錄)、f (一般檔案)、l (符號連結檔)、b (區塊裝置檔)、c (字元裝置檔) 等等。
-perm mode 根據檔案權限來做搜尋。比如「-perm 4755」。
-uid n 搜尋檔案擁有者 ID 為 n 者的所有檔案,其中 n 為數字。比如「-uid 1002」。若針對群組的話,就是「-gid n」。
-user uname 搜尋檔案擁有者為 uname 的所有檔案。比如「-user barry」。若針對群組的話,就是「-group gname」。
-name pattern 根據指定的名稱來做搜尋。 pattern 中可以搭配一些萬用字元來使用,不過請記得此 pattern 需用引號來包住,如此方能避免被 shell 解析,而能完整的交由 find 指令及其所搭配的 -name 參數來做處理。比如 -name 'file'、-name '[a-z]file'、-name 'file*'、-name 'file?'。
-size n[cbkMG] 根據檔案大小來做搜尋。n 為數字,[cbkMG] 是所指定的單位 ﹔另外 n 前面可使用「+」(比 n 還要大) 或「-」(比 n 還要小) 等符號。先來認識 [cbkMG] 意義:
c : 表示 bytes (character)。
˙-size 2000c 表示搜尋大小為 2000 bytes 的檔案。
˙-size +2000c 表示搜尋大於 2000 bytes 的檔案。
˙-size -2000c 表示搜尋小於 2000 bytes 的檔案。
b : 表示 512 bytes (block)。
1b 代表 1 ~ 512 bytes,2b 代表 513 ~ 1024 bytes,餘依此類推。
˙-size 2b 表示搜尋檔案大小是介於 513 ~ 1024 bytes 之間。
˙-size +2b 表示搜尋大於 1024 bytes 的檔案。
˙-size -2b 表示搜尋小於 513 bytes 的檔案。
k : 表示 Kilobytes (1024 bytes)。
1k 代表 1 ~ 1024 bytes,2k 代表 1025 ~ 2048 bytes,餘依此類推。
˙-size 2k 表示搜尋檔案大小是介於 1025 ~ 2048 bytes 之間。
˙-size +2k 表示搜尋大於 2048 bytes 的檔案。
˙-size -2k 表示搜尋小於 1025 bytes 的檔案。
至於 M 及 G 分別是以 MB 及 GB 做單位來搜尋。
-maxdepth levels 依據目錄的最大層級深度來做搜尋 ﹔levels 為一非負數的整數。比如「find /var -maxdepth 3」表示搜尋 /var 目錄結構中的第 0 ~ 3 層,第 0 層就是指 /var 本身。
另一個相反的參數為 -mindepth,比如「find /var -mindepth 3」表示搜尋 /var 目錄結構中的第三層至最後一層。
-mtime n 根據檔案的修改時間 (modification time) 來做搜尋。n 為數字,表示 n x 24 小時,也就是 n 天的意思,數字前面可以加上「+」或「-」。比如「-mtime +3」表示搜尋三天前有被修改過的檔案,「-mtime -3」表示搜尋三天內有被修改過的檔案,「-mtime 3」表示搜尋三天前的那一天有被修改過的檔案。
這樣子解釋可能還不是很清楚,舉個實際例子好了,假設現在時間是 9 月 20 日早上 10 點,就在此時此刻執行 「find /etc -mtime 3」,那麼三天前的那一天就是指 9/17 AM 10:00 ~ 9/16 AM 10:00,也就是在這個時間範圍內,檔案有被修改過的,都會被搜尋出來 ﹔而「find /etc -mtime -3」,是搜尋在 9/17 AM 10:00 ~ 9/20 AM 10:00 這個時間範圍內,有被修改過的檔案 ﹔最後「find /etc -mtime +3」,則是搜尋在 9/16 AM 10:00 以前,有被修改過的檔案。了解了以上的觀念後,那「find /etc -mtime 0」應該知道意思吧,就是搜尋 24 小時內有被修改過的檔案。
-atime n 根據檔案的存取時間 (access time) 來做搜尋。您只要把上一個欄位解釋中的「修改」兩字改成「存取」來看,然後把 mtime 用 atime 來取代,這樣就可以知道意思了。
-ctime n 根據檔案狀態的改變時間 (change time) 來做搜尋。比如您修改了某個檔案的權限、擁有者或擁有群組時,就是改變了這個檔案的狀態。使用「ls -l --time=ctime」所看到的時間欄位,就是檔案狀態的改變時間。

action 中的參數說明
-exec command ; 將 find 指令的搜尋結果,交給 -exec 後面的指令來處理。
-print 將 find 指令的搜尋結果,輸出到螢幕上。這是預設的參數。

範例說明
suse:~ # find /home -type d
# 找出 /home 目錄下,檔案類型為目錄者。

suse:~ # find /usr/bin -perm 4755
# 搜尋 /usr/bin 目錄中,檔案權限為 4755 者。

suse:~ # find /home -uid 1006
# 在 /home 目錄中,只要檔案擁有者 ID 為 1006 者,都會被搜尋出來

suse:~ # find /etc -size 1947c
# 將 /etc 目錄中,檔案大小剛好為 1947 bytes 的檔案找出。

suse:~ # find /var -size +5M
# 將 /var 目錄中,大於 5M 的檔案找出。


suse:~ # find /var -size -2b
# 搜尋 /var 目錄中,小於 513 bytes 的檔案。

suse:~ # find /etc -name 'passwd'
# 找出 /etc 目錄中,檔案名稱為 passwd 者。

suse:~ # find /etc -name 'auto*'
# 找出 /etc 目錄中,檔案名稱是以 auto 為首者的所有檔案。

suse:~ # find /home/barry -type f -name '[0-9]*' -exec rm -f {} \;
# 將 barry 家目錄中,檔名是以數字為首的檔案找出,並將所搜尋出來的檔案,

# 當成 "-exec" 後面所接指令 rm 的引數,所以這些檔案就會被刪除啦。

suse:~ # find /etc /var -type f -mtime -3
# 將 /etc 及 /var 目錄裡,三天內有被異動過的檔案找出。

suse:~ # find /var -maxdepth 2 -type d
# 列出 /var 的第 0 ~ 2 層目錄


指令 which


 which 是用來搜尋指令所存在的位置。which 指令,主要是根據環境變數 PATH 來做搜尋,看看所要尋找的程式,有沒有存在於 PATH 目錄列表中的某個目錄之中。which 在搜尋的時候,是按照 PATH 所定義的目錄依序尋找,找到後就不會再往下搜尋,除非加上「-a」參數。

範例說明
suse:~ # which chmod fdisk
/bin/chmod
/sbin/fdisk

指令 locate

 locate 指令,是根據 /var/lib/locatedb 資料庫來做搜尋。
需要安裝的套件為 findutils-locate

範例說明
suse:~ # locate fstab
/etc/fstab
/etc/samba/smbfstab
/opt/kde3/bin/update_fstab.sh
# 搜尋檔名中,含有 fstab 這個 pattern 的檔案。

 當您建立一些新檔案後,並無法馬上使用 locate 指令搜尋出來,因為尚未更新資料庫裡頭的資料,此時可以藉著執行 updatedb 程式,來立刻更新資料庫:

suse:~ # updatedb

 更新完畢後,再使用 locate 去搜尋看看,應該就找得到了。不過如果您要尋找的是存放在一些暫存目錄中的檔案,如 /tmp、/var/tmp、/var/spool 等等,那就會搜尋不到。要調整這方面的限制,需要去修改 /etc/sysconfig/locate 檔案:

suse:~ # vi /etc/sysconfig/locate
# uptdatedb can skip directories for its database. The following parameter
# says which ones.
# 以下是原本變數的設定:
# UPDATEDB_PRUNEPATHS="/mnt /cdrom /tmp /usr/tmp /var/tmp /var/spool /proc /media /sys"
 

# 執行 updatedb 時,不會把此變數所定義的這些目錄內容更新至 locate 資料庫,因此使用
# locate 指令搜尋時,這些目錄下的檔案將會搜尋不到。
# 現在如果想讓 locate 能找得到 /tmp 及 /var/spool 目錄下的檔案,則需將這兩個目錄
# 從 UPDATEDB_PRUNEPATHS 變數中移除:
UPDATEDB_PRUNEPATHS="/mnt /cdrom /usr/tmp /var/tmp /proc /media /sys"  
# 以上 是已經調整過的內容。

 修改完 /etc/sysconfig/locate 之後,請執行 /etc/cron.daily 目錄下的 suse.de-updatedb script:

suse:~ # /etc/cron.daily/suse.de-updatedb

 這樣就搞定了


copyright © 2006 by barry ( 柏青哥 )