quota 介紹
project quota 介紹
quota 子系統用于限制磁盤的使用量。
從限制的主體進行分類,quota 包含 user quota、group quota 與 project quota 三部分。顧名思義,user quota、group quota 限制的主體分别是 user、user group,而 project quota 限制的主體則是 project id。當一個目錄下的所有子目錄和檔案擁有相同的 project id 時,就可以限制一個目錄下總的磁盤使用量。
quota 子系統其實是一項“古老”的特性,user quota 與 group quota 早在 Linux v2.6 就開始支援,而 project quota 則來得相對晚一些。project quota 特性最初來源于 XFS,Linux v4.5 開始 ext4 才正式支援 project quota。
quota 配額
quota 從限制的對象進行分類,包括 block quota 與 inode quota 兩部分。
限制的類型又包含 softlimit 與 hardlimit 兩類,其中 hardlimit 是不可超越的,即 inode/block 配置設定過程中若目前占用的 inode/block 數量超過 hardlimit,那麼配置設定過程就會失敗。
softlimit 是可以暫時超越的,inode/block 配置設定過程中若目前占用的 inode/block 數量超過 softlimit 但是尚未超過 hardlimit,那麼隻會列印 warnning 資訊,但是配置設定過程并不會失敗。
但是系統不能長時間超過 softlimit,系統可以超過 softlimit 的最長時間稱為 grace time,在第一次超過 softlimit 的時候開始計時,在 grace time 時間以内,盡管目前占用的 inode/block 數量超過 softlimit,但是配置設定過程不會失敗;而如果 grace time 時間以後,目前占用的 inode/block 數量仍然沒有降到 softlimit 以下,此時配置設定過程就會失敗。
grace time 參數是 filesystem wide 統一的,即同一個檔案系統(磁盤分區)共用同一份 grace time 參數。
注意
測試的時候,root 使用者具有 CAP_SYS_RESOURCE 權限,因而不受 hardlimit 限制。
使用步驟
1 格式化檔案系統
mkfs 格式化檔案系統時打開 "project,quota" 特性:
mkfs.ext4 -O project,quota <device>
或者對現有的檔案系統打開 "project,quota" 特性:
tune2fs -O project,quota <device>
2 開啟/關閉 prjquota 限制
quota 子系統實際上實作有兩種功能:
1) accounting,即統計各個 project id 分組的 inode/block 使用量;
2) limit,即在 accounting 的基礎上,對各個 project id 分組的 inode/block 使用量上限進行限制。
格式化檔案系統時打開 "project,quota" 特性,實際上隻是開啟 accounting 功能,使用預設參數挂載檔案系統時,隻是開啟 accounting 功能,limit 功能并沒有開啟。此時需要使用 quotaon 手動開啟 limit 功能,或者使用 prjquota 挂載參數自動開啟 limit 功能。
2.1 檢視 quota 狀态
使用 quotaon -Ppv 來檢視檔案系統 accounting/limit 這兩種功能的開啟情況。
例如在 limit 功能開啟前:
# print quota state
quotaon -Ppv <mntpoint>
輸出如下:
project quota on /mnt (/dev/vdb) is on (accounting)
表示 accounting on, limit off。
使用 quotaon 手動開啟 limit 功能:
# turning quota on
quotaon -P <mntpoint>
此時 quota 的狀态變為:
# print quota state
quotaon -Ppv <mntpoint>
project quota on /mnt (/dev/vdb) is on (enforced)
表示 accounting on, limit on。
2.2 quotaon 開啟
使用預設參數挂載檔案系統時,隻是開啟 accounting 功能,limit 功能并沒有開啟,需要通過 quotaon 手動開啟:
quotaon -P <mntpoint>
2.3 prjquota 挂載參數開啟
使用 "prjquota" 參數挂載檔案系統時,預設自動打開 project quota 限制功能。
mount -o prjquota <device> <mntpoint>
2.4 quotaoff 關閉
使用 quotaoff 關閉 project quota 限制功能。
quotaoff -P <mntpoint>
3 project id
3.1 設定 project id
使用 chattr -p 設定檔案或目錄的 project id
chattr -p <projectid> <file|directory>
但是此時在目錄下建立的子檔案或子目錄并不會繼承父目錄的 project id,需要使用 chattr +P 開啟目錄的繼承 project id 的特性:
chattr +P <file|directory>
或者直接使用以下指令同時設定 project id 和開啟繼承特性:
chattr +P -p <projectid> <file|directory>
3.2 檢視 project id
使用 lsattr -p 擷取檔案的 projec id:
lsattr -p
4 prjquota 配額
4.1 edquota 設定配額
使用 edquota 設定特定 project id 的配額:
edquota -P -f <mntpoint> <projectid>
執行 edquota 指令會進入一個 vim 界面,此時使用者可以設定 inode/block 的 soft/hard limit。
例如:
edquota -P -f /dev/vdb 124
Disk quotas for project 124 (pid 124):
Filesystem blocks soft hard inodes soft hard
/dev/vdb 4 0 0 2 0 0 0 0 0 0 0 0
4.2 setquota 設定配額
也可以使用 setquota 設定特定 project id 的配額:
setquota -P <projectid> <block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> <mntpoint>
4.3 repquota 檢視配額
使用 repquota 檢視所有 project id 的配額:
repquota -P <mntpoint>