ENIX.DC 發表於 2006-1-19 16:19:14

[分享] Linux Quota 實作 For RedHat9

Linux Quota 實作 For RedHat9.0
目前新版的 Linux distributions 如: RH9.0 等使用的是 Kernel 2.4.xx 的核心版本,這個核心版本支援新的 quota 模組,使用的預設檔案( aquota.user, aquota.group )將不同於舊版本的 quota.user, quota.group !(多了一個 a 呦!)
quota 這支程式對硬碟配額的限制項目:
quota 這支程式針對整個 partition 的限制項目主要分為底下幾個部分:
Ø        soft:
這是最低限制容量的意思,使用者在寬限期間之內,他的容量可以超過 soft ,但必需要寬限時間之內將磁碟容量降低到 soft 的容量限制之下!
Ø        hard:
這是『絕對不能超過』的容量!跟 soft 相比的意思為何呢?通常 hard limit 會比 soft limit 為高,例如網路磁碟空間為 30 MB ,那麼 hard limit 就設定為 30MB ,但是為了讓使用者有一定的警戒心,所以當使用空間超過 25 MB 時,例如使用者使用了 27 MB 的空間時,那麼系統就會警告使用者, 讓使用者可以在『寬限時間內』將他的檔案量降低至 25 MB ( 亦即是 soft limit )之內!也就是說, soft 到 hard 之間的容量其實就是寬限的容量啦!可以達到針對使用者的『警示』作用!
Ø        寬限時間:
那麼寬限時間就可以很清楚的知道含意是什麼了!也就是當您的使用者使用的空間超過了 soft limit ,卻還沒有到達 hard limit 時,那麼在這個『寬限時間』之內, 就必需要請使用者將使用的磁碟容量降低到 soft limit 之下!而當使用者將磁碟容量使用情況超過 soft limit 時,『寬限時間』就會自動被啟動,而在使用者將容量降低到 soft limit 之下,那麼寬限時間就會自動的取消囉!
基本Quota指令:
Ø        /etc/mtab :
怪了!不是說好要說明 quota 相關指令的嗎?幹嘛提這個檔案系統 (filesystem) 實際掛載的記錄檔?呵呵!要注意了~當我們使用 quota 的時候,基本上,系統會去搜尋:『 系統上具有 quota 參數的 partition 』 所以囉,當我們要使用 quota 的功能時,我們的 filesystem 必須要已經支援 quota 的旗標才行。一般來說,我們是以編輯 /etc/fstab 後,再重新掛載 filesystem 的方法來讓系統的 filesystem 支援 quota 的!這個概念可是很重要的喔!
Ø        quota
# quota [-uvsl] # quota [-gvsl]
參數:
-u:後面可以接 username ,表示顯示出該使用者的 quota 限制值。
若不接 username       ,表示顯示出執行者的 quota 限制值。
-g:後面可接 groupname ,表示顯示出該群組的 quota 限制值。
-v:顯示每個 filesystem 的 quota 值;
-s:可選擇以 inode 或磁碟容量的限制值來顯示;
-l:僅顯示出目前本機上面的 filesystem 的 quota 值。
範例:
範例一:秀出目前 root 自己的 quota 限制值:
# quota -guvs
範例二:秀出 dmtsai 這個使用者的磁碟配額
# quota -vs -u dmtsai
# 注意一下這兩個範例,如果您的系統上面尚未有任何的 quota 支援的 filesystem 時,
# 使用這兩個範例時,『不會有任何資訊列出來』啦!不要以為發生錯誤囉!
這個指令僅是使用來『顯示(display)』目前某個群組或者某個使用者的 quota 限值!您可以使用來觀察一下呦!
Ø        quotacheck
# quotacheck [-avug]
參數
-a:掃瞄所有在 /etc/mtab 內,含有 quota 支援的 filesystem,加上此參數後,       /mount_point 可不必寫,因為掃瞄所有的 filesystem 了嘛!
-u:針對使用者掃瞄檔案與目錄的使用情況,會建立 aquota.user-g:針對群組掃瞄檔案與目錄的使用情況,會建立 aquota.group
-v:顯示掃瞄過程的資訊;
-M:『強制』進行 quotacheck 的掃瞄。
範例:
範例一:將所有的在 /etc/mtab 內,含有 quota 支援的 partition 進行掃瞄# quotacheck -avugquotacheck: Can't find filesystem to check or filesystem not mounted with quota option.
# 不要緊張,這是正常的現象~因為您尚未啟用 quota 的參數嘛!
# 關於 quota 參數的下達方法,我們會在稍後說明。
如果正常的進行掃瞄,會像下面這樣:
# quotacheck -avugquotacheck:
Scanning /dev/hdb1 donequotacheck:
Checked 3 directories and 4 files
# ll /disk2
total 32
-rw-------1 root root6144 Sep5 14:56 aquota.group
-rw-------1 root root6144 Sep5 14:56 aquota.userd
rwx------2 root root 16384 Jun 25 16:22 lost+found
# 第一次操作 quotacheck 可能會有一些錯誤訊息發生,那應該是正常的!
# 如果使用 ls -l 去查閱一下有 quota 支援的那個 mount point ,若有出現
# aquota.group 及 aquota.user ,那應該就是已經建立好了 quota 記錄檔了!
範例二:強制掃瞄已掛載的 filesystem
# quotacheck -avug -m
# 有些時候,在某些 Linux distributions 上面,進行 quotacheck 時,
# 可能會出現如下的錯誤訊息:# quotacheck: Cannot get quotafile name for /dev/hda3
# quotacheck: Cannot get quotafile name for /dev/hda3
# 果真如此的話,那麼你可以如同上面一般,加上 -m 的參數來『強制』掃瞄。# 也可以手動先建立記錄檔,然後再掃瞄,
如下所示:# touch /disk2/aquota.user; touch /disk2/aquota.group
# quotacheck -avug
# 必須要注意的是,我這裡是以 /disk2 作為一個測試的 mount point ,
# 您的掛載點不一定會一樣喔!
這這個指令主要的目的在掃瞄某一個磁碟的 quota 空間,他會針對該 partitions 進行掃瞄,並且,由於該磁碟若持續運作時,可能掃瞄的過程中, 檔案可能會增減,造成 quota 掃瞄的錯誤發生,因此,當使用 quotacheck 時,該磁碟將『 自動被設定成為唯讀磁區 ( read-only ) 』 ;
至於掃瞄完畢之後, 掃瞄所得的磁碟空間結果會寫入該磁區最頂端。
( 例如:在例子中,掃瞄 /disk2 這個 /dev/hdb1 的磁區,如果是初次掃瞄,那麼掃瞄完畢之後會產生 aquota.user 與 aquota.group ,會放置在 /disk2/aquota.user 與 /disk2/aquota.group 底下!
而如果是建立 quota 後的掃瞄,那麼就會更新這兩個檔案! ) 另外, Linux 也特別強調 quota 在使用的時候,需要特別注意在 reboot 時,得先將 quota 關閉才好!
此外,由於新版的 Linux distribution 在 quota 的設計上似乎有點小問題,有時候無法完整的進行 quotacheck ,發生如同上表的情況,解決的方法就是主動手動的建立 quotafile 即可喔!
例如上面的範例二所顯示的。
Ø        edquota
# edquota [-u username] [-u groupname]# edquota -t<==修改恕限時間
# edquota -p username_demo -u username
參數:-u:後面接帳號名稱。可以進入 quota 的編輯畫面 (vi) 去設定 username 的限制值;
-g:後面接群組名稱。可以進入 quota 的編輯畫面 (vi) 去設定 groupname 的限制值;
-t:可以修改恕限時間 (就是超過 quota 的 soft limit 值後,還能使用硬碟的寬限期限)
-p:複製範本。那個 username_demo 為已經存在並且已設定好 quota 的使用者,      意義為『將 username_demo 這個人的 quota 限制值複製給 username 』!
範例:
範例一:設定 dmtsai 這個使用者的 quota 限制值
# edquota -u dmtsaiDisk quotas for user dmtsai (uid 501):
Filesystemblocks    soft    hard   inodes   softhead
/dev/hdb1          0       0       0      0      0      0
# 進入編輯畫面後,以 vi 的相關行為進行編輯喔!我們可以看到
# 被編輯的使用者是 dmtsai ,而底下共有七個欄位,每個欄位的意義我們將在# 底下的說明繼續介紹。而假設我們對於 dmtsai 的限制是 30MB 的話,
那麼:Disk quotas for user dmtsai (uid 501):
Filesystem    blocks    soft    hard   inodes   soft   hard
/dev/hdb1          0   25000   30000      0      0      0
# 然後就可以儲存後離開囉!
範例二:將 dmtsai 的 quota 限制值 (30MB) 複製給 vbird1 這個使用者# edquota -p dmtsai -u vbird1
範例三:修訂恕限時間
# edquota -tGrace period before enforcing soft limits for users:Time units may be: days, hours, minutes, or secondsFilesystem             Block grace period   Inode grace period
/dev/hdb1                     7days                  7days
# 預設的恕限時間是 7 天啦!你當然可以修訂時間!
這個指令就是在編輯每一個『個人』或者是『群組』的 quota 數值!通常我們以 edquota -u username 或者是 edquota -g groupname 來編輯個人與群組的 quota 設定值。不過,或許您會覺得一個一個分配似乎很慢的樣子!那麼您也可以直接 copy 一個人的設定值給其他人,就如同上面第二個例子,利用已經建立好的 dmtsai 來建立 vbird1 這個人的 quota 限額!這個指令可是很重要的呦! 另外,範例一當中出現的那七個欄位代表的意義我們得要談一談啊:
·        filesystem:
代表這個 quota 是針對哪一個 partition 的意思。以範例一的情況來說,指的是 /dev/hdb1 囉! 也就是 /disk2 那個目錄底下的 quota 限制值啦!
·        blocks:
這個是目前使用者 dmtsai ( uid 501 ) 在 /dev/hdb1 這個 filesystem (參考上面一個資訊),所耗掉的磁碟容量,也就是目前的使用掉的空間啦!單位是 Kbytes 喔!這個資訊是 quota 程式自己計算出來的,所以請不要修改他!
·        soft 與 hard :
這個是目前的 dmtsai 使用者在這個 filesystem 之內的 quota 限制值!至於 soft 與 hard 的意思就如同 前一節最後面提的那個意思啦!soft 代表的是一個『警告』限值, hard 則是一個『不可超過的限值』, soft 與 hard 中間的差值則為寬限的數值。而當 soft 與 hard 數值為 0 的時候,表示『沒有限制』的意思!而數值的單位仍是 Kbytes 喔!
·        inodes:
是目前使用掉 inode 的狀態,也是 quota 自己計算出來而得到的,所以不要去變更他。一般而言, inode 不容易控制,所以您可以不必去限制 inode 呢!

