Monday, June 4, 2007

Quota-管理硬碟空間配額

【前言】
簡單來說我們作 Quota 的用意就是避免使用者無止盡的放置檔案造成系統硬碟空間被吃光,因此我們就可利用 Quota 來強制管理硬碟空間。

Quota 管理使用對象


UserQuota:針對使用者硬碟空間做限制。
GroupQuoa:針對群組硬碟空間做限制。
Quota 管理資料類別


磁碟空間 (kbytes):針對硬碟空間作管理 (單位為 kbytes,所以 10 MB = 10240 kbytes)
檔案數量 (inode):針對檔案數量作管理
Quota 管理配額方式


非強制性限制 (Soft limit):超過指定大小但未超過 Hard limit 時系統會警告,直到超過警示的時間 (grace time,預設七天)未降低使用量便會禁止寫入資料。
強制限制 (Hard limit):超過這個大小,系統馬上會禁止寫入資料。
【作業環境】

FreeBSD 6.1-STABLE

【安裝及設定】

Step1.開啟核心支援 Quota 功能

因為通用系統核心設定 GENERIC 的預設值並沒有 Quota,所以我們必須手動加入把支援 Quota 選項加入


#vi /sys/i386/conf/mykernel //切換到收置核心路徑
options QUOTA

當然修改完核心後要能使用加入的選項功能就要在編一次核心,編完核心後先別急著重新開機繼續下面的設定


#cd /usr/src
#make kernel

Step2.開啟檔案系統支援 Quota 功能

接下來修改 /etc/fstab 以便開啟檔案系統支援 user 及 group quota 功能,修改主要是在您要管理的掛載點(Mountpoint)中的 Options 加入 userquota 或 groupquota,此次實作主要是對 /home 作 userquota

/etc/fstab 修改前


# Device Mountpoint FStype Options Dump Pass#
/dev/da0s1g /home ufs rw 2 2

/etc/fstab 修改後


# Device Mountpoint FStype Options Dump Pass#
/dev/da0s1g /home ufs rw,userquota 2 2

Step3.修改 /etc/rc.conf

修改 /etc/rc.conf 以便當系統重開機時能自動啟動 Quota 服務,另外在 FreeBSD 3.2 以後的版本,系統開機後預設會檢查所有使用者的 quota,但這必須要花上一段時間,如果您不想在開機時自動檢查 quota 可以加入 check_quotas="NO"


#vi /etc/rc.conf
enable_quotas="YES" //重開機帶起 Quota 服務
check_quotas="NO" //重開機時略過 quotacheck

以上步驟都完成了我們重開機讓 Quota 設定生效吧,重開機後可使用 mount 指令來確定該 Mountpoint 是不是已經啟動 Quota 功能了


# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1g on /home (ufs, NFS exported, local, with quotas, soft-updates) //可看到with quotas
/dev/da0s1e on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, NFS exported, local, soft-updates)
/dev/da0s1d on /var (ufs, local, soft-updates)
pid586@ldap:/host on /host (nfs)
pid586@ldap:/net on /net (nfs)

Step4.編輯使用者 Quota

我們使用 edquota 指令來編輯使用者 Quota 大小,當您離開編輯器後所定義的磁碟配額設定就會馬上生效。


#edquota -u wei //編輯使用者 quota 資訊
Quotas for user wei:
/home: kbytes in use: 60, limits (soft = 921, hard = 1024) //指定非強制 0.9 MB,強制 1MB
inodes in use: 30, limits (soft = 0, hard = 0) //因為不對檔案數作限制因為不修改

修改後我們可以使用指令 quota -u 來查看指定後的 Quota 資訊如下


#quota -u wei
Disk quotas for user wei (uid 10003):
Filesystem usage quota limit grace files quota limit grace
/home 60 921 1024 30 0 0

Quota 資訊我們大概可以分成三個部份來看,如下所示

Disk quotas for user wei (uid 10003):
檔案系統 磁碟空間 (kbytes) 檔案數量 (inode)
Filesystem usage quota limit grace files quota limit grace
掛載點 目前使用空間 非強制 強制 警示時間 目前檔案數 非強制 強制 警示時間
/home 60 921 1024 _ 30 0 0 _


當然如果想看一百個人的 quota 怎辦?我們可以使用 repquota -a 來列出所有使用者的 Quota 資訊


#repquota -a

Step5.一次大量設定 Quota

當然如果同時設定多個人的 quota 怎辦?


#edquota -u -p wei user1 user2 user3 //套用 wei 的 Quota 設定到 user1,2,3身上
#edquota -u -p wei 10000-20000 //套用 wei 的 Quota 設定到 uid 10000 ~ 20000 身上

Step6.測試 Quota

來測試我們設定的 Quota 有沒有發生作用,不過要記得一點 userquota 顧名思義是針對該 user 作 quota,例如我(root)在測試時把檔案 copy 到 wei 家目錄下,但因為 owner 是 root,所以打quota wei 是看不到 usage 數值有增加的。

超過 Soft Limit 但尚未超過 Hard Limit

從下面 Quota 資訊我們可以看到目前磁碟空間使用量已超過 Soft Limit 未超過 Hard Limit,也可看到警示時間欄位 (grace time)也啟動了,也就是若七天內使用者 wei 未把使用的磁碟空間減小將無法在寫入任何資料。


#quota -u wei
Disk quotas for user wei (uid 10003):
Filesystem usage quota limit grace files quota limit grace
/home 1020* 921 1024 7days 66 0 0

超過 Hard Limit 時

接上例若此時想在複製檔案,但複製檔案後使用磁碟空間將會超過 Hard Limit 時,系統便會告知說無法寫入了


#cp file1 file2
/home: write failed, user disk limit reached
cp: file2: Disc quota exceeded