Linux 磁盘配额管理

磁盘配额简介

Linux 下磁盘配额功能叫 quota

一般用途

  • 限制服务使用空间容量;
  • 限制某一用户组所能使用的最大磁盘配额;
  • 限制某一用户的最大磁盘配额;
  • 限制某一目录的最大磁盘配额。

使用限制

  • EXT 文件系统下仅能针对整个文件系统设置;
  • 针对单一目录的设置(prjquota)和针对群组的设置(grpquota)不能共存;
  • 内核必须支持;
  • 只对一般身份用户有效。比如 root 就不能设置配额。也不能针对目录来设置(ext 文件系统);
  • 若启用 SELinux,非所有目录都可设置 quota

设置选项

  • 分别针对使用者,群组或个别目录(usergroup & project);
  • 容量限制(block)或文件数量限制(inode);
  • 警告(soft)与限制值(hard);
  • 宽限时间(grace time),在用量介于 softhard 之间时给予警告,并给予宽限时间(默认 7 天)。如果在宽限期内没把用量降到 soft 值之下,soft 限制值会替代 hard 值作为 quota 的限制。

开启 Quota 支持

extxfs 文件系统默认支持 quota,要手动加入 quota 支持可以使用 mount -o remount,usrquota,grpquota / 命令来重新挂载。usrquotagrpquota 参数分别代表用户与用户组支持参数。

写入配置文件可以修改 /etc/fstab 文件,在挂载参数后面加入 usrquotagrpquotaprjquota

[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 后面加的指令有以下:

指令 说明
print 单纯列出目前主机内的文件系统参数等数据
df 与原本 df 一样的功能,可加上 -b-i-h 等参数
report 列出目前的 quota 项目,有 -ugr-bi 等数据
state 说明目前支持 quota 的文件系统信息,有没有启动相关项目等

在使用了 usrquotagrpquota 参数挂载完文件系统后,可以用 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/xfs333bsoft为 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/xfs333bsoft为 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/fstabgrpquota挂载参数为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 限制。