Ø        quotaon
# quotaon [-avug]
# quotaon [-vug]
參數:
-u:針對使用者啟動 quota (aquota.user)
-g:針對群組啟動 quota (aquota.group)
-v:顯示啟動過程的相關訊息;
-a:根據 /etc/mtab 內的 filesystem 設定啟動有關的 quota ,若不加 -a 的話,      則後面就需要加上特定的那個 filesystem 喔!
範例:
範例一:啟動所有的具有 quota 的 filesystem
# quotaon -auvg/dev/hdb1 : group quotas turned on/dev/hdb1 : user quotas turned on
範例二:僅啟動 /disk2 裡面的 user quota 設定值:# quotaon -uv /disk2
這個指令是在啟動 quota 的!
不過,由於這個指令是啟動 aquota.group 與 aquota.user 的,所以您就必須要先完成 qutoacheck 的工作了!然後簡單的下達 quotaon -a 即可啟動!

Ø        quotaoff
# quotaoff [-a]
# quotaoff [-ug]
參數:
-a:全部的 filesystem 的 quota 都關閉 (根據 /etc/mtab)-u:僅針對後面接的那個 /mount_point 關閉 user quota
-g:僅針對後面接的那個 /mount_point 關閉 group quota
範例:
範例一:# quotaoff -a
這個指令就是關閉了 quota 的限制啦!
實作範例:
1.        在”/”下建立Quota
2.        限制每個使用者250-300MB 保留日期七天
3.        測試Qouta是否生效.
首先建立使用者
# groupadd qgroup# useradd -m -g qgroup daniel # passwd daniel
觀察目前磁碟分割狀況
檔案系統            容量已用 可用 已用% 掛載點/dev/sda3             133G   12G115G   9% //dev/sda1            99M   15M   79M16% /bootnone                  504M   0504M   0% /dev/shm$
在/etc/fstab建立Quota參數
LABEL=/       /      ext3    defaults,usrquota,grpquota      1 1
LABEL=/boot    /boot                   ext3    defaults      1 2
none            /dev/pts                devptsgid=5,mode=6200 0
none            /proc                   proc    defaults      0 0
none            /dev/shm                tmpfs   defaults      0 0
/dev/sda2      swap                  swap    defaults       0 0
dev/cdrom       /mnt/cdrom       udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0         /mnt/floppy             auto    noauto,owner,kudzu 0 0
在/下的default後面加入,usrquota,grpquota
這樣就算加入了 quota 的磁碟格式了!不過,由於真正的 quota 在讀取的時候是讀取 /etc/mtab 這個檔案的,偏偏這一個檔案需要重新開機之後才能夠以 /etc/fstab 的新資料進行改寫!所以這個時候你可以選擇:
1.        重新開機 (reboot) ;
2.        重新 remount filesystem 來驅動設定值!
因為在這邊所建立的為根目錄,所以只能夠重新開機來做quota磁碟格式加入
如果不是設定在根目錄可以這麼做:
# umount /dev/hdb1
# mount -a
# grep '/disk2' /etc/mtab/dev/hdb1 /disk2 ext3 rw,usrquota,grpquota 0 0#
事實上,也可以利用 mount 的 remount 功能!
# mount -o remount /disk2
這樣我們就已經成功的將 filesystem 的 quota 功能加入囉!



