磁盘配额:disk quota
通过实现磁盘配额可以限制磁盘空间,当一个用户消耗太多的磁盘空间或磁盘分区被写满时给系统管理员报警。
在linux中我们只能使用超级管理员root用户进行磁盘配额的设置,并且磁盘配额是基于文件系统的,也就是必须在文件系统上配置磁盘配额。
我们可以对用户或组的所能使用的空间大小或是创建的文件个数进行限制。限制可以分为两种:
1,软限制:当用户或组所分配的空间占满以后,在一定的宽限期内可以超出容量但是系统会给处警告,并在宽限期过后强制收回空间。
2,硬限制:当用户或组所分配的空间占满以后,就不能再存储数据。
工具:
quotacheck: 扫瞄一个文件系统磁盘使用,创建,检查,修复配额文件。
edquota : 编辑用户配额
repquota: 汇总文件系统的配额
quota: 显示磁盘使用和限制
quotaon: 打开文件系统配额
quotaoff: 关闭文件系统配额
配置磁盘配额:
1,修改/etc/fstab,使能配额quota为每一个文件系统。
如:为指定的文件系统使能usrquota或grpquota
/dev/VolGroup00/LogVol02 /home ext3 defaults,usrquota,grpquota 1 2
2,remount重新挂载文件系统。
mount -o remount,usrquota,grpquota /home
3,创建配额数据库文件 和 磁盘使用表。
quotacheck: 检查配额使能文件系统,并且为每一个文件系统创建一个当前磁盘空间使用表。并且更新磁盘配额文件。
(quotacheck对XFS不生效,XFS使用xfs_quota)
quotacheck : [-gubcfinvdMmR] [-F quota-format ] -a| filesystem
-c: 创建文件,不读取已存在的配额文件。只重新扫描并保存到磁盘。
-f: force
-u: 只检查使能user 配额的文件系统(用户配额文件,默认)
-g: 只检查使能group配额的文件系统(组配额文件)
3.1,创建配额文件
quotacheck -cug /home
3.2,产生当前磁盘使用表 //更新使用表
quotacheck -avug (-a 所有本地挂载的文件系统) // quotacheck -vug /home
或 :
quotaon /home 启用 (quotaon -vaug 使能配额)
quotaoff /home 关闭 (quotaoff -vaug 禁止配额)
quotaon -a 启用所有
4,指定配额策略。
4.1. edquota -u username 对用户设定配额
edquota -g groupname 对组设定配额
会出现文本编辑器如下:(块的单位为1K)
Filesystem blocks soft hard inodes soft hard
/dev/sdd 20 0 0 2 0 0
(文件系统, 已使用的块,软块数限制,硬块数限制,已经创建的文件个数(有*表示超出软限制), 软文件个数限制,硬文件个数限制)
edquota -p username username1 // 把username用户的设定复制给username1用户
edquota -t 设置软限制的宽限期,默认为7天,可以用days,hours,minutes,seconds等。
4.2, 查询用户的磁盘配额使用情况
命令:quota username (quota -g group)
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/vgg1409821123fdc-lunext4
20* 0 1 2 0 0
文件系统 ,
已使用块数(*表示已超出软限制)
quota 软块数限制
limit 硬块数限制
grace超出块数的宽限期
files 已经创建的文件个数,(*表示超出软限制)
quota软文件个数限制 //如果设置了软限制,就要设置
grace period 宽限
期,edquota -t
limit 硬文件个数限制
grace超出创建文件个数的宽限期
命令: repquota -v /home 显示磁盘配额文件系统的所有用户的配额信息
*** Report for user quotas on device /dev/mapper/vgg1409821123fdc-lunext4
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root +- 20 0 1 2 0 0
(+-表示超出块限制,-+表示超出个数限制)
告警:warnquota
此命令对那些已超出软限制的用户,以邮件的形式发送警告信息。
显示详情:
第1列:使能配额的文件系统 设备名
第2列:显示用户当前使用的块
第3,4列:用来设置此文件系统上用户的 软,硬 块限制
第5列:inode,显示用户当前使用的inodes节点数
第6,7列:用来设置文件系统上用户的 软,硬inode节点限制
硬块限制是一个用户或组可以使用的磁盘空间的绝对最大数量。一旦达到这个限制,没有进一步的磁盘空间可以使用。
软块限定了可以使用的磁盘空间的最大数量。然而,不同的是硬的限制,软限制可以超过一定量的时间。
这个时间叫做宽限期(grace period),宽限期可以用 秒,分,时,日,周,月表示。
如果相应值为0,则表示没有限制,在文件编辑器中,更改相应的限制。
5,保持准确的配额:
当一个文件系统无法卸载干净时,需要运行quotacheck.
quotacheck需要周期性的运行。
启动时运行:写一个shell脚本放在/etc/cron.daily/ 或 /etc/cron.weekly/目录
在单用户模式下运行:quotaoff -vug /file_system
quotacheck -vug /file_system
quotaon -vug /file_system
在系统运行时运行:quotacheck -vug file_system
磁盘配额管理:
quotaoff -vaug // 禁止所有的 配额,-u 所有的用户配额 -g 所有的组配额
quotaon -vaug //开启所有的配额
quotaon -vug /home //开启指定的配额
repquota -a //报告所有的 磁盘使用情况, repquota /home 报告指定的磁盘使用情况
xfs磁盘配额:
挂载选项:(mount时使能)
uquota/uqnoenforce - User quotas
gquota/gqnoenforce - Group quotas
pquota/pqnoenforce - Project quota
使能后,xfs_quota就可以 用来设置和显示磁盘使用情况。
xfs_quota有两种运行方式:交互方式(默认),直接子命令运行方式(加参数 -c )。
xfs_quota有两种模式:分别有不同的子命令
基本模式:(默认)对所有用户可以时显示使用情况
quota user/userid: 显示指定用户的用量与限制。
df:显示已使用,和空闲的 块和inode节点数。
专家模式: (-x 进入)子命令可以设置限制,只有受权用户才能执行。
report /path : 显示指定文件系统的配额信息。
limit :修改配额限制。
如:
xfs_quota -x -c 'report -h' /home
. //直接在命令行方式 显示/home文件系统的配额信息。
xfs_quota -x -c 'limit isoft=500 ihard=700 john' /home
. //限制john 在文件系统/home上软inode数量为500,硬inode数量为700
(注:limit 默认为用户,如果为组,则加-g , 块限制有:bsoft,bhard,且单位为byte )
xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m accounting' /home
.
补充:xfs配额限制里有一个工程限制:project limits
在配置工程控制目录 限制前,把它加入到/etc/projects. 把工程名加入到/etc/projectid, 使工程id可以映射成工程名。
当工程加入到/etc/projects, 就可以使用下面的命令初始化工程目录:
xfs_quota -x -c 'project -s projectname' project_path //初始化工程目录
xfs_quota -x -c 'limit -p bsoft=1000m bhard=1200m projectname' //配置 工程磁盘配额。
通用配额工具(如:quota,repquota,edquota)也可以用来操作xfs磁盘配额,但通用工具不能用来操作XFS工程配额。
源码:实例
磁盘配额子系统用来设置每个用户或用户组的磁盘空间限制在指定的文件系统上。
对于用户与用户组,都有一个软限制与硬限制,硬限制不会超过,软限制可以超过,但会有警告。
但软限制有一个时间周期,超过这个时间,就类似于硬限制。
#include <sys/quota.h>
int quotactl(int cmd, char*special, int id,caddr_t addr);
成功返回0,失败返回-1
用来维护磁盘配额。cmd表明命令应用到指定的用户或用户组id,
cmd初始化:QCMD(subcmd, type):
type包括用户配额和组配额两种:USRQUOTA, GRPQUOTA
subcmd有:
Q_QUOTAON: 使能配额,此时 id 表明使用哪种配额格式:QFMT_VFS_OLD, QFMT_VFS_V0, QFMT_VFS_V1,
addr表示对应的配额文件(aquota.user,aquota.group)。
Q_QUOTAOFF: 关闭配额,此时 id, addr 忽略。
Q_GETQUOTA: 获得当前磁盘配额对指定的用户或用户组id, 此时addr 是stuct dqblk:
struct dqblk {
uint64_t dqb_bhardlimit; 块硬限制
uint64_t dqb_bsoftlimit; 块软限制
uint64_t dqb_curspace; 当前已使用块
uint64_t dqb_ihardlimit; inode硬限制
uint64_t dqb_isoftlimit; inode软限制
uint64_t dqb_curinodes; 当前已使用inode
uint64_t dqb_btime; 块软限制宽限时间
uint64_t dqb_itime; inode软限制宽限时间
uint32_t dqb_valid; 位掩码:QIF_ 开头,表明那个域有用
};
#define QIF_BLIMITS 1
#define QIF_SPACE 2
#define QIF_ILIMITS 4
#define QIF_INODES 8
#define QIF_BTIME 16
#define QIF_ITIME 32
#define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS)
#define QIF_USAGE (QIF_SPACE | QIF_INODES)
#define QIF_TIMES (QIF_BTIME | QIF_ITIME)
#define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
Q_SETQUOTA: 设置指定用户或用户组id的配额信息
Q_GETINFO: 获取配额文件的信息(如宽限期)。此时addr为struct dqinfo.
struct dqinfo {
uint64_t dqi_bgrace; 块软限制宽限时间
uint64_t dqi_igrace; inode软限制宽限时间
uint32_t dqi_flags; 配额文件的标志 ,DQF_*. 只有QFMT_VFS_OLD 格式时才有用,其它没定义。
uint32_t dqi_valid; 表明哪个域有用,IIF_*
};
# define IIF_BGRACE 1 # define IIF_IGRACE 2
# define IIF_FLAGS 4
# define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
Q_SETINFO: 设置配额文件的信息
Q_GETFMT:获取配额文件的格式。
代码实例:
//检查quota是否开启(turn on)
int actfmt=0;
quotactl(QCMD(Q_GETFMT, USRQUOTA), devname, 0,(void *)&actfmt);
//使能quota: quotaon
quotactl(QCMD(Q_QUOTAON,USRQUOTA), dev, QFMT_VFS_V0, (void *)quotafile);
//禁止quota:quotaoff
quotactl(QCMD(Q_QUOTAOFF,USRQUOTA), dev, 0, NULL);
int main(){
int ret,fmt=0;
ret=quotactl(QCMD(Q_GETFMT, 0),"/dev/mapper/vgg1448505961bb5-lun5", 0,(void *)&fmt);
printf("ret=%d,fmt=%d\n",ret,fmt);
}
//获得指定用户的当前限制与用量,时间
struct dqblk kdqblk; 注 dqb_valid=QIF_LIMITS
quotactl(QCMD(Q_GETQUOTA, USRQUOTA), quotadev, id, (void *)&kdqblk)
//设置指定用户的限制,时间
quotactl(QCMD(Q_SETQUOTA, USRQUOTA), quotadev, id, (void *)&kdqblk)
//获取磁盘配额文件的信息,如:宽限时间
struct dqinfo kinfo
quotactl(QCMD(Q_GETINFO, USRQUOTA), quotadev, 0, (void *)&kinfo)
//设置磁盘配额文件的信息,如:宽限时间
struct dqinfo kinfo
quotactl(QCMD(Q_SETINFO, USRQUOTA), quotadev, 0, (void *)&kinfo);