磁盘配额管理¶
对于Linux服务器,一般都是多用户的,如何防止某一个或一些用户将系统资源占用太多呢,ulimit命令可以进行一些限制。对于一个文件存储服务器,怎么给用户分配一定额度的空间呢?总不能把磁盘分为N个分区一个用户分一块吧。Linux提供了一个工具quota控制每个用户或工作组的磁盘使用量。
- 命令有:
- quotacheck, setquota, edquota quotastats, repquota, warnquota quotaoff, quotaon quota, quotasync, quota_nld, rpc.rquotad
启用quota功能¶
- 首先确认你的内核支持quota,一般发行版Linux内核都支持quota功能,如果是自己手动编译,注意要选择支持quota。
- 第二步,安装quota软件包。具体方法请参照你所用的系统。
- 第三步,在磁盘的挂载选项中添加上usrquota, grpquota。使得文件系统支持quota。
- 最后,运行命令quotacheck -a自动检查确认哪些系统支持quota。
简单举例¶
首先使用LVM创建了一个500M的实验分区scale
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
scale vg -wi-ao 500.00m
然后将该分区挂载到/tmp/scale下。
生成记录文件¶
运行命令: quotacheck -avug。目录/tmp/scale(文件系统)中生成两个文件:aquota.user, aquota.group(注意这个文件是由``quotacheck``生成的,而不是手动创建的)。aquota.user, aquota.group这两个文件是用来存放用户配额相关信息的,并不是文本格式。
开启和关闭quota功能¶
使用命令quotaon, quotaoff来手动开启或关闭磁盘配额功能。如果你想开机自动运行,应该将quota服务设定为开机自运行。
# 开启磁盘配额管理功能
quotaon -vug filesystem
quotaon -avug
# 关闭磁盘配额管理功能
quotaoff -vug filesystem
quotaoff -avug
设置服务开机自运行的方法请根据你的系统设定。
为用户设定配额值¶
最为激动的一个环节到了,怎么来为用户,工作组来设定配额呢?命令``edquota``将为您服务。
# 对sheldon进行配额限制
edquota -u sheldon
# 将会打开如下格式的一个文件:
Disk quotas for user sheldon (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg-scale 20480 10240 30720 3 0 0
Warning
上面的文件是我已经编辑过的,如果对没有对用户进行过设置,则所有项均为0.
这个文件为一个表格形式,分为七列:
- 第一列为文件系统,即哪个文件系统上sheldon个用多少空间。
- 第二列为blocks.此列由系统自动计算得到的。请勿修改。
- 同样第五列inodes与第二列一样,由系统自动计算得到的。
- 第三,六列均为soft限制,即当用户所用磁盘量超过这个值后,会触发一些系统动作。
- 第四,七列为hard限制,即用户使用磁盘量达到这个值之后,无法再写入文件。请特别注意。
从上面我们可以发现,quota可以对用户使用磁盘量的两个指标进行限制-block和inode,关于两个值的意义请查看文件存储部分。
Warning
使用命令edquota编辑配额时,数字必须与列名右对齐,否则会提示格式错误而设置失败。
同样quota也支持对工作组磁盘用量的限额,只需要使用选项-g替代-u就可以了。例如:
# 对bigbang小组进行限制
edquota -g bigbang
Disk quotas for group bigbang (gid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg-scale 20480 102400 307200 3 0 0
其格式与作用与对user的设定完全一致。
如果运行一个文件服务器,可能对很多用户的配额是完成一样的,比较说sheldon,harwod与leonard都只可以使用100M空间,你设定好sheldon的,然后再设定leonard的,再……如果有N个人一样,你一个一个的去设定那不得麻烦S啊。你一定要相信Linux一定有”偷懒”的方法。下面就是一个:
# 将sheldon的配额设定copy一份给leonard,这样他们的就完全一样了,也不用再编辑
edquota -p sheldon -u leonard
Easy吧。
设定宽限期¶
前面我们知道配额有一个soft,一个hard限制,这两者有什么区别呢?
当用户磁盘用量超过soft限制之后,会触发一个宽限期(grace-time),如果在宽限期内用户占用磁盘量没有下降到soft设定值下,soft将变为hard。超出的数据会被怎么样还不清楚,正在实验。
下面的命令用于设定grace-period(宽限期):
# 默认是设定针对用户的宽限期
edquota -t
# 加上参数``-g``可以设定工作的宽限期
edquota -t -g
# 使用选项``-T``可以针对某个用户或工作组进行设定,如果没有特别设定,则使用设
# 定(即``-t``的设定值)。
edquota -T -u sheldon
edquota -T -g bigbang
批量设定磁盘配额¶
命令setquota不同于edquota通过编辑方式设定配额,setquota可以方便的使用命令/参数模式来批量的设定用户的磁盘配额。请看命令说明:
setquota [ -rm ] [ -u | -g ] [ -F quotaformat ] name block-softlimit block-hardlimit inode-softlimit inode-hardlimit -a | filesystem
setquota [ -rm ] [ -u | -g ] [ -F quotaformat ] [ -p protoname ] name -a | filesystem
setquota -b [ -rm ] [ -u | -g ] [ -F quotaformat ] -a | filesystem
setquota -t [ -m ] [ -u | -g ] [ -F quotaformat ] block-grace inode-grace -a | filesystem
setquota -T [ -m ] [ -u | -g ] [ -F quotaformat ] name block-grace inode-grace -a | filesystem
例如,设定sheldon只能使用/home文件系统100M,上限为200M,可以如此设定:
setquota -u sheldon 100000 200000 0 0 /home
同样可以设定宽限期:
setquota -t -u sheldon 7 0 /home
警告提示¶
如果仅仅是限额而没有提示,这很可能会造成用户数据溢出丢失,Linux怎么会允许这样情况发现了。为了方便提醒用户,qutoa提供了一个命令warnquota用户提醒用户。
如果你写入的文件直接超出了hard限定,程序会提示你写入错误,磁盘配额超出,你所写入的数据将是不完整的,切记!
dd if=/dev/zero of=test bs=1M count=30M
# dd: writing `test': Disk quota exceeded
# 14+0 records in
# 13+0 records out
# 14581760 bytes (15 MB) copied, 0.0170676 s, 854 MB/s
dd命令提示“Disk quota exceeded,再看本来计划写入30M数据,结果只写入了15M,写入数据不完整的,超出部分的数据将会丢失。
命令warnquota的作用是:检查所有文件系统中的配额控制,如果有用户的磁盘用户达到的soft的限制,就会给用户发送一封邮件提醒。注意warnquota不会自动执行,如果你想定期检查,请用cron功能。
warnquota需要一个配置文件/etc/warnquota.conf。内容摘要如下,在配置文件中,定义邮件的相关信息,如:邮件主题、内容,发送者,签名等等
MAIL_CMD = "/usr/sbin/sendmail -t"
FROM = "root@CCTV"
# but they don't have to be:
SUBJECT = Hey, user, clean up your account!
CC_TO = "sysadm@example.com"
# If you set this variable CC will be used only when user has less than
# specified grace time left (examples of possible times: 5 seconds, 1 minute,
# 12 hours, 5 days)
# CC_BEFORE = 2 days
SUPPORT = "support@example.com"
PHONE = "(123) 456-1111 or (222) 333-4444"
# Text in the beginning of the mail (if not specified, default text is used)
# This way text can be split to more lines
# Line breaks are done by '|' character
# The expressions %i, %h, %d, and %% are substituted for user/group name,
# host name, domain name, and '%' respectively. For backward compatibility
# %s behaves as %i but is deprecated.
MESSAGE = Hello user %i, I've noticed you use too much space\
on my disk in %h.%d.|Delete your files on the following filesystems:|
# Text in the end of the mail (if not specified, default text using SUPPORT and PHONE
# is created)
SIGNATURE = See you!| Your admin of %h|
# Following text is used for mails about group exceeding quotas
GROUP_MESSAGE = Hello, a group '%i' you're member of use too much space at %h.
使用cron定期检查的,系统即可以定期检查用户的磁盘使用情况,并及时提醒用户。
监控报表¶
作为SA(system administrator)你需要关注用户的磁盘配额使用量。
命令quota和repquota可以帮你完成这些任务。
查看配额设定¶
quota可以用于查看对某个用户或工作组的磁盘配额设定情况。如:查看sheldon的配额设定值。
quota -su sheldon
# 选项-s使得输出值便于阅读
# 命令输出值:
Disk quotas for user sheldon (uid 1000):
Filesystem space quota limit grace files quota limit grace
/dev/mapper/vg-scale
30720K* 10240K 30720K 6days 2 0 0
查看某个工作组的配额设定,使用选项-g即可。
quota -sg bigbang
# 命令行输出值:
Disk quotas for group liuhui (gid 1000):
Filesystem space quota limit grace files quota limit grace
/dev/mapper/vg-scale
30720K 100M 200M 2 0 0
查看详细使用情况¶
repquota命令用于查看某个文件系统上所有用户,工作组的磁盘配额使用情况。例如: * 查看用户报告使用选项-u:
repquota -su . *** Report for user quotas on device /dev/mapper/vg-scale Block grace time: 7days; Inode grace time: 7days Space limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 13K 0K 0K 2 0 0 sheldon +- 30720K 10240K 30720K 6days 2 0 0
- 查看工作组报告选项-g: