10.7. 磁碟配額

磁碟配額是一種作業系統選用的功能,您可以利用它來限制某使用者, 或是某群組在系統裡可以使用的磁碟空間大小 和/或 檔案的數量。 這個功能控用在分時多工系統上,因為分時多工系統要限定每個使用者, 或是某個群組所能使用的系統資源。 會這樣做是為了避免磁碟空間被某個使用者給耗盡了。

10.7.1. >設定您的系統以便使用磁碟配額

在使用磁碟配額之前您要先確定是否已經在系統核心中做好設定了。 您只要在您的系統核心設定檔中加入下面這行:

    options QUOTA

通用系統核心設定 GENERIC 的預設值並沒有這一項,所以如果您想使用磁碟配額的話, 您就必須自己設定,建立,並安裝您的自定系統核心。 請參考 設定 FreeBSD 核心 一節以獲得更多有關設定系統核心的資訊。

下一步就是在 /etc/rc.conf 啟動磁碟配額的功能。 您只要把下面這一行:

    enable_quotas="YES"

為了在啟動磁碟配額時能得到出色的控管, 這邊有一個附加的設定值可供修改。當系統正常啟動時, 磁碟配額這個功能將會使用 quotacheck 這個程式來對每一個檔案系統作完整的檢查。 quotacheck 這個程式將會促進確保在磁碟配額資料庫中的資料, 能正確的反映在檔案系統上。 但是這個功能也會在啟動您的系統時,對啟動完成時間有相當大程度的影響。 假如您想跳過這個步驟,下面這個變數是可供您變動的:

    check_quotas="NO"

如果您使用的是 FreeBSD 3.2-RELEASE 較早的版本, 您也可以將這唯一的設定值設到 /etc/rc.conf 中:

    check_quotas="YES"

最後,您必須以檔案系統為單位在 /etc/fstab 裡啟動磁碟配額的功能。 您可以在那個檔案裡面為您所有的檔案系統啟動使用者, 群組,或是兩者的磁碟配額。

如果您想要啟動的是使用者磁碟配額,您只要在 /etc/fstab 中選定您所要設定的檔案系統, 並把 userquota 這個選項加到該檔案系統的 options 欄位中。例如:

    /dev/da1s2g   /home    ufs rw,userquota 1 2

同理,把 userquota 換成 groupquota 就可以啟動群組磁碟配額的功能。 如果您兩種磁碟配額都想啟動的話,您只要把那一行改成:

    /dev/da1s2g    /home    ufs rw,userquota,groupquota 1 2

內定的磁碟配額記錄檔是放在該檔案系統的根目錄下,名字是 quota.user 以及 quota.group, 分別是使用者磁碟配額以及群組磁碟配額的記錄檔。 您可以參考 man fstab 以得到更多資訊。 雖然 man page 說您可以把記錄檔放在其他地方, 但是我們並不建議您這麼做, 因為並非所有跟磁碟配額相關的程式都能夠正確地處理這項功能。

接下來您就必須用您的新核心來重開機了。因為 /etc/rc 會自動執行適當的指令來為您在 /etc/fstab 中所啟動的磁碟配額功能建立初始化的磁碟配額記錄檔, 所以您並不需要自己手動建立一個空的磁碟配額記錄檔。

在一般的操作過程中您並不需要手動去執行 quotacheckquotaon、 或是 quotaoff 這些程式。 不過或許您也可以讀讀它們的 man page 以熟悉它們的操作方式。

10.7.2. 設定磁碟配額的上限

一旦您為系統加上了磁碟配額的功能後,請確認它們是否已正常啟動。 執行下列這個指令是一個簡單的檢查方法:

    # quota -v

每個啟動了磁碟配額的檔案系統都會有一行關於磁碟使用量, 以及目前上限設定值的摘要。

您現在可以開始用 edquota 指令來指定磁碟配額上限了。

您有很多選項可以用來限制使用者或群組所能分配到的磁碟空間, 以及他們能夠建立的檔案數量。您可以依磁碟空間 (block 配額) , 或是檔案數量(inode 配額) ,或是結合這兩種配額來設定使用上限。 每一種上限的設定都可以更進一步分成兩類:強制型 (hard) , 以及非強制型 (soft) 上限。