建立aquota.group aquota.user
掃瞄磁碟的使用者使用狀況,並產生重要的 aquota.group 與 aquota.user:
接著下來就是要來掃瞄一下我們所需要的磁碟到底有沒有多餘的空間可以讓我們來設定 quota 呢?並且將掃瞄的結果輸出到這個磁碟的最頂層去(也就是 / 底下)這個時候就需要 quotacheck 這個指令的幫忙了!使用 quotacheck 就可以輕易的將所需要的資料給他輸出了! 並且在 / 底下會產生 aquota.group 與 aquota.user 這兩個檔案!
筆者在實作時,發現需要自行加入 aquota.user aquota.group
所以我們在/下進行建立這兩個檔案
# touch /disk2/aquota.user;touch /disk2/aquota.group
# quotacheck –avug -m
可能是因為是根目錄的關係,所以在執行 quotacheck時 需要特別加入-m 強制執行,才能夠正確建立檔案
由於剛才是使用 touch自行建立的
所以需要將權限從新設定
# chmod 600 aquota.*aquota.groupaquota.user#
檢查是否有設定檔出現
# ll
-rw-------    1 root   root      102401月 18 14:59 aquota.group-rw-------    1 root   root      102401月 18 14:59 aquota.user
啟動 quota 的限額:
再來就是要啟動 quota 啦!啟動的方式也是很簡單的!就是使用 quotaon -av 即可:
# quotaon -avug/dev/sda3
[/]: group quotas turned on/dev/sda3
[/]: user quotas turned on
注意:要看到上面有個 turned on 的出現,才是真的成功了!


