date: 2020-05-16title: linux针对用户及组设置磁盘配额 #标题
tags: 磁盘配额 #标签
categories: linux大杂烩 # 分类
需求:限制单一用户对某个目录的最大可用存储。
在Centos 7.x中,不同的文件系统使用不同磁盘配额管理管理工具,xfs文件系统使用xfs_quota工具进行管理,ext3/4文件系统通过quota工具进行管理,这里将分别展示两种文件系统设置磁盘配额的过程。
xfs文件系统设置磁盘配额
确认相关管理工具已安装
$ rpm -q xfsprogs
xfsprogs-4.5.0-15.el7.x86_64
$ rpm -ql xfsprogs | grep xfs_quota
/usr/sbin/xfs_quota
/usr/share/man/man8/xfs_quota.8.gz
挂载时添加所需参数
$ mkdir /xfs # 创建挂载点
$ mount -o usrquota,grpquota /dev/sdb1 /xfs # 挂载时增加usrquota,grpquota参数
$ df -hT /xfs # 确认已挂载
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 10G 33M 10G 1% /xfs
# 若要设置永久挂载,则需要在/etc/fstab文件写入如下内容
$ tail -1 /etc/fstab
/dev/sdb1 /xfs xfs defaults,usrquota,grpquota 0 0
挂载时常用选项如下:
- usrquota:针对用户账号的磁盘配额设置;
- grpquota:针对群组的设置;
- prjquota:针对单一目录的设置,project的配额限制是针对文件系统生效的,需要注意的是它不能和grpquota配额支持同时存在,并且它不同于usrquota和grpquota配额设置,这两个对root不生效,但是project配额对root用户同样生效。
xfs_quota命令使用介绍
选项和参数:
- -x:专家模式,后续才能够加入-c的指令参数;
- -c:后面加的就是指令。
常用指令如下:
- print:只是列出目前主机内的文件系统参数等数据;
- df:与原本的df一样的功能,可以加上-b(block)、-i(inode)、-h(加上容量单位)等;
- report:列出目前的quota项目,有-ugr(user/group/project)及-bi等数据;
- state:说明目前支持quota的文件系统的信息,有没有启动相关项目等。
xfs_quota查询使用
# 列出目前系统的所有文件系统,以及文件系统的quota挂载参数的支持
$ xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/home /dev/mapper/centos-home
/boot /dev/sda1
/xfs /dev/sdb1 (uquota, gquota) #括号内的参数表示支持针对用户、组设置配额。
$ xfs_quota -x -c "df -h" /xfs #列出目前/xfs目录的挂载点文件系统使用情况。
Filesystem Size Used Avail Use% Pathname
/dev/sdb1 10.0G 32.2M 10.0G 0% /xfs
$ xfs_quota -x -c "state" # 列出目前文件系统是否启动了quota功能。
User quota state on /xfs (/dev/sdb1)
Accounting: ON # 有启用计算功能
Enforcement: ON # 有实际quota管制的功能
Inode: #67 (1 blocks, 1 extents) # 以上四行是说明启动了user的限制能力。
Group quota state on /xfs (/dev/sdb1)
Accounting: ON
Enforcement: ON
Inode: #68 (1 blocks, 1 extents) # 以上四行是说明启动了group的限制能力。
Project quota state on /xfs (/dev/sdb1)
Accounting: OFF
Enforcement: OFF
Inode: #68 (1 blocks, 1 extents) #以上四行是说明project并不支持
# 以下是grace time,表示当超过了软限制的容量,会允许继续使用多少天(下面是默认允许7天)
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
# 将用户的宽限时间改为14天
$ xfs_quota -x -c "timer -u 15days" /xfs
# 将组的宽限时间改为14天
$ xfs_quota -x -c "timer -g 15days" /xfs
关于grace time说明
grace time表示默认宽限时间,如果使用容量超过了软限制的容量,允许继续使用多少天,在这个时间内不做任何磁盘管理,到期后,soft限制会取代hard限制作为quota限制,也就是说,你的inode/block用量限制变为soft,达到soft后,磁盘使用权就被锁住。
设置磁盘配额示例
配额示例:
# 针对/xfs目录限制“lv”这个用户对此目录的容量及inode使用。
$ xfs_quota -x -c 'limit -u bsoft=100M bhard=150M isoft=5 ihard=10 lv' /xfs
# 上述指令执行后,lv这个用户对/xfs目录最多可用容量则为150M(软限制为100M)
# inode值则表示lv用户最多可在/xfs目录下创建多少文件,软限制为5个,硬限制为10个。
上述命令解释:
- -x:启动专家模式
- -c:直接调用管理命令
- -u:针对用户限制
- -g:针对组限制
- bsoft:容量软限制
- bhard:容量硬限制
- isoft:inode数量软限制
- ihard:inode数量硬限制
其实需要限制什么写什么即可,默认值为0,表示无限制,如下:
# 只限制ljz用户block的使用情况,而不限制inode使用情况
$ xfs_quota -x -c 'limit -u bsoft=100M bhard=150M ljz' /xfs
查询用户的限制情况
# 查询lv用户的容量限制情况
$ xfs_quota -c 'quota -uvh lv' /xfs
Disk quotas for User lv (1000)
Filesystem Blocks Quota Limit Warn/Time Mounted on
/dev/sdb1 0 100M 150M 00 [------] /xfs
# Quota表示软限制
# Limit表示硬限制
# 查询lv用户的inode限制情况
$ xfs_quota -c 'quota -iuvh lv' /xfs
Disk quotas for User lv (1000)
Filesystem Files Quota Limit Warn/Time Mounted on
/dev/sdb1 0 5 10 00 [------] /xfs
$ xfs_quota -x -c 'report -abih' # 查询所有用户的配额情况
# 也可以在report后面增加“-u”或“-g”,只查看针对用户的配额情况
User quota on /xfs (/dev/sdb1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [0 days] 3 0 0 00 [0 days]
lv 0 100M 150M 00 [------] 10 5 10 00 [14 days]
ljz 0 100M 150M 00 [------] 0 0 0 00 [------]
Group quota on /xfs (/dev/sdb1)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [0 days] 3 0 0 00 [0 days]
lv 0 0 0 00 [------] 10 0 0 00 [------]
验证配额效果
测试容量限制
# 设置权限并切换至lv用户
$ chmod 777 /xfs
$ su - lv
# 测试写入120M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=120
记录了120+0 的读入
记录了120+0 的写出
125829120字节(126 MB)已复制,0.447427 秒,281 MB/秒
$ du -sh /xfs/test.data # 查看生成的文件大小
120M /xfs/test.data
# 测试写入150M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=150
记录了150+0 的读入
记录了150+0 的写出
157286400字节(157 MB)已复制,0.168683 秒,932 MB/秒
$ du -sh /xfs/test.data # 文件大小为150M
150M /xfs/test.data
# 测试写入151M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=151
dd: 写入"/xfs/test.data" 出错: 超出磁盘限额 # 超出了硬限制150M,所以报错
记录了151+0 的读入
记录了150+0 的写出
157286400字节(157 MB)已复制,0.0628371 秒,2.5 GB/秒
$ du -sh /xfs/test.data # 文件大小还是150M
150M /xfs/test.data
测试inode限制
$ rm -rf /xfs/test.data # 删除容量测试的文件(容量已达到硬限制,同样无法创建新文件)
$ for i in `seq 8`;do touch /xfs/file${i};done # /xfs目录下创建8个文件
$ ls /xfs/ | wc -l
8
# 再创建4个,则有两个已无法创建(inode硬限制为10个)
$ for i in `seq 9 12`;do touch /xfs/file${i};done
touch: 无法创建"/xfs/file11": 超出磁盘限额
touch: 无法创建"/xfs/file12": 超出磁盘限额
取消quota限制
常用参数如下:
- disable:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能!
- enable:就是回复到正常管制的状态中,与 disable 可以互相取消、启用!
- off:完全关闭quota的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota!也就是说,用了 off 状态后,你无法使用 enable 再次复原 quota 的管制!注意不要乱用这个状态!一般建议用 disable
即可,除非你需要执行remove 的动作!- remove:必须要在 off 的状态下才能够执行的指令,这个 remove 可以“移除”quota 的限制设置,例如要取消 project 的设置,无须重新设置为 0 ,只要 remove -p 就可以了!
取消配额示例
$ xfs_quota -xc "disable -u" /xfs # 关闭/xfs目录对user的限制,
# u:表示user,g:表示group,p:表示project。
$ xfs_quota -xc "state" /xfs # 查看限制状态
User quota state on /xfs (/dev/sdb1)
Accounting: ON
Enforcement: OFF # 表示在计算,但是没有强制管制的意思,现在用户没有磁盘的使用限制
Inode: #67 (2 blocks, 2 extents)
Group quota state on /xfs (/dev/sdb1)
Accounting: ON
Enforcement: ON # 组的限制并没有关闭,若要关闭,使用指令:xfs_quota -xc "disable -g" /xfs 即可。
Inode: #68 (2 blocks, 2 extents)
Project quota state on /xfs (/dev/sdb1)
Accounting: OFF
Enforcement: OFF
Inode: #68 (2 blocks, 2 extents)
Blocks grace time: [15 days]
Inodes grace time: [15 days]
Realtime Blocks grace time: [15 days]
# 切换到lv用户进行写入测试
$ su - lv
$ dd if=/dev/zero of=/xfs/test.data bs=10M count=210
记录了210+0 的读入
记录了210+0 的写出
2202009600字节(2.2 GB)已复制,7.15118 秒,308 MB/秒
# 可以看到2.2个G的东西都写入了。并没有配额限制
# 再次查看用户配额情况如下
$ xfs_quota -x -c "report -abih" /xfs/
User quota on /xfs (/dev/sdb1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
lv 2.1G 100M 150M 00 [-none-] 11 5 10 00 [-none-]
ljz 0 100M 150M 00 [------] 0 0 0 00 [------]
Group quota on /xfs (/dev/sdb1)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [0 days] 3 0 0 00 [0 days]
lv 2.1G 0 0 00 [------] 11 0 0 00 [------]
xfs_quota其他指令
$ xfs_quota -xc "enable -u" /xfs/ #再次开启user配额限制
$ xfs_quota -xc "state" /xfs/ #完全关闭user的配额限制
$ xfs_quota -x -c "report remove -u" /xfs/ #取消quota的设置
EXT3/4文件系统设置磁盘配额
EXT3/4文件系统通过quota工具进行管理。
确认quota指令已安装
$ $ quota -V
Quota utilities version 4.01.
Compiled with: USE_LDAP_MAIL_LOOKUP EXT2_DIRECT HOSTS_ACCESS RPC RPC_SETQUOTA BSD_BEHAVIOUR
Bugs to jack@suse.cz
quota相关命令介绍
quotacheck
用于检测磁盘配额并生成配额文件。
- -a:检测所有可用的分区
- -u:检测用户配额
- -g:检测组配额
- -c:创建配额数据文件
- -v:显示执行过程
指令使用:
$ quotacheck -ugv /dev/sdb2 # 检查/dev/sdb2设备
$ quotacheck -augv # 检查所有可用分区
edquota
编辑用户和组账号的配额设置。
- -u: 修改用户配额,默认单位:KB。
- -g:修改组配额,默认单位:KB。
- -t:修改宽限时间。
使用示例:
$ edquota -u 用户名
$ edquota -g 组名
$ edquota -t
quotaon & quotaoff
启动/关闭文件系统的磁盘配额功能。
- -u:用户
- -g:组
- -v:显示过程
$ quotaon -ugv 设备文件名或挂载点
$ quotaoff -ugv 设备文件名或挂载点
quota
查看用户、组配额使用情况。
- -u:用户
- -g:组
$ quota -u 用户名
$ quota -g 组名
repquota
查看分区磁盘配额使用情况。
$ repquota 挂载点
配额设置示例
挂载磁盘
$ tail -1 /etc/fstab # 写入以下内容
/dev/sdb2 /ext4 ext4 defaults,usrquota,grpquota 0 0
$ mount -a # 刷新挂载文件
$ df -h /ext4 # 确认已挂载
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb2 9.8G 37M 9.2G 1% /ext4
$ mount | grep ext4 # 确认磁盘配额参数已生效
/dev/sdb2 on /ext4 type ext4 (rw,relatime,quota,usrquota,grpquota,data=ordered)
检测磁盘配额并生成配额文件
$ ls /ext4/ # 确认挂载目录下有aquota.group、aquota.user文件
aquota.group aquota.user lost+found
# 如果没有这两个文件,并且保证挂载参数无误,那么请执行下面的指令创建
$ quotacheck -ugcv /dev/sdb2
编辑磁盘配额设置
$ edquota -u lv # 编辑用户lv的配额设置
Disk quotas for user lv (uid 1000): # /dev/sdb1 是前面测试xfs的,忽略即可。
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 2150400 1024000 1536000 11 50 100
/dev/sdb2 0 1048576 2097152 0 10 20
# 这里设置lv用户对/dev/sdb2的配额为容量软限制1G,硬限制2G,上面单位为“KB”
# inode节点软限制10,硬限制 20个
启用磁盘配额功能
$ quotaon -ugv /ext4/ # 启用user和group的配额功能
/dev/sdb2 [/ext4]: group quotas turned on
/dev/sdb2 [/ext4]: user quotas turned on
$ chmod 777 /ext4/ # 开放权限,方便测试
切至lv用户测试配额
$ su - lv
$ dd if=/dev/zero of=/ext4/test.data bs=1M count=1024 # 写入1G数据正常
sdb2: warning, user block quota exceeded. # 只是有个warning
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,2.49776 秒,430 MB/秒
$ dd if=/dev/zero of=/ext4/test.data bs=1M count=2047 # 写入2047M数据也还能写入
sdb2: warning, user block quota exceeded.
记录了2047+0 的读入
记录了2047+0 的写出
2146435072字节(2.1 GB)已复制,1.14515 秒,1.9 GB/秒
$ dd if=/dev/zero of=/ext4/test.data bs=1M count=2050 # 写入2050M数据,直接提示写入出错
sdb2: warning, user block quota exceeded.
sdb2: write failed, user block limit reached.
dd: 写入"/ext4/test.data" 出错: 超出磁盘限额
记录了2048+0 的读入
记录了2047+0 的写出
2147479552字节(2.1 GB)已复制,1.13405 秒,1.9 GB/秒
# 测试inode限制
$ touch /ext4/test{1..11} # 创建11个文件
sdb2: warning, user file quota exceeded. # 提示warning
[25::lv@lv::~]$ >>$ ls /ext4/ # 但都创建成功了
aquota.group lost+found test10 test2 test4 test6 test8
aquota.user test1 test11 test3 test5 test7 test9 test.data
$ touch /ext4/test{12..19}
[27::lv@lv::~]$ >>$ ls /ext4/ # 也创建成功了
aquota.group test1 test12 test15 test18 test20 test5 test8
aquota.user test10 test13 test16 test19 test3 test6 test9
lost+found test11 test14 test17 test2 test4 test7 test.data
$ touch /ext4/test21 # 再创建1个就不行了
sdb2: write failed, user file limit reached.
touch: 无法创建"/ext4/test21": 超出磁盘限额
查看lv用户配额的使用情况
$ quota -u lv # 查询
Disk quotas for user lv (uid 1000):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 2150400* 1024000 1536000 14days 11 50 100
/dev/sdb2 2096132* 1048576 2097152 20* 10 20 6days
总结
xfs文件系统的磁盘配额只要文件数量、磁盘空间其中任何一个达到限额,就无法继续写文件;而EXT4文件系统则不同,磁盘空间满了还可以创建空文件,直至数量达到限额,或者数量达到限额,覆盖已有文件创建非空文件,直至磁盘容量达到限额。
注:不管是针对那种文件系统设置配额,都不应将所设置限额小于该用户已使用的数量,否则可能会导致用户无法正常登录系统。更不应作死一样,给root设置磁盘配额,以免带来不可预知的风险。