February 27
限制Linux的用戶郵件容量(Quota)
我公司是用Sendmail作為MTA,郵件會儲存於/var/spool,若要限制用戶的郵箱容量,最直接的方法是從Linux的File System著手,只需要限制/var下面屬放某用戶的檔案容量便可以。
環境:Fedora Core 3
1, 執行rpm -qi quota ,看看有沒有安裝quota的包包
2, 編輯/etc/fstab,在指定的partition(例如 /var)的defaults值後面加上 usrquota或grpquota或兩者並存
修改前
/dev/sys /sys sysfs defaults
/dev/VolGroup00/LogVol03 /usr ext3 defaults
/dev/VolGroup00/LogVol02 /var ext3 defaults
修改後
/dev/sys /sys sysfs defaults
/dev/VolGroup00/LogVol03 /usr ext3 defaults
/dev/VolGroup00/LogVol02 /var ext3 defaults,usrqouta,grpquota
usrquota是限制獨立用戶的quota
grpqouta限制一個group的總quota
3, 重啟系統(我試過用 mount -o remount /dev/VolGroup00/LogVol02 /var , 但發現不行)
4, touch /var/aquota.user (若要使用grpquota, 便也要touch /var/aquota.group), 然後chmod 600 aquota.user, 注意不同kernel使的的quota file就有所不同
Quota Version 2 (Linux 2.4/2.6 kernel: Red Hat 7.1+/8/9,FC 1-3): aquota.user, aquota.group
Quota Version 1 (Linux 2.2 kernel: Red Hat 6, 7.0): quota.user, quota.group
5, 執行quotacheck -vguma (有些kernel 要執行 quotacheck -vgum /var 才行)
6, 然後執行quotaon -av
7, 現在便可以開始為每一個用戶設定特定quota
edquota -u USERNAME (若為group, 便執行 edquota -p GROUPNAME)
以上指令會預設會用vi 編輯指定用戶或群組的quota file (若開啟不到,應該是預設的編輯器有錯誤,可在csh下執行 setenv EDITOR=vi), 調檔案內soft及hard值
若容量達soft值,系統會發出warnings給用戶,hard值就是最大quota,因為warnings只有用戶telnet/ssh login才能發出,用pop登入是不會發出,這個情況下,soft值同hard值設定一樣也可以。
soft跟hard值都是kb作為單位,所以設定1024就等同1Mb的quota
8, 儲存後就即時生效,可以用edquota -p original_user another_user將一個用戶的quota值複製給其他用戶
9, 可以quota -v USERNAME去檢查用戶的容量
10, 未完的,以上雖解決了quota的限制設定,但有兩個問題隨之會產生:
當Sendmail MTA嘗試發寄電郵到一個over quota的郵箱時,只會在maillog產生一個Error
local mailer (/usr/bin/procmail) exited with EX_TEMPFAIL,預設系統是不會發回 notification給發件者,從而發件者一直不知自己發的郵件是寄不到收件者
要解決這個問題只需要編輯 /etc/mail/sendmail.cf,然後尋找Mlocal字串,它對下有一句 A=procmail -Y -t -a .......
將 "-t" 刪去,儲存並重啟sendmail即能解決
另一問題,當使用qpopper作為POP3程式,因為預設下,當一個用戶pop郵件,它會將 /var/mail/MAILFILE抄一份到 /var/mail/.MAILFILE.pop (cache),所以qpopper建議用戶的quota是最大容量的兩倍,但無論設定 soft值或hard值,設定多了一倍容量,用戶都能用到那個限額,那麼抄出來一份也是超過quota所定,故唯一方法是設定qpopper將cache mail指定到 /var以外,同時你確保/var以外的地方是有足夠儲存容量給某一刻時間制做出來的cache擺放,若可以重新compile qpopper, 可以在執行./configure --enable-temp-drop-dir=DIR_NAME,若不能重新compile,就使用run-time option,先建立一個檔案(任意叫pop3.conf),編輯並加入 set temp-dir=DIR_NAME, 儲存後重新執行 qpopper -s -f /DIR/pop3.conf