1 磁盘配额

磁盘配额是管理员为普通用户设置的使用磁盘的限制 , 每个用户只能使用有限的磁盘空间。通过磁盘配额的设置 , 管理员可以很清楚的了解到每个用户的磁盘使用情况。同时 , 也避免了某些用户因为存储垃圾文件浪费磁盘空间导致其他其他用户无法正常工作。

注:无法对单独的目录设置磁盘配额 , 如果需要对/home设置磁盘配额 , /home 必须在单独的文件系统中。 磁盘配额(Quota)用于限制用户/组对磁盘空间和文件数量的占用。ext 系列(ext4)和 XFS 都支持 , 但实现机制不同: ext4 用 aquota.user 数据库文件 + 内核记账,XFS 由文件系统内部管理(用 xfs_quota)

  • 两类限制维度

    维度

    说明

    blocks(磁盘空间)

    按 1KB 块计的空间限制

    inodes(文件数量)

    文件数限制(防止海量小文件耗尽 inode)

  • 每维三级概念

    概念

    说明

    soft(软限制)

    警告线。可以临时超过 , 但超过后启动宽限期(grace period)倒计时 , 到期后软限制变硬

    hard(硬限制)

    绝对上限,立即拒绝写入(写操作报 Disk quota exceeded)

    grace period(宽限期)

    软限制超期宽限时间,默认 7 天。降到 soft 以下后计时器自动清零

2 设置步骤

2.1 启用配额功能

这一步中需要在磁盘中设置相应分区 , 分区类型设置为默认即可 , 之后直接将对应的分区挂载在对应目录中即可。

注:默认情况下 , 系统安装时没有磁盘配额功能 , 需要yum install quota ,这样才能保证系统具有磁盘配额功能。

之后直接将下面所示的挂载信息写在/etc/fstab文件中

UUID="6fd15241-b805-499e-9b2b-591e03a20695" /mnt ext4  usrquota,grpquota 0 0

其中usrquota 表示用户拥有磁盘配额功能 , grpquota表示组拥有磁盘配额功能。 通过以上步骤 , 即开启了linux磁盘配额功能

2.2 创建配额数据库

创建配额数据库 , 一般使用quotacheck命令

  • 语法:quotacheck [OPTIONS] filesystem

  • [OPTIONS]

    • -a : 扫描在/etc/mstab文件里 , 有加入quota设置的分区。

    • -c : 每个启用的配额文件系统都应该创建配额文件 , 创建新的数据库文件。

    • -d : 详细显示指令执行过程 , 便于排错或了解程序执行的情形。

    • -g : 扫描磁盘空间时 , 计算每个群组识别码所占用的目录和文件数目。

    • -R : 排除根目录所在的分区。

    • -u : 扫描磁盘空间时 , 计算每个用户识别码所占用的目录和文件数目。

    • -v : 显示指令执行过程。

示例:

quotacheck -cug /home

这个命令会直接在对应挂载目录下面创建两个数据库文件:quota.user,quota.group.分别是用户 , 组的配额数据库文件 , 运行这个命令需要关闭selinux

2.3 启用/关闭数据库

这一步会直接开启对应的用户 , 组的配额功能 , 一般使用quotaon命令 , 同时关闭磁盘分区的命令为 , quotaoff

  • 语法: quotaon [options] filesystem

  • OPTIONS

    • -a : 开启在/ect/mstab文件里 , 有加入quota设置的分区的空间限制。

    • -g : 开启群组的磁盘空间限制。

    • -u : 开启用户的磁盘空间限制。

    • -v : 显示指令指令执行过程。

    • -f : 执行swapoff 功能 , 关闭对应配额功能。(这个选项只适用于quotaon)

    • -p : 打印对应文件系统的配额状态。

示例:

[root@localhost mnt]# quotaon -a
[root@localhost mnt]# quotaon -p  /mnt
group quota on /mnt (/dev/sdb1) is on
user quota on /mnt (/dev/sdb1) is on
[root@localhost mnt]# quotaon -f /mnt 
[root@localhost mnt]# quotaon -p  /mnt
group quota on /mnt (/dev/sdb1) is off
user quota on /mnt (/dev/sdb1) is off
[root@localhost mnt]# quotaon -u /mnt
[root@localhost mnt]# quotaon -p  /mnt
group quota on /mnt (/dev/sdb1) is off
user quota on /mnt (/dev/sdb1) is on
[root@localhost mnt]# quotaon -fv   /mnt
/dev/sdb1 [/mnt]: group quotas turned off
/dev/sdb1 [/mnt]: user quotas turned off
​

