## 14.1 磁盤配額 (Quota) 的應用與實作
Quota 這個玩意兒就字面上的意思來看,就是有多少“限額”的意思啦!如果是用在零用錢上面, 就是類似“有多少零用錢一個月”的意思之類的。如果是在計算機主機的磁盤使用量上呢?以 Linux 來說,就是有多少容量限制的意思啰。我們可以使用 quota 來讓磁盤的容量使用較為公平, 下面我們會介紹什么是 quota ,然后以一個完整的范例來介紹 quota 的實作喔!
### 14.1.1 什么是 Quota
在 Linux 系統中,由于是多用戶多任務的環境,所以會有多人共同使用一個硬盤空間的情況發生, 如果其中有少數幾個使用者大量的占掉了硬盤空間的話,那勢必壓縮其他使用者的使用權力! 因此管理員應該適當的限制硬盤的容量給使用者,以妥善的分配系統資源!避免有人抗議呀!
舉例來說,我們使用者的默認主文件夾都是在 /home 下面,如果 /home 是個獨立的 partition , 假設這個分區有 10G 好了,而 /home 下面共有 30 個帳號,也就是說,每個使用者平均應該會有 333MB 的空間才對。 偏偏有個使用者在他的主文件夾下面塞了好多只影片,占掉了 8GB 的空間,想想看,是否造成其他正常使用者的不便呢? 如果想要讓磁盤的容量公平的分配,這個時候就得要靠 quota 的幫忙啰!
* Quota 的一般用途 [[1]](#ps1)
quota 比較常使用的幾個情況是:
* 針對 WWW server ,例如:每個人的網頁空間的容量限制!
* 針對 mail server,例如:每個人的郵件空間限制。
* 針對 file server,例如:每個人最大的可用網絡硬盤空間 (教學環境中最常見!)
上頭講的是針對網絡服務的設計,如果是針對 Linux 系統主機上面的設置那么使用的方向有下面這一些:
* 限制某一群組所能使用的最大磁盤配額 (使用群組限制):
你可以將你的主機上的使用者分門別類,有點像是目前很流行的付費與免付費會員制的情況, 你比較喜好的那一群的使用配額就可以給高一些!呵呵! ^_^...
* 限制某一使用者的最大磁盤配額 (使用使用者限制):
在限制了群組之后,你也可以再繼續針對個人來進行限制,使得同一群組之下還可以有更公平的分配!
* 限制某一目錄 (directory, project) 的最大磁盤配額:
在舊版的 CentOS 當中,使用的默認文件系統為 EXT 家族,這種文件系統的磁盤配額主要是針對整個文件系統來處理,所以大多針對“掛載點”進行設計。 新的 xfs 可以使用 project 這種模式,就能夠針對個別的目錄 (非文件系統喔) 來設計磁盤配額耶!超棒的!
大概有這些實際的用途啦!基本上,quota 就是在回報管理員磁盤使用率以及讓管理員管理磁盤使用情況的一個工具就是了! 比較特別的是,XFS 的 quota 是整合到文件系統內,并不是其他外掛的程序來管理的,因此,通過 quota 來直接回報磁盤使用率,要比 unix 工具來的快速! 舉例來說, du 這東西會重新計算目錄下的磁盤使用率,但 xfs 可以通過 xfs_quota 來直接回報各目錄使用率,速度上是快非常多!
* Quota 的使用限制
雖然 quota 很好用,但是使用上還是有些限制要先了解的:
* 在 EXT 文件系統家族僅能針對整個 filesystem:
EXT 文件系統家族在進行 quota 限制的時候,它僅能針對整個文件系統來進行設計,無法針對某個單一的目錄來設計它的磁盤配額。 因此,如果你想要使用不同的文件系統進行 quota 時,請先搞清楚該文件系統支持的情況喔!因為 XFS 已經可以使用 project 模式來設計不同目錄的磁盤配額。
* 核心必須支持 quota :
Linux 核心必須有支持 quota 這個功能才行:如果你是使用 CentOS 7.x 的默認核心, 嘿嘿!那恭喜你了,你的系統已經默認有支持 quota 這個功能啰!如果你是自行編譯核心的, 那么請特別留意你是否已經“真的”打開了 quota 這個功能?否則下面的功夫將全部都視為“白工”。
* 只對一般身份使用者有效:
這就有趣了!并不是所有在 Linux 上面的帳號都可以設置 quota 呢,例如 root 就不能設置 quota , 因為整個系統所有的數據幾乎都是他的啊! ^_^
* 若啟用 SELinux,非所有目錄均可設置 quota :
新版的 CentOS 默認都有啟用 SELinux 這個核心功能,該功能會加強某些細部的權限控制!由于擔心管理員不小心設置錯誤,因此默認的情況下, quota 似乎僅能針對 /home 進行設置而已~因此,如果你要針對其他不同的目錄進行設置,請參考到后續章節查閱解開 SELinux 限制的方法喔! 這就不是 quota 的問題了...
新版的 CentOS 使用的 xfs 確實比較有趣!不但無須額外的 quota 紀錄檔,也能夠針對文件系統內的不同目錄進行配置!相當有趣! 只是不同的文件系統在 quota 的處理情況上不太相同,因此這里要特別強調,進行 quota 前,先確認你的文件系統吧!
* Quota 的規范設置項目:
quota 這玩意兒針對 XFS filesystem 的限制項目主要分為下面幾個部分:
* 分別針對使用者、群組或個別目錄 (user, group & project):
XFS 文件系統的 quota 限制中,主要是針對群組、個人或單獨的目錄進行磁盤使用率的限制!
* 容量限制或文件數量限制 (block 或 inode):
我們在[第七章](../Text/index.html)談到文件系統中,說到文件系統主要規劃為存放屬性的 inode 與實際文件數據的 block 區塊,Quota 既然是管理文件系統,所以當然也可以管理 inode 或 block 啰! 這兩個管理的功能為:
* 限制 inode 用量:可以管理使用者可以創建的“文件數量”;
* 限制 block 用量:管理使用者磁盤容量的限制,較常見為這種方式。
* 柔性勸導與硬性規定 (soft/hard):
既然是規范,當然就有限制值。不管是 inode/block ,限制值都有兩個,分別是 soft 與 hard。 通常 hard 限制值要比 soft 還要高。舉例來說,若限制項目為 block ,可以限制 hard 為 500MBytes 而 soft 為 400MBytes。這兩個限值的意義為:
* hard:表示使用者的用量絕對不會超過這個限制值,以上面的設置為例, 使用者所能使用的磁盤容量絕對不會超過 500MBytes ,若超過這個值則系統會鎖住該用戶的磁盤使用權;
* soft:表示使用者在低于 soft 限值時 (此例中為 400MBytes),可以正常使用磁盤,但若超過 soft 且低于 hard 的限值 (介于 400~500MBytes 之間時),每次使用者登陸系統時,系統會主動發出磁盤即將爆滿的警告訊息, 且會給予一個寬限時間 (grace time)。不過,若使用者在寬限時間倒數期間就將容量再次降低于 soft 限值之下, 則寬限時間會停止。
* 會倒數計時的寬限時間 (grace time):
剛剛上面就談到寬限時間了!這個寬限時間只有在使用者的磁盤用量介于 soft 到 hard 之間時,才會出現且會倒數的一個咚咚! 由于達到 hard 限值時,使用者的磁盤使用權可能會被鎖住。為了擔心使用者沒有注意到這個磁盤配額的問題, 因此設計了 soft 。當你的磁盤用量即將到達 hard 且超過 soft 時,系統會給予警告,但也會給一段時間讓使用者自行管理磁盤。 一般默認的寬限時間為七天,如果七天內你都不進行任何磁盤管理,那么 soft 限制值會即刻取代 hard 限值來作為 quota 的限制。
以上面設置的例子來說,假設你的容量高達 450MBytes 了,那七天的寬限時間就會開始倒數, 若七天內你都不進行任何刪除文件的動作來替你的磁盤用量瘦身, 那么七天后你的磁盤最大用量將變成 400MBytes (那個 soft 的限制值),此時你的磁盤使用權就會被鎖住而無法新增文件了。
整個 soft, hard, grace time 的相關性我們可以用下面的圖示來說明:
圖14.1.1、soft, hard, grace time 的相關性
圖中的長條圖為使用者的磁盤容量,soft/hard 分別是限制值。只要小于 400M 就一切 OK , 若高于 soft 就出現 grace time 并倒數且等待使用者自行處理,若到達 hard 的限制值, 那我們就搬張小板凳等著看好戲啦!嘿嘿!^_^!這樣圖示有清楚一點了嗎?
### 14.1.2 一個 XFS 文件系統的 Quota 實作范例
坐而言不如起而行啊,所以這里我們使用一個范例來設計一下如何處理 Quota 的設置流程。
* 目的與帳號:現在我想要讓我的專題生五個為一組,這五個人的帳號分別是 myquota1, myquota2, myquota3, myquota4, myquota5,這五個用戶的密碼都是 password ,且這五個用戶所屬的初始群組都是 myquotagrp 。 其他的帳號屬性則使用默認值。
* 帳號的磁盤容量限制值:我想讓這五個用戶都能夠取得 300MBytes 的磁盤使用量(hard),文件數量則不予限制。 此外,只要容量使用率超過 250MBytes ,就予以警告 (soft)。
* 群組的限額 (option 1):由于我的系統里面還有其他用戶存在,因此我僅承認 myquotagrp 這個群組最多僅能使用 1GBytes 的容量。 這也就是說,如果 myquota1, myquota2, myquota3 都用了 280MBytes 的容量了,那么其他兩人最多只能使用 (1000MB - 280x3 = 160MB) 的磁盤容量啰!這就是使用者與群組同時設置時會產生的后果。
* 共享目錄限額 (option 2):另一種設置方式,每個用戶還是具有自己獨立的容量限止,但是這五個人的專題共享目錄在 /home/myquota 這里,該目錄請設置為其他人沒有任何權限的共享目錄空間,僅有 myquotagrp 群組擁有全部的權限。 且無論如何,該目錄最多僅能夠接受 500MBytes 的容量。請注意,群組 (group) 的限制與目錄 (directory/project) 無法同時并存喔! 所以下面的流程中,我們會先以群組來設計,然后再以目錄限制來進一步說明!
* 寬限時間的限制:最后,我希望每個使用者在超過 soft 限制值之后,都還能夠有 14 天的寬限時間。
好了,那你怎么規范帳號以及相關的 Quota 設置呢?首先,在這個小節我們先來將帳號相關的屬性、參數及其他環境搞定再說吧!
```
# 制作帳號環境時,由于有五個帳號,因此鳥哥使用 script 來創建環境!
[root@study ~]# vim addaccount.sh
#!/bin/bash
# 使用 script 來創建實驗 quota 所需的環境
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do
useradd -g myquotagrp $username
echo "password" | passwd --stdin $username
done
mkdir /home/myquota
chgrp myquotagrp /home/myquota
chmod 2770 /home/myquota
[root@study ~]# sh addaccount.sh
```
接下來,就讓我們來實作 Quota 的練習吧!
### 14.1.3 實作 Quota 流程-1:文件系統的支持與觀察
前面我們就談到,要使用 Quota 必須要核心與文件系統支持才行!假設你已經使用了默認支持 Quota 的核心, 那么接下來就是要啟動文件系統的支持啦!但是要注意,我們這邊是以 XFS 文件系統為例的,如果你使用的是 EXT 家族,請找前一版的書籍說明喔! 此外,不要在根目錄下面進行 quota 設計喔!因為文件系統會變得太復雜!因此,下面我們是以 /home 這個 xfs 文件系統為例的! 當然啦,首先就是要來檢查看看!
```
[root@study ~]# df -hT /home
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-home xfs 5.0G 67M 5.0G 2% /home
```
從上面的數據來看,鳥哥這部主機的 /home 確實是獨立的 filesystem,而且確實是使用了 xfs 文件系統!所以可以使用下面的流程啰! 此外,由于 VFAT 文件系統并不支持 Linux Quota 功能,所以我們得要使用 mount 查詢一下 /home 的文件系統為何才行啊!
在過去的版本中,管理員似乎可以通過 mount -o remount 的機制來重新掛載啟動 quota 的功能,不過 XFS 文件系統的 quota 似乎是在掛載之初就宣告了, 因此無法使用 remount 來重新啟動 quota 功能,一定得要寫入 /etc/fstab 當中,或者是在初始掛載過程中加入這個項目, 否則不會生效喔!那就來瞧瞧鳥哥改了 fstab 成為怎樣吧!
```
[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0
# 其他項目鳥哥并沒有列出來!重點在于第四字段!于 default 后面加上兩個參數!
[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
```
基本上,針對 quota 限制的項目主要有三項,如下所示:
* uquota/usrquota/quota:針對使用者帳號的設置
* gquota/grpquota:針對群組的設置
* pquota/prjquota:針對單一目錄的設置,但是不可與 grpquota 同時存在!
還是要再次的強調,修改完 /etc/fstab 后,務必要測試一下!若有發生錯誤得要趕緊處理! 因為這個文件如果修改錯誤,是會造成無法開機完全的情況啊!切記切記!最好使用 vim 來修改啦! 因為會有語法的檢驗,就不會讓你寫錯字了!此外,由于一般用戶的主文件夾在 /home 里面,因此針對這個項目的卸載時, 一定要將所有一般帳號的身份登出,否則肯定無法卸載喔!留意留意!
### 14.1.4 實作 Quota 流程-2:觀察 Quota 報告數據
制作文件系統支持之后,當然得要來瞧一瞧到底有沒有正確的將 quota 的管理數據列出來才好!這時我們得要使用 xfs_quota 這個指令才行!這個指令真的是挺復雜的,因為全部的 quota 實作都是這個指令耶!所以里面的參數有夠多! 不過稍微觀察一下即可!先讓我們來談談觀察目前 quota 的報告內容吧!
```
[root@study ~]# xfs_quota -x -c "指令" [掛載點]
選項與參數:
-x :專家模式,后續才能夠加入 -c 的指令參數喔!
-c :后面加的就是指令,這個小節我們先來談談數據回報的指令
指令:
print :單純的列出目前主機內的文件系統參數等數據
df :與原本的 df 一樣的功能,可以加上 -b (block) -i (inode) -h (加上單位) 等
report:列出目前的 quota 項目,有 -ugr (user/group/project) 及 -bi 等數據
state :說明目前支持 quota 的文件系統的信息,有沒有起動相關項目等
范例一:列出目前系統的各的文件系統,以及文件系統的 quota 掛載參數支持
[root@study ~]# xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/srv/myproject /dev/vda4
/boot /dev/vda2
/home /dev/mapper/centos-home (uquota, gquota) # 所以這里就有顯示支持啰
范例二:列出目前 /home 這個支持 quota 的載點文件系統使用情況
[root@study ~]# xfs_quota -x -c "df -h" /home
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-home
5.0G 67.0M 4.9G 1% /home
# 如上所示,其實跟原本的 df 差不多啦!只是會更正確就是了。
范例三:列出目前 /home 的所有用戶的 quota 限制值
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 4K 0 0 00 [------] 4 0 0 00 [------]
dmtsai 34.0M 0 0 00 [------] 432 0 0 00 [------]
.....(中間省略).....
myquota1 12K 0 0 00 [------] 7 0 0 00 [------]
myquota2 12K 0 0 00 [------] 7 0 0 00 [------]
myquota3 12K 0 0 00 [------] 7 0 0 00 [------]
myquota4 12K 0 0 00 [------] 7 0 0 00 [------]
myquota5 12K 0 0 00 [------] 7 0 0 00 [------]
# 所以列出了所有用戶的目前的文件使用情況,并且列出設置值。注意,最上面的 Block
# 代表這個是 block 容量限制,而 inode 則是文件數量限制喔。另外,soft/hard 若為 0,代表沒限制
范例四:列出目前支持的 quota 文件系統是否有起動了 quota 功能?
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON # 有啟用計算功能
Enforcement: ON # 有實際 quota 管制的功能
Inode: #1568 (4 blocks, 4 extents) # 上面四行說明的是有啟動 user 的限制能力
Group quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1569 (5 blocks, 5 extents) # 上面四行說明的是有啟動 group 的限制能力
Project quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: #1569 (5 blocks, 5 extents) # 上面四行說明的是 project 并未支持
Blocks grace time: [7 days 00:00:30] # 下面則是 grace time 的項目
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
```
在默認的情況下, xfs_quota 的 report 指令會將支持的 user/group/prject 相關數據列出來,如果只是想要某個特定的項目, 例如我們上面要求僅列出用戶的數據時,就在 report 后面加上 -u 即可喔!這樣就能夠觀察目前的相關設置信息了。 要注意,限制的項目有 block/inode 同時可以針對每個項目來設置 soft/hard 喔!接下來實際的設置看看吧!
### 14.1.5 實作 Quota 流程-3:限制值設置方式
確認文件系統的 quota 支持順利啟用后,也能夠觀察到相關的 quota 限制,接下來就是要實際的給予用戶/群組限制啰! 回去瞧瞧,我們需要每個用戶 250M/300M 的容量限制,群組共 950M/1G 的容量限制,同時 grace time 設置為 14 天喔! 實際的語法與設置流程來瞧瞧:
```
[root@study ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[root@study ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
選項與參數:
limit :實際限制的項目,可以針對 user/group 來限制,限制的項目有
bsoft/bhard : block 的 soft/hard 限制值,可以加單位
isoft/ihard : inode 的 soft/hard 限制值
name : 就是用戶/群組的名稱啊!
timer :用來設置 grace time 的項目喔,也是可以針對 user/group 以及 block/inode 設置
范例一:設置好用戶們的 block 限制值 (題目中沒有要限制 inode 啦!)
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1 12K 250M 300M 00 [------] 7 0 0 00 [------]
范例二:設置好 myquotagrp 的 block 限制值
[root@study ~]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
[root@study ~]# xfs_quota -x -c "report -gbih" /home
Group quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp 60K 950M 1G 00 [------] 36 0 0 00 [------]
范例三:設置一下 grace time 變成 14 天吧!
[root@study ~]# xfs_quota -x -c "timer -ug -b 14days" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
.....(中間省略).....
Blocks grace time: [14 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
范例四:以 myquota1 用戶測試 quota 是否真的實際運行呢?
[root@study ~]# su - myquota1
[myquota1@study ~]$ dd if=/dev/zero of=123.img bs=1M count=310
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 Bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[myquota1@study ~]$ ll -h
-rw-r--r--. 1 myquota1 myquotagrp 300M Jul 24 21:38 123.img
[myquota1@study ~]$ exit
[root@study ~]# xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)
Blocks
User ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquota1 300M 250M 300M 00 [13 days]
myquota2 12K 250M 300M 00 [------]
# 因為 myquota1 的磁盤用量已經破表,所以當然就會出現那個可怕的 grace time 啰!
```
這樣就直接制做好 quota 啰!看起來也是挺簡單啦!
### 14.1.6 實作 Quota 流程-4:project 的限制 (針對目錄限制) (Optional)
現在讓我們來想一想,如果需要限制的是目錄而不是群組時,那該如何處理呢?舉例來說,我們要限制的是 /home/myquota 這個目錄本身, 而不是針對 myquotagrp 這個群組啊!這兩種設置方法的意義不同喔!例如,前一個小節談到的測試范例來說, myquota1 已經消耗了 300M 的容量,而 /home/myquota 其實還沒有任何的使用量 (因為在 myquota1 的主文件夾做的 dd 指令)。 不過如果你使用了 xfs_quota -x -c "report -h" /home 這個指令來查看,就會發現其實 myquotagrp 已經用掉了 300M 了! 如此一來,對于目錄的限制來說,就不會有效果!
為了解決這個問題,因此我們這個小節要來設置那個很有趣的 project 項目!只是這個項目不可以跟 group 同時設置喔! 因此我們得要取消 group 設置并且加入 project 設置才行。那就來實驗看看。
* 修改 /etc/fstab 內的文件系統支持參數
首先,要將 grpquota 的參數取消,然后加入 prjquota ,并且卸載 /home 再重新掛載才行!那就來測試看看!
```
# 1\. 先修改 /etc/fstab 的參數,并啟動文件系統的支持
[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota,prjquota 0 0
# 記得, grpquota 與 prjquota 不可同時設置喔!所以上面刪除 grpquota 加入 prjquota
[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: ON
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF <==已經取消啰!
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
Accounting: ON <==確實啟動啰!
Enforcement: ON
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
```
* 規范目錄、專案名稱(project)與專案 ID
目錄的設置比較奇怪,他必須要指定一個所謂的“專案名稱、專案識別碼”來規范才行!而且還需要用到兩個配置文件! 這個讓鳥哥覺得比較怪一些就是了。現在,我們要規范的目錄是 /home/myquota 目錄,這個目錄我們給個 myquotaproject 的專案名稱, 這個專案名稱給個 11 的識別碼,這個都是自己指定的,若不喜歡就自己指定另一個吧!鳥哥的指定方式如下:
```
# 2.1 指定專案識別碼與目錄的對應在 /etc/projects
[root@study ~]# echo "11:/home/myquota" >> /etc/projects
# 2.2 規范專案名稱與識別碼的對應在 /etc/projid
[root@study ~]# echo "myquotaproject:11" >> /etc/projid
# 2.3 初始化專案名稱
[root@study ~]# xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion
depth infinite (-1). # 會閃過這些訊息!是 OK 的!別擔心!
[root@study ~]# xfs_quota -x -c "print " /home
Filesystem Pathname
/home /dev/mapper/centos-home (uquota, pquota)
/home/myquota /dev/mapper/centos-home (project 11, myquotaproject)
# 這個 print 功能很不錯!可以完整的查看到相對應的各項文件系統與 project 目錄對應!
[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 0 0 00 [------] 1 0 0 00 [------]
# 喔耶!確定有抓到這個專案名稱啰!接下來準備設置吧!
```
* 實際設置規范與測試
依據本章的說明,我們要將 /home/myquota 指定為 500M 的容量限制,那假設到 450M 為 soft 的限制好了! 那么設置就會變成這樣啰:
```
# 3.1 先來設置好這個 project 吧!設置的方式同樣使用 limit 的 bsoft/bhard 喔!:
[root@study ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 450M 500M 00 [------] 1 0 0 00 [------]
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 Bytes (524 MB) copied, 0.96296 s, 544 MB/s
# 你看!連 root 在該目錄下面創建文件時,也會被擋掉耶!這才是完整的針對目錄的規范嘛!贊!
```
這樣就設置好了啰!未來如果你還想要針對某些個目錄進行限制,那么就修改 /etc/projects, /etc/projid 設置一下規范, 然后直接處理目錄的初始化與設置,就完成設置了!好簡單!
當鳥哥跟同事分享這個 project 的功能時,強者我同事蔡董大大說,剛剛好!他有些朋友要求在 WWW 的服務中,要針對某些目錄進行容量的限制! 但是因為容量之前僅針對用戶進行限制,如此一來,由于 WWW 服務都是一個名為 httpd 的帳號管理的,因此所有 WWW 服務所產生的文件數據, 就全部屬于 httpd 這個帳號,那就無法針對某些特定的目錄進行限制了。有了這個 project 之后,就能夠針對不同的目錄做容量限制! 而不用管在里頭創建文件的文件擁有者!哇!這真是太棒了!實務應用給各位了解啰! ^_^
### 14.1.7 XFS quota 的管理與額外指令對照表
不管多完美的系統,總是需要可能的突發狀況應付手段啊!所以,接下來我們就來談談,那么萬一如果你需要暫停 quota 的限制, 或者是重新啟動 quota 的限制時,該如何處理呢?還是使用 xfs_quota 啦!增加幾個內部指令即可:
* disable:暫時取消 quota 的限制,但其實系統還是在計算 quota 中,只是沒有管制而已!應該算最有用的功能啰!
* enable:就是回復到正常管制的狀態中,與 disable 可以互相取消、啟用!
* off:完全關閉 quota 的限制,使用了這個狀態后,你只有卸載再重新掛載才能夠再次的啟動 quota 喔!也就是說, 用了 off 狀態后,你無法使用 enable 再次復原 quota 的管制喔!注意不要亂用這個狀態!一般建議用 disable 即可,除非你需要執行 remove 的動作!
* remove:必須要在 off 的狀態下才能夠執行的指令~這個 remove 可以“移除”quota 的限制設置,例如要取消 project 的設置, 無須重新設置為 0 喔!只要 remove -p 就可以了!
現在就讓我們來測試一下管理的方式吧:
```
# 1\. 暫時關閉 XFS 文件系統的 quota 限制功能
[root@study ~]# xfs_quota -x -c "disable -up" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: OFF <== 意思就是有在計算,但沒有強制管制的意思
Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
Accounting: OFF
Enforcement: OFF
Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
Accounting: ON
Enforcement: OFF
Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
520+0 records in
520+0 records out # 見鬼!竟然沒有任何錯誤發生了!
545259520 Bytes (545 MB) copied, 0.308407 s, 180 MB/s
[root@study ~]# xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 520M 450M 500M 00 [-none-]
# 其實,還真的有超過耶!只是因為 disable 的關系,所以沒有強制限制住就是了!
[root@study ~]# xfs_quota -x -c "enable -up" /home # 重新啟動 quota 限制
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
dd: error writing ‘/home/myquota/123.img’: No space left on device
# 又開始有限制!這就是 enable/disable 的相關對應功能喔!暫時關閉/啟動用的!
# 完全關閉 quota 的限制行為吧!同時取消 project 的功能試看看!
[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 您瞧瞧!沒有辦法重新啟動!因為已經完全的關閉了 quota 的功能!所以得要 umouont/mount 才行!
[root@study ~]# umount /home; mount -a
# 這個時候使用 report 以及 state 時,管制限制的內容又重新回來了!好!來瞧瞧如何移除project
[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "remove -p" /home
[root@study ~]# umount /home; mount -a
[root@study ~]# xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquotaproject 500M 0 0 00 [------]
# 嘿嘿!全部歸零!就是“移除”所有限制值的意思!
```
請注意上表中最后一個練習,那個 remove -p 是“移除所有的 project 控制列表”的意思!也就是說,如果你有在 /home 設置多個 project 的限制, 那么 remove 會刪的一個也不留喔!如果想要回復設置值,那...只能一個一個重新設置回去了!沒有好辦法!
上面就是 XFS 文件系統的簡易 quota 處理流程~那如果你是使用 EXT 家族呢?能不能使用 quota 呢?除了參考[上一版](http://linux.vbird.org/linux_basic/0420quota/0420quota-centos5.php)的文件之外,鳥哥這里也列出相關的參考指令/設置文件給你對照參考! 沒學過的可以看看流程,有學過的可以對照了解! ^_^
| 設置流程項目 | XFS文件系統 | EXT家族 |
| --- | --- |
| /etc/fstab參數設置 | usrquota/grpquota/prjquota | usrquota/grpquota |
| quota 配置文件 | 不需要 | quotacheck |
| 設置用戶/群組限制值 | xfs_quota -x -c "limit..." | edquota 或 setquota |
| 設置 grace time | xfs_quota -x -c "timer..." | edquota |
| 設置目錄限制值 | xfs_quota -x -c "limit..." | 無 |
| 觀察報告 | xfs_quota -x -c "report..." | repquota 或 quota |
| 啟動與關閉 quota 限制 | xfs_quota -x -c "[disable|enable]..." | quotaoff, quotaon |
| 發送警告信給用戶 | 目前版本尚未支持 | warnquota |
### 14.1.8 不更動既有系統的 quota 實例
想一想,如果你的主機原先沒有想到要設置成為郵件主機,所以并沒有規劃將郵件信箱所在的 /var/spool/mail/ 目錄獨立成為一個 partition ,然后目前你的主機已經沒有辦法新增或分區出任何新的分區了。那我們知道 quota 的支持與文件系統有關, 所以并無法跨文件系統來設計 quota 的 project 功能啊!因此,你是否就無法針對 mail 的使用量給予 quota 的限制呢?
此外,如果你想要讓使用者的郵件信箱與主文件夾的總體磁盤使用量為固定,那又該如何是好? 由于 /home 及 /var/spool/mail 根本不可能是同一個 filesystem (除非是都不分區,使用根目錄,才有可能整合在一起), 所以,該如何進行這樣的 quota 限制呢?
其實沒有那么難啦!既然 quota 是針對 filesystem 來進行限制,假設你又已經有 /home 這個獨立的分區了,那么你只要:
1. 將 /var/spool/mail 這個目錄完整的移動到 /home 下面;
2. 利用 ln -s /home/mail /var/spool/mail 來創建鏈接數據;
3. 將 /home 進行 quota 限額設置
只要這樣的一個小步驟,嘿嘿!您家主機的郵件就有一定的限額啰!當然啰!您也可以依據不同的使用者與群組來設置 quota 然后同樣的以上面的方式來進行 link 的動作!嘿嘿嘿!就有不同的限額針對不同的使用者提出啰!很方便吧!^_^

**Tips** 朋友們需要注意的是,由于目前新的 distributions 大多有使用 SELinux 的機制, 因此你要進行如同上面的目錄搬移時,在許多情況下可能會有使用上的限制喔!或許你得要先暫時關閉 SELinux 才能測試, 也或許你得要自行修改 SELinux 的規則才行喔!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