Linux 磁盘配额管理
磁盘配额简介
Linux 下磁盘配额功能叫 quota
。
一般用途
- 限制服务使用空间容量;
- 限制某一用户组所能使用的最大磁盘配额;
- 限制某一用户的最大磁盘配额;
- 限制某一目录的最大磁盘配额。
使用限制
EXT
文件系统下仅能针对整个文件系统设置;- 针对单一目录的设置(
prjquota
)和针对群组的设置(grpquota
)不能共存; - 内核必须支持;
- 只对一般身份用户有效。比如
root
就不能设置配额。也不能针对目录来设置(ext
文件系统); - 若启用
SELinux
,非所有目录都可设置quota
。
设置选项
- 分别针对使用者,群组或个别目录(
user
,group
&project
); - 容量限制(
block
)或文件数量限制(inode
); - 警告(
soft
)与限制值(hard
); - 宽限时间(
grace time
),在用量介于soft
与hard
之间时给予警告,并给予宽限时间(默认 7 天)。如果在宽限期内没把用量降到soft
值之下,soft
限制值会替代hard
值作为quota
的限制。
开启 Quota 支持
ext
和 xfs
文件系统默认支持 quota
,要手动加入 quota
支持可以使用 mount -o remount,usrquota,grpquota /
命令来重新挂载。usrquota
和 grpquota
参数分别代表用户与用户组支持参数。
写入配置文件可以修改 /etc/fstab
文件,在挂载参数后面加入 usrquota
和 grpquota
或 prjquota
:
[root@101c7 ~]$ vi /etc/fstab
/dev/sdb4 /root/sdb4m ext3 defaults 0 0
/dev/sdd1 /xfs333 xfs defaults,usrquota,grpquota 0 0
[root@101c7 ~]$ umount /xfs333
[root@101c7 ~]$ mount -a
mount: /dev/sdb4 is already mounted or /root/sdb4m busy
[root@101c7 ~]$ mount | grep sdd
/dev/sdd1 on /xfs333 type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
EXT 文件系统磁盘配额
由于 EXT 文件系统中使用的工具和 XFS 文件系统不同,因此分别记录。
新建 Quota 配置文件
Quota 是通过分析整个文件系统中每个用户(用户组)拥有的文件总数与总容量,将数据记录在该文件系统的最顶层目录,然后在该配置文件中再使用每个账号或组的限制值去规定磁盘使用量。
可以使用quotacheck
命令来新建 Quota 配置文件,用法如下:
quotacheck [-avugfM] [挂载点]
主要参数:
参数 | 说明 |
---|---|
-a | 扫描所有在/etc/mtab 内 Quota 支持的文件系统,加入此参数后可不写挂载点 |
-u | 针对用户扫描文件与目录使用情况,会新建aquota.user |
-g | 针对用户组扫描文件与目录使用情况,会新建aquota.group |
-v | 显示扫描过程 |
-f | 强制扫描文件系统,并写入新的 Quota 配置文件 |
-M | 强制以读写的方式扫描文件系统 |
对整个系统执行扫描并新建配置文件:
[root@101c7 ~]$ quotacheck -avug
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdb4 [/root/sdb4m] done
quotacheck: Cannot stat old user quota file /root/sdb4m/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 8 directories and 19 files
quotacheck: Old file not found.
quotacheck: Old file not found.
在挂载点查询新建的配额配置文件:
[root@101c7 ~]$ ll -d /root/sdb4m/aq*
-rw-------. 1 root root 7168 Sep 13 13:26 /root/sdb4m/aquota.group
-rw-------. 1 root root 7168 Sep 13 13:26 /root/sdb4m/aquota.user
配置文件不用手动去编辑,因为实际上是 Quota 的数据文件,内容会一直变动。
启动与关闭 Quota
启动 quota 服务使用命令quotaon
,加入-auvg
参数来启动所有功能:
[root@101c7 ~]$ quotaon -avug
/dev/sdb4 [/root/sdb4m]: group quotas turned on
/dev/sdb4 [/root/sdb4m]: user quotas turned on
quota 启动一次后,系统的/etc/rc.d/rc.sysinit
初始化脚本都会自动执行该命令。
关闭 quota 服务使用quotaoff
命令,用-a
参数关闭所有功能:
[root@101c7 ~]$ quotaoff -a
编辑 Quota
编辑配额使用edquota
命令,语法如下:
edquota [-u 用户名] [-g 组]
edquota -t 宽限时间
edquota -p 范本账号 -u 新账号
例如设置用户user1
的 Quota 限制值为 hard=10MB,soft=8MB:
[root@101c7 ~]$ edquota -u user1
Disk quotas for user user1 (uid 1003):
Filesystem blocks soft hard inodes soft hard
/dev/sdb4 2 8000 10000 1 0 0
会进入到编辑页面,总共七个字段说明如下:
编号 | 字段 | 说明 |
---|---|---|
1 | Filesystem | 说明针对的文件系统 |
2 | blocks | 磁盘容量,单位为 KB |
3 | soft | 磁盘容量的 soft 限制值,单位 KB |
4 | hard | 磁盘容量的 hard 限制值,单位 KB |
5 | inodes | 文件数量 |
6 | soft | 文件数量的 soft 限制值 |
7 | hard | 文件数量的 hard 限制值 |
修改宽限时间为 14 天:
[root@101c7 ~]$ edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/sdb4 14days 7days
设置 Quota
除了修改配置文件,还可以通过setquota
命令来设置 Quota 的值。命令语法如下:
setquota [-u|-g] 用户名|组名 容量限制(soft) 容量限制(hard) 文件数限制(soft) 文件数限制(hard)
例如,将user1
的文件数限制设置为 1000/2000:
[root@101c7 ~]$ setquota -u user1 0 0 1000 2000 /root/sdb4m
Quota 报表
针对用户或组查询限额报表使用 quota
命令,命令语法如下:
quota [-uvs] [用户名]
quota [-gvs] [组名]
例如查询用户user1
的限额:
[user1@101c7 sdb4m]$ quota -uvs user1
Disk quotas for user user1 (uid 1003):
Filesystem space quota limit grace files quota limit grace
/dev/sdb4 9250K* 8000K 10000K 13days 5 0 0
显示的内容和edquota
编辑时看到的字段差不多,多了一个宽限日期。
针对整个文件系统配额查询可以使用repquota
命令:
repquota -a [-vugs]
参数如下:
参数 | 说明 |
---|---|
-a | 直接到/etc/mtab 查询具有 quota 标志的文件系统,并报告 quota 的结果 |
-v | 输出的数据将含有文件系统相关的详细信息 |
-u | 显示出用户的 quota 限值 |
-g | 显示出个别用户组的 quota 限值 |
-s | 以 M,G 为单位显示结果 |
例如查询所有用户的 quota 限制情况:
[root@101c7 ~]$ repquota -auvs
*** Report for user quotas on device /dev/sdb4
Block grace time: 14days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 78K 0K 0K 17 0 0
user1 +- 9250K 8000K 10000K 13days 5 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 2
Used average: 2.000000
XFS 文件系统磁盘配额
在 xfs 文件系统下,主要使用 xfs_quota
命令进行配额管理。
查询状态
基本使用方法为:xfs_quota -x -c "指令" [挂载点]
,其中 -x
表示使用专家模式,-c
后面加的指令有以下:
指令 | 说明 |
---|---|
单纯列出目前主机内的文件系统参数等数据 | |
df | 与原本 df 一样的功能,可加上 -b 、-i 、-h 等参数 |
report | 列出目前的 quota 项目,有 -ugr 及 -bi 等数据 |
state | 说明目前支持 quota 的文件系统信息,有没有启动相关项目等 |
在使用了 usrquota
、grpquota
参数挂载完文件系统后,可以用 print
指令查询:
[root@101c7 ~]$ xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/boot /dev/sda1
/xfs333 /dev/sdd1 (uquota, gquota)
查询挂载点 /xfs333
文件系统使用情况:
[root@101c7 ~]$ xfs_quota -x -c "df -h" /xfs333/
Filesystem Size Used Avail Use% Pathname
/dev/sdd1 496.7M 55.8M 440.8M 11% /xfs333
列出目前 /xfs333
的所有用户 quota 限制值:
[root@101c7 ~]$ xfs_quota -x -c "report -ubih" /xfs333
User quota on /xfs333 (/dev/sdd1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 30.0M 0 0 00 [------] 7 0 0 00 [------]
可以看到目前只有 root
在目录中使用了 30MB,而且没有设限。使用 state
指令查询 /xfs333
的 quota 功能启用情况:
[root@101c7 ~]$ xfs_quota -x -c "state"
User quota state on /xfs333 (/dev/sdd1)
Accounting: ON
Enforcement: ON
Inode: #68 (1 blocks, 1 extents)
Group quota state on /xfs333 (/dev/sdd1)
Accounting: ON
Enforcement: ON
Inode: #69 (1 blocks, 1 extents)
Project quota state on /xfs333 (/dev/sdd1)
Accounting: OFF
Enforcement: OFF
Inode: #69 (1 blocks, 1 extents)
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
针对用户和组设置 Quota
设置使用的命令格式为:
xfs_quota -x -c "limit [-ug] b[soft|hard]=限制值 i[soft|hard]=限制值 用户或组名" 挂载点
xfs_quota -x -c "timer [-ug] [-bir] Ndays"
上面命令为限制 block 和 inode,下面命令为设置 grace 时间。针对用户/组设置使用-u
/-g
参数。
例如限制用户user1
对/xfs333
的bsoft
为 100MB,bhard
为 110MB:
[root@101c7 ~]$ xfs_quota -x -c "limit -u bsoft=100M bhard=110M user1" /xfs333/
[root@101c7 ~]$ xfs_quota -x -c "report -ubih" /xfs333/
User quota on /xfs333 (/dev/sdd1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 30.0M 0 0 00 [------] 7 0 0 00 [------]
user1 0 100M 110M 00 [------] 0 0 0 00 [------]
限制用户组users
对/xfs333
的bsoft
为 50MB,bhard
为 60MB:
[root@101c7 ~]$ xfs_quota -x -c "limit -g bsoft=50M bhard=60M users" /xfs333/
[root@101c7 ~]$ xfs_quota -x -c "report -gbih" /xfs333/
Group quota on /xfs333 (/dev/sdd1)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 30.0M 0 0 00 [------] 7 0 0 00 [------]
users 0 50M 60M 00 [------] 0 0 0 00 [------]
设置/xfs333
的 grace time 为 14 天:
[root@101c7 ~]$ xfs_quota -x -c "timer -g -b 14days" /xfs333/
[root@101c7 ~]$ xfs_quota -x -c "timer -u -b 14days" /xfs333/
[root@101c7 ~]$ xfs_quota -x -c "state" /xfs333/
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
测试一下对用户的实际限制情况:
[user1@101c7 xfs333]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdd1 508580 26416 482164 6% /xfs333
[user1@101c7 test]$ dd if=/dev/zero of=100M bs=1M count=100
File size limit exceeded
[user1@101c7 test]$ dd if=/dev/zero of=200M bs=1M count=100
dd: error writing ‘200M’: Disk quota exceeded
[user1@101c7 test]$ ll -h
total 110M
-rw-rw-r--. 1 user1 user1 79M Sep 17 14:20 100M
-rw-rw-r--. 1 user1 user1 31M Sep 17 14:20 200M
[root@101c7 xfs333]$ xfs_quota -x -c "report -ubih" /xfs333/
User quota on /xfs333 (/dev/sdd1)
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 [------]
user1 109.1M 100M 110M 00 [13 days] 3 0 0 00 [------]
可以看到针对 user1
的限制已经生效,grace time 开始计时。
再看看针对组的实际限制情况,使用 gid 为 users
的用户 user4
测试:
[user4@101c7 test]$ dd if=/dev/zero of=200M bs=1M count=200
dd: error writing ‘200M’: Disk quota exceeded
61+0 records in
60+0 records out
62914560 bytes (63 MB) copied, 0.0394094 s, 1.6 GB/s
[user4@101c7 test]$ ll -h
total 60M
-rw-r--r--. 1 user4 users 60M Sep 17 14:26 200M
[root@101c7 xfs333]$ xfs_quota -x -c "report -gbih" /xfs333/
Group quota on /xfs333 (/dev/sdd1)
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 [------]
users 60M 50M 60M 00 [13 days] 2 0 0 00 [------]
同样已经生效。
针对目录设置 Quota
先修改/etc/fstab
内grpquota
挂载参数为prjquota
,再重新挂载目录。查看状态:
[root@101c7 ~]$ xfs_quota -x -c "state"
Project quota state on /xfs333 (/dev/sdd1)
Accounting: ON
Enforcement: ON
Inode: #69 (3 blocks, 3 extents)
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
然后针对目录/xfs333/test
设置 Project 名称和 ID 为dirquo:23
到配置文件:
[root@101c7 ~]$ echo "23:/xfs333/test" > /etc/projects
[root@101c7 ~]$ echo "dirquo:23" >> /etc/projid
下面初始化方案:
[root@101c7 /]$ xfs_quota -x -c "project -s dirquo"
Setting up project dirquo (path /xfs333/test)...
Processed 1 (/etc/projects and cmdline) paths for project dirquo with recursion depth infinite (-1).
[root@101c7 /]$ xfs_quota -x -c "print" /xfs333/
Filesystem Pathname
/xfs333 /dev/sdd1 (uquota, pquota)
/xfs333/test /dev/sdd1 (project 23, dirquo)
[root@101c7 /]$ xfs_quota -x -c "report -pbih" /xfs333/
Project quota on /xfs333 (/dev/sdd1)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
#0 0 0 0 00 [------] 2 0 0 00 [------]
dirquo 60M 0 0 00 [------] 3 0 0 00 [------]
开始设置对目录的容量为 20M/30M 限制:
[root@101c7 /]$ xfs_quota -x -c "limit -p bsoft=20M bhard=30M dirquo" /xfs333/
[root@101c7 /]$ xfs_quota -x -c "report -pbin" /xfs333/
Project quota on /xfs333 (/dev/sdd1)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/ Grace
---------- -------------------------------------------------- --------------------------------------------------
#0 0 0 0 00 [--------] 2 0 0 00 [--------]
#23 61440 20480 30720 00 [--none--] 3 0 0 00 [--------]
目前容量使用已经超过配额,直接使用root
测试:
[root@101c7 test]$ dd if=/dev/zero of=44 bs=1M count=44
dd: failed to open ‘44’: Disk quota exceeded
[root@101c7 test]$ rm -rf 200M
[root@101c7 test]$ dd if=/dev/zero of=44 bs=1M count=44
dd: error writing ‘44’: No space left on device
31+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.0373182 s, 843 MB/s
[root@101c7 test]$ xfs_quota -x -c "report -pbin" /xfs333/
Project quota on /xfs333 (/dev/sdd1)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/ Grace
---------- -------------------------------------------------- --------------------------------------------------
#0 0 0 0 00 [--------] 2 0 0 00 [--------]
#23 30720 20480 30720 00 [14 days] 3 0 0 00 [--------]
第一次dd
直接拒绝说达到配额限制,将原文件删除后再试,跑到 33MB 提示没有空间,所以对目录限制是不挑用户的。
管理 Quota 功能
可以使用下面的指令来启停 quota 功能:
- disable: 暂停 quota 限制
- enable: 恢复 quota 限制
- off: 完全关闭 quota 限制,需要重新挂载文件系统才能再次启用
- remove: 需要在 off 状态下执行,移除 quota 的限制设置。
暂停后 quota 限制解除,但还是会继续计算用量:
[root@101c7 test]$ xfs_quota -x -c "state" /xfs333/
User quota state on /xfs333 (/dev/sdd1)
Accounting: ON
Enforcement: OFF
Inode: #68 (2 blocks, 2 extents)
Group quota state on /xfs333 (/dev/sdd1)
Accounting: OFF
Enforcement: OFF
Inode: #69 (3 blocks, 3 extents)
Project quota state on /xfs333 (/dev/sdd1)
Accounting: ON
Enforcement: OFF
Inode: #69 (3 blocks, 3 extents)
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
重新启用 quota:
[root@101c7 test]$ xfs_quota -x -c "enable -up" /xfs333/
完全关闭 quota 并取移除 project 限制:
[root@101c7 test]$ xfs_quota -x -c "off -up" /xfs333/
[root@101c7 test]$ xfs_quota -x -c "enable -up" /xfs333/
XFS_QUOTAON: Function not implemented
[root@101c7 ~]$ xfs_quota -x -c "remove -p" /xfs333/
[root@101c7 ~]$ umount /xfs333/; mount -a
[root@101c7 ~]$ xfs_quota -x -c "report -phb" /xfs333/
Project quota on /xfs333 (/dev/sdd1)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
#0 0 0 0 00 [------]
dirquo 30M 0 0 00 [------]
可以看到 dirquo 的设置已经清零了,remove 会清除所有 project 限制。