2.4 指定用户的空间限制

指定用户空间时 , 可以限定用户使用空间的大小 , 以及inode的数量(inode表示文件数量)

  • 语法: edquota [OPTIONS]

  • options:

    • -u : 设置用户的quota , 这是默认参数。

    • -g : 设置群组的quota。

    • -p<源用户名称> : 将源用户的quota设置套用至其他用户或群组。

    • -t : 设置宽限期限。

    • -f, --filesystem filesystem :显示指定目录的配额

使用这个命令之后 , 系统会直接跳转至vim 界面 , 如下图所示:

edquota

  • soft :超过这个值之后,会提出报警 , 用户此时无法再添加对应目录中添加数据。

  • hard : 禁止超过这个值

对于占用空间的基础单位为K

edquota -t :修改的是宽容时间。超过hard值之后 , 会保持数据的时间 , 在这段时间之类 , 无法增加数据 , 只能减少数据 , 如果超过这个时间 , 用户就无法对这个目录再进行任何读写操作

edquota_t

edquota -p xiong wang : 将xiong的磁盘配额配置复制给 wang用户

2.5 测试

可以通过dd命令进行测试

[xiong@localhost mnt]$ dd if=/dev/zero of=f3 bs=1M count=350
sdb1: warning, user block quota exceeded.
350+0 records in
350+0 records out
367001600 bytes (367 MB) copied, 1.71657 s, 214 MB/s
​

完整配置流程:

  1. 挂载选项

    # /etc/fstab 添加挂载选项
    /dev/sdb1  /home  ext4  defaults,usrquota,grpquota  0  2
    ​
    # 重新挂载生效(无需重启)
    mount -o remount /home
    ​
    # 验证
    mount | grep home
    # /dev/sdb1 on /home type ext4 (rw,relatime,usrquota,grpquota)
  2. 创建配额数据库

    # -c 创建  -u 用户配额  -g 组配额  -m 不强制只读重挂载
    quotacheck -cug /home
    ​
    # 生成两个文件(位于文件系统根目录)
    ls -l /home/aquota.*
    # -rw------- 1 root root aquota.group
    # -rw------- 1 root root aquota.user
  3. 启用配额数据库

    quotaon -v /home
    # /dev/sdb1 [/home]: user quotas turned on
    # /dev/sdb1 [/home]: group quotas turned on
  4. 设置配额

    # 方式 A:交互编辑(调起 vi)
    edquota -u alice
    ​
    # 方式 B:命令行直设(脚本推荐)
    setquota -u alice 204800 256000 2000 3000 /home
    #                    │软空间  │硬空间   │软文件数 │硬文件数
    # 即:空间 soft=200MB hard=250MB,文件数 soft=2000 hard=3000
    ​
    # 方式 C:批量复制模板
    edquota -p alice bob carol    # 把 alice 的配额复制给 bob、carol
  5. 设置宽限期

    edquota -t
    # 编辑界面修改 block grace / inode grace,格式支持 sec/min/hour/day/week
    ​
    # 或命令行(单位:秒)
    setquota -t 604800 604800 /home    # 7天
  6. 验证

    quota -vs alice
    # Disk quotas for user alice (uid 1001):
    #      Filesystem   space   quota   limit   grace   files   quota   limit   grace
    #       /dev/sdb1    105M    200M    250M            1245    2000    3000
    ​
    repquota -s /home

3 其他quota命令

3.1 quota

quota :显示磁盘使用和限制

  • 语法: quota [OPTIONS] [-u user | -g group]

    • -g : 列出群组的磁盘空间限制。

    • -q : 简明列表 , 只列出超过限制的部分。

    • -u : 列出用户的磁盘空间限制。

    • -v : 显示该用户或群组 , 在所有挂入系统的存储设备的空间限制。

    • -V : 显示版本信息。

如果后面不加用户 , 则默认显示的是当前运行该命令的用户。