強制型上限是不能超過的。 一旦使用者的使用量到達他們的強制型上限設定時, 他們就無法在這個檔案系統上再要求配置磁碟了。 舉例來說,如果有個使用者的強制型上限是 500 blocks,而他目前已經用掉 490 的 blocks 了;如此一來,這個使用者只能再要求配置 10 blocks。如果他想要求配置 11 個 blocks 則會失敗。

另一方面,非強制型上限可以容許某段時間之內的超用; 這段時間稱為 grace period,預設值是一個星期。 如果使用者超用非強制型上限的時間超過了這個 grace period 的話,則非強制型上限就會轉為強制型上限而不允許該使用者再配置任何磁碟, 直到使用者所使用的磁碟量小於非強制型上限後,這個 grace period 才會被重新設定。

下面是一個執行 edquota 指令的例子。當您執行 edquota 指令時, 您會進入一個編輯磁碟配額上限的編輯器內, 至於是什麼編輯器則視您的 EDITOR 環境變數而定; 如果沒有設定 EDITOR 這個環境變數則使用 vi

    # edquota -u test
    Quotas for user test:
    /usr: blocks in use: 65, limits (soft = 50, hard = 75)
            inodes in use: 7, limits (soft = 50, hard = 60)
    /usr/var: blocks in use: 0, limits (soft = 50, hard = 75)
            inodes in use: 0, limits (soft = 50, hard = 60)

一般來說,每個啟動了磁碟配額的檔案系統都會有兩行設定。 一行是用來指定 block 上限,而另一行則是用來指定 inode 上限。 如果您想要變更磁碟配額上限,只需要修改後面的數值即可。舉例來說, 如果您想要調升這個使用者的 block 上限,把非強制型上限由 50 改到 500,把強制型上限由 75 改到 600,您只要把這一行變更為:

    /usr: blocks in use: 65, limits (soft = 50, hard = 75)

to:

     /usr: blocks in use: 65, limits (soft = 500, hard = 600)

當您離開編輯器後,新的磁碟配額設定就會馬上生效。

有的時候我們會想要為某一個範圍內的 uid 一起設定磁碟配額。 我們可以用 edquota-p 選項來完成這個工作。首先,我們先為某一個使用者設定磁碟配額; 接著就執行edquota -p protouser startuid-enduid。 舉例來說,假設使用者 test 已經設定好磁碟配額, 您就可以利用下面這個指令來為 uid 在 10000 到 19999 的使用者來設定跟使用者 test 一樣的磁碟配額:

    # edquota -p test 10000-19999

參閱 man edquota 以得到更詳盡的資訊。

10.7.3. 檢查磁碟配額的設定及磁碟使用的狀況

您可以使用 quota 或是 repquota 指令來檢查磁碟配額的設定及磁碟使用的狀況。 quota 指令可以用來檢查個別使用者, 以及群組的磁碟配額,以及磁碟使用量。 只有超級使用者才能檢查其他使用者的磁碟配額以及磁碟使用量, 或是檢查非您所屬群組的磁碟配額及磁碟使用量。 repquota 指令可以看到有啟動磁碟配額功能的檔案系統的磁碟配額設定, 以及磁碟使用量的使用摘要。

下面是一個在兩個檔案系統有磁碟配額設定的使用者 quota -v 指令的輸出情形:

    Disk quotas for user test (uid 1002):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
               /usr      65*     50      75   5days       7      50      60
           /usr/var       0      50      75               0      50      60

上例中,這個使用者在 /usr 檔案系統中的非強制性磁碟配額是 50 blocks,他的使用超出了 15 blocks,而 grace period 還有 5 天。注意這個星號* 是表示目前這名使用者已經超過他的非強制性上限了。

一般來說如果使用者沒有使用到某個檔案系統, 則就算該檔案系統已經啟動了磁碟配額功能,它也不會在 quota 指令中顯現出來。而 -v 這個選項則可以把這些檔案系統全部顯示出來,如上例中的 /usr/var

10.7.4. Quotas over NFS

Quotas are enforced by the quota subsystem on the NFS server. The rpc.rquotad(8) daemon makes quota information available to the quota(1) command on NFS clients, allowing users on those machines to see their quota statistics.

Enable rpc.rquotad in /etc/inetd.conf like so:

    rquotad/1      dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad

Now restart inetd:

    # kill -HUP `cat /var/run/inetd.pid`