編輯使用者的可使用空間:
設定 daniel 好了,使用 edquota 就對了:
# edquota danielDisk quotas for user daniel (uid 509):
Filesystem         blocks       soft       hard   inodes   soft   hard
/dev/sda3             32   250000   300000          9      0      0
因為是使用 / 來進行 quota 設定的, 那麼 blocks/inodes 肯定不會是 0 ,這裡要特別留意的。好了,上面特殊字體的部分就是我們的設定了, 分別是 250000 及 300000 ,那個單位是 KBytes 啦,轉成 MBytes 應該是要乘上 1024 才對, 不過,簡單算一下就好了,不要太介意喔!
接下來要來設定寬限時間,還是使用 edquota !
# edquota -tGrace period before enforcing soft limits for users:Time units may be: days, hours, minutes, or secondsFilesystem             Block grace period   Inode grace period/dev/sda3                     1days                  7days
將時間改為 1 天(原本是 7days 改成 1days ),好了!查詢一下是否真的有設定進去呢?使用 quota -v 來查詢:
這邊可依照需求去做設定
設定開機時啟動 quota:
這個部分就不需要擔心了,因為 Red Hat 系列的開機 script (/etc/rc.d/rc.sysinit) 已經將 quota 的偵測寫入在裡頭,因此,在預設的情況下, quota 是會主動的被啟動的。 不過,如果你想要手動的強制 quota 在開機啟動一遍,那麼可以使用 vi 去編輯 /etc/rc.d/rc.local ,在裡面加入一行 (直接加在最後一行即可):
# vi /etc/rc.d/rc.local/sbin/quotaon -avug




驗證quota是否正確:
$
dd if=/dev/zero of=/home/bbs/daniel/aaa bs=1M count=260
sd(8,3): warning, user block quota exceeded.
讀入了 260+0 個區段輸出了 260+0 個區段
回到 daniel家目錄
使用指令dd if=/dev/zero of=/home/bbs/daniel/aaa bs=1M count=260來建立一個大檔案bs為設定一個block的大小,
count是建立多少個block
所以 本次我們是建立一個260MB大小的檔案出來
$ quota -u
danielDisk quotas for user daniel
(uid 509):
Filesystemblocks   quota   limit   grace   files   quota   limit   grace
/dev/sda3266536* 250000300000   6days      10       0       0
在這邊的 blocks就看到多了一個*號的字樣,表示容量已經超過soft了,在後面的grace為限制天數
我們再建立一個看是否會正確限制容量
$
dd if=/dev/zero of=/home/bbs/daniel/aa bs=1M count=260
sd(8,3): write failed, user block limit reached.dd: writing ‘/home/bbs/daniel/aa’:
硬碟 quota 滿了讀入了 33+0 個區段輸出了 32+0 個區段
果然再建立一個260MB大小的檔案,系統出現 quota滿了的訊息
$ quota -u danielDisk quotas for user daniel (uid 509):
Filesystemblocks   quota   limit   grace   files   quota   limit   grace
/dev/sda3300000* 250000300000            11       0       0
在去觀察quota的使用者狀態,果然 blocks是限制在300000不會超過
使用者所使用的空間已經滿了,需要清除本身的檔案,才可以再繼續使用
頁: [1]
查看完整版本: [分享] Linux Quota 實作 For RedHat9