[root@localhost mnt]# quota -usv  xiong
Disk quotas for user xiong (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1       0    293M    391M               0       8      10        
[root@localhost mnt]# quota -us  xiong
Disk quotas for user xiong (uid 500): none
[root@localhost mnt]# quota -uvsq  xiong
Disk quotas for user xiong (uid 500): 
    Block limit reached on /dev/sdb1
​

输出列含义:

Filesystem  blocks(当前用量)  soft  hard  grace  files(当前)  soft  hard  grace
  • * 号标记 : 已超限(超出 soft 或 hard)

  • grace 列显示剩余宽限时间 , 如 6days

3.2 repquota

repoquota : 用于检查磁盘空间限制的状态。

  • 语法:

    repquota [options] filesystem
    repquota -a [opions]

    filesystem 与-a选项不能同时存在

  • OPTIONS

    • -a : 报告所有可以在/etc/mtab文件中可以读到的设置里配额的选项

    • -g : 列出所有群组的磁盘空间限制。

    • -u : 列出所有用户的磁盘空间限制。

    • -v : 显示该用户或群组的所有空间限制。

    • -s : 显示的数值以可读单位显示

示例:

[root@localhost mnt]#  repquota -vusp  /mnt
*** Report for user quotas on device /dev/sdb1
Block grace time: 00:01; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      20       0       0      0       3     0     0      0
xiong     +-    391M    293M    391M 1538636758       1     8    10      0
​
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 2
Used average: 2.000000
​

3.3 setquota

使用非交互的方式设置磁盘配额

  • 语法:

    setquota [OPTIONS]  -a | filesystem
    setquota  [  -rm  ]  [  -u | -g ] [ -F quotaformat ] name block-softlimit block-hardlimit inode-softlimit inode-hardlimit -a | filesystem...

  • OPTIONS :

    • -u : 设置用户的quota , 这是默认参数。

    • -g : 设置群组的quota。

    • -p<源用户名称> : 将源用户的quota设置套用至其他用户或群组。

    • -t : 设置用户 , 组的宽限期限。

    • -T :超过限制之后 , 设置特定用户 , 组的宽限期限。

[root@localhost mnt]# setquota -u wang   300000 400000 3 10 /dev/sdb1
[root@localhost mnt]# quota -vu  wang
Disk quotas for user wang (uid 501): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1       0  300000  400000               0       3      10        
[root@localhost mnt]# setquota -u wang  -p xiong /dev/sdb1
[root@localhost mnt]# quota -vu  wang
Disk quotas for user wang (uid 501): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1       0  300000  400000               0       8      10    
      
[root@localhost mnt]# setquota  -u -t  700 700 /mnt 
[root@localhost mnt]# repquota -ausv
*** Report for user quotas on device /dev/sdb1
Block grace time: 00:12; Inode grace time: 00:12
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      20       0       0              3     0     0       
xiong     +-    391M    293M    391M   none       1     8    10       
wang      --       0    293M    391M              0     8    10       
​
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 3
Used average: 3.000000
​
​
[root@localhost mnt]# setquota -T xiong 800  0  /mnt 
setquota: Not setting inode grace time on /dev/sdb1 because softlimit is not exceeded.
[root@localhost mnt]# repquota -auvs
*** Report for user quotas on device /dev/sdb1
Block grace time: 00:12; Inode grace time: 00:12
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      20       0       0              3     0     0       
xiong     +-    391M    293M    391M  00:13       1     8    10       
wang      --       0    293M    391M              0     8    10       
​
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 3
Used average: 3.000000
​

4. XFS 配额的差异(重要)

XFS 不走 aquota 数据库 , 由文件系统内部记账 , 用专属工具 xfs_quota:

# 挂载选项不同(fstab)
/dev/sdb1  /data  xfs  defaults,uquota,gquota  0 0
# 只统计不限制用 uqnoenforce/gqnoenforce
​
# 无需 quotacheck、quotaon(XFS 自动记账)
# 设置配额用 xfs_quota
xfs_quota -x -c 'limit bsoft=1g bhard=2g alice' /data
xfs_quota -x -c 'limit isoft=1000 ihard=2000 alice' /data
xfs_quota -x -c 'timer -b 7d' /data              # 宽限期
xfs_quota -x -c 'report -ubh' /data              # 报告
​
# 查看
xfs_quota -x -c 'quota -u alice' /data


参考链接

51CTO:Linux中磁盘配额的设置

熊熊