Linux 磁碟配額( Quota
本文已不再維護,更新文章請參考 這裡
最近更新日期:2003/02/10
什麼是 quota
基本的 quota 指令 quota, quotacheck, edquota, quotaon, quotaoff,
動手作 quota
使用郵件主機進行 quota 的實例
本章習題練習

什麼是 quota?
quota 就字面上的意思來看,呵呵!就是有多少『限額』的意思啦!如果是用在零用錢上面,就是『有多少零用錢一個月』的意思之類的。如果是在容量空間上面呢?以 Linux 來說,呵呵!就是有多少容量限制的意思。
 
在 Linux 系統中,由於是多人多工的環境,所以會有多人共同使用一個硬碟空間的情況發生,如果其中有少數幾個使用者大量的佔掉了硬碟空間的話,那勢必壓縮其他使用者的使用權力!因此管理員應該適當的開放硬碟的權限給使用者,以妥善的分配系統資源!避免有人抗議呀!比較常使用的幾個情況是: 在 Linux 當中,使用來作為硬碟空間管理的就是所謂的 quota 這個咚咚啦!使用這個模組要有幾個步驟,底下就分別說說吧!另外要特別注意的是,使用 quota 時有幾個基本的限制需要談一談:  quota 這支程式的限制內容主要分為底下幾個部分:

基本的 quota 指令:
在開始進行 quota 的實作之前,我們得來瞭解一下 quota 要使用的指令囉!基本上分為兩種,一種是查詢功能(quota, quotacheck, quotastats, warnquota, repquota),另一種則是編輯 quota 的內容( edquota, setquota )。底下我們來談一談這些基本的指令吧!

  • quota

  • 語法
    [root @test /root ]# quota [-guvs] [user,group]
    參數說明:
    -g  :顯示 group 群組
    -u  :顯示 user
    -v  :顯示 quota 的值
    -s  :選擇 inod 或 硬碟空間來顯示
    範例:
    [root @test /root ]# quota -guvs    <==顯示目前執行者(就是 root )的 quota 值
    [root @test /root ]# quota -uvs test <==顯示 test 這個使用者的 quota 值
    說明
    這個指令僅是使用來『顯示(display)』目前某個群組或者某個使用者的 quota 限值!您可以使用來觀察一下呦!

  • quotacheck

  • 語法
    [root @test /root ]# quotacheck [-auvg] /yourpath
    參數說明:
    -a  :掃瞄所有在 /etc/mtab 裡頭已經 mount 的具有 quota 支援的磁碟
    -u  :掃瞄使用者的檔案與目錄
    -v  :顯示掃瞄過程
    -g  :掃瞄群組使用的檔案與目錄
    -m :強制進行 quotacheck 
    範例:
    範例一、要針對 /home 這個 partition 進行 quota 的規劃:
    [root@test root ]# quotacheck -uvg /home       <==開始掃瞄 /home 這一個獨立磁區的目錄
    quotacheck: Scanning /dev/hda3 [/home] done      <==顯示 /home 磁區為 /dev/hda3 !
    quotacheck: Checked 35 directories and 342 files <==掃瞄完畢,有 35 目錄與 342 檔案。
    [root@test root ]# ls -l /home          <==查看一下 /home 這個目錄底下,兩個檔案產生了!
    -rw-------    1 root     root         7168 May  6 18:37 aquota.group
    -rw-------    1 root     root         7168 May  6 18:37 aquota.user
     
    關於 quotacheck 發生錯誤的解決方法:
    # 有些時候,在新版的 Linux distribution 當中,進行 quotacheck 時,可能會出現
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # 這可能是新版的 quota 在設計時的小問題,解決的方法有兩個:
    [root@test root]# quotacheck -uvgm 
    # 加上 -m 的參數來強制進行,或者是:
    [root@test root]# touch /home/aquota.user; touch /home/aquota.group
    [root@test root]# quotacheck -uvg
    # 既然 quotacheck 找不到 quotafile ,那麼我就手動將 quotafile 建立起來即可!
    # 然後再重新進行 quotacheck 一次即可!
    # 注意喔!因為我的 /dev/hda3 對應到 /home ,所以當然就是在 /home 底下建立起 qoutafile 了!
    說明
    這這個指令主要的目的在掃瞄某一個磁碟的 quota 空間,他會針對該磁碟進行掃瞄,並且,由於該磁碟若持續運作時,可能掃瞄的過程中,檔案可能會增減,造成 quota 掃瞄的錯誤發生,因此,當使用 quotacheck 時,該磁碟將『自動被設定成為唯獨磁區(read-only);至於掃瞄完畢之後,掃瞄所得的磁碟空間結果會寫入該磁區最頂端(例如:在我的例子中,掃瞄 /home 這個 /dev/hda3 的磁區,如果是初次掃瞄,那麼掃瞄完畢之後會產生 aquota.user 與 aquota.group ,會放置在 /home/aquota.xxx 底下!而如果是建立 quota 後的掃瞄,那麼就會更新這兩個檔案!)另外, Linux 也特別強調 quota 在使用的時候,需要特別注意在 reboot 時,得先將 quota 關閉才好!
    此外,由於新版的 Linux distribution 在 quota 的設計上似乎有點小問題,有時候無法完整的進行 quotacheck ,發生如同上表的情況,解決的方法就是主動手動的建立 quotafile 即可喔!

  • edquota

  • 語法
    [root @test /root ]# edquota [-u user] [-g group] [-t]
    [root @test /root ]# edquota -p user_demo -u user
    參數說明:
    -u  :編輯 user 的 quota
    -g  :編輯 group 的 quota
    -t  :編輯寬限時間(就是超過 quota 值後,還能使用硬碟的寬限期限)
    -p  :copy 範本(以建立好的使用者或群組)到另一個使用者(或群組)
    範例:
    [root @test /root ]# edquota -u test        <==設定 test 這個使用者的 quota 數值,會直接進入 vi 畫面
    Disk quotas for user test (uid 501):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/hda3                         8          0          0          5        0        0
    修改一下成為:
    Disk quotas for user test (uid 501):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/hda3                         8       50005000          5     50005000

    [root @test /root ]# edquota -p test -u test2  <==將 test 這個人的 quota 資料複製給 test2 這個人!

    [root @test /root ]# edquota -t         <==設定寬限時間,也就是超過 quota 值之後的修正時間啦!
    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/hda3                  0minutes               0minutes
    上面的 0minutes 可以改成 60minutes 即可!也就是 60 分鐘之內必須要趕快整理硬碟的意思!

    說明
    這個指令就是在編輯每一個『個人』或者是『群組』的 quota 數值!通常我們以 edquota -u username 或者是 edquota -g groupname 來編輯個人與群組的 quota 設定值。不過,或許您會覺得一個一個分配似乎很慢的樣子!那麼您也可以直接 copy 一個人的設定值給其他人,就如同上面第二個例子,利用已經建立好的 test 來建立 test2 這個人的 quota 限額!這個指令可是很重要的呦!另外,上面有幾個重要的資訊,我們來談一談吧:
    1. filesystem:這個是那個 partition 的意思!以上面來說,就是 /dev/hda3 囉!
    2. blocks:這個是目前使用者 test ( uid 501 )在 /dev/hda3 這個 filesystem (參考上面一個資訊),所耗掉的磁碟容量,也就是目前的使用掉的空間啦!單位是 Kbytes 喔!這個資訊是 quota 程式自己計算出來的,所以請不要修改他!
    3. soft 與 hard :這個是目前的 test 在這個 filesystem 之內的 quota 限制值!至於 soft 與 hard 的意思就如同 14-1 節最後面提的那個意思啦!當 soft 與 hard 數值為 0 的時候,表示『沒有限制』的意思!而數值的單位仍是 Kbytes 喔!
    4. inodes :是目前使用掉 inode 的狀態,也是 quota 自己計算出來而得到的,所以不要去變更他。一般而言, inode 不容易控制,所以您可以不必去限制 inode 呢!

  • quotaon

  • 語法
    [root @test /root ]# quotaon [-a] [-uvg directory]
    參數說明:
    -a  :全部的 quota 設定都啟動(會自動去尋找 /etc/mtab 的設定)
    -u  :使用者的 quota 啟動
    -g  :群組的 quota 設定啟動
    -v  :顯示訊息
    範例:
    [root @test /root ]# quotaon -a         <==全部的 quota 限制都啟動
    [root @test /root ]# quotaon -uv /home  <==只有啟動 /home 底下的使用者 quota 限額,group 不啟動!
    說明
    這個指令是在啟動 quota 的!不過,由於這個指令是啟動 aquota.group 與 aquota.user 的,所以您就必須要先完成 qutoacheck 的工作了!然後簡單的下達 quotaon -a 即可啟動!

  • quotaoff

  • 語法
    [root @test /root ]# quotaoff -a
    參數說明:
    -a  :全部的 quota 設定都關閉(會自動去尋找 /etc/mtab 的設定)
    範例:
    [root @test /root ]# quotaoff -a         <==全部的 quota 限制都關閉了!
    說明
    這個指令就是關閉了 quota 的限制啦!

    動手作 quota:
    使用郵件主機進行 quota 的實例:
    本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    2002/07/14:第一次完成
    2003/02/10:重新編排與加入 FAQ
    2003/09/02:加入 quotacheck 發生錯誤時的解決方法。