磁盘配额设置

目录下统计磁盘用量

法一 使用duc (推荐)

仅能统计磁盘大小, 不能统计文件数目. 是按照子文件夹来统计, 而不是文件归属的用户来统计.

sudo apt install duc # install duc
sudo duc index -fHpx <dir> # build the index of any <dir> to a dataset file $HOME/.duc.db
# it which will be upated every time when things under <dir> change
sudo duc ls -Fg <dir> # list the subdirs and their size of <dir>, No wait times

法二 使用quota

使用quota, 只统计每个用户的磁盘大小和文件数目用量, 不用限制用户的使用.

可以按文件归属的用户来统计, 也可以按照子文件夹来统计.

quota安装与配置

本文在此教程上修改. 其他参考: 鸟哥.

安装quota

sudo apt update
sudo apt install quota -y
sudo quota --version

安装配额内核模块

确认是否安装配额内核模块

find /lib/modules/`uname -r` -type f -name '*quota_v*.ko*'

若返回

/lib/modules/4.15.0-88-generic/kernel/fs/quota/quota_v2.ko
/lib/modules/4.15.0-88-generic/kernel/fs/quota/quota_v1.ko

则此两模块已安装额内核模块; 若返回为空, 则未安装 (通常云服务器由此物体), 需要手动安装

sudo apt install linux-image-extra-virtual -y

而后再次执行

find /lib/modules/`uname -r` -type f -name '*quota_v*.ko*'

确认已安装额内核模块.

更新文件系统挂载选项

  • 通过修改 /etc/fstab 文件来决定哪些文件系统需要使用quota

    sudo vim /etc/fstab, 找到需要的文件系统 (如/) 所在行, 第四字段尾部增加,usrquota,grpquota选项, 这样会对此文件系统启用对用户和用户组的限额.

    例如:

    /dev/mapper/jungpu21--vg-root /               ext4    errors=remount-ro,usrquota,grpquota 0       1

    /dev/mapper/jungpu21--vg-root /               ext4    defaults,usrquota,grpquota 0       1

    注:

    • 查看文件系统的格式 df -T -h, -T 显示文件系统, -h 可读的磁盘大小
    • 第四字段若为defaults, 表示所有选项全部使用默认配置, 包括rw, suid, dev, exec, auto, nouser, 和 async。一般用户没有特殊需求,直接使用 defaults 就可以了
    • /etc/fstab 中已有不同于defaults的选项, 把,usrquota,grpquota加在已有的选项后即可
  • 重新挂载文件系统,以使更改生效

    sudo mount -o remount /
  • 验证quota选项生效

    sudo cat /proc/mounts | grep ' / '

    若返回如下则继续

/dev/mapper/jungpu21--vg-root / ext4 rw,relatime,quota,usrquota,grpquota,errors=remount-ro,data=ordered 0 0

启用quota程序

  • 创建配额文件

    sudo quotacheck -ugm /

    该命令将在/创建 aquota.groupaquota.user 文件,即配额用户和配额组,它们具有有关文件系统的限制和使用情况的信息。 在开始使用配额之前,这些文件必须存在。

    • -u :表示将创建基于用户的配额文件。
    • -g :表示将创建基于组的配额文件。
    • -m: disables remounting of the file system as a read-only while at the same time gives accurate results in an environment where the user keeps saving files. 在安装过程中此选项不是必需的。

    确认已创建 aquota.groupaquota.user 文件.

    ls $mount_point | grep aquota
  • 启用quota程序

    sudo quotaon -v /

    若显示如下则成功

    /dev/sda4 [/]: group quotas turned on
    /dev/sda4 [/]: user quotas turned on

单个用户的配额

  • 非交互设置配额

    sudo setquota -u <用户名> <soft-block-limit> <hard-block-limit> <soft-index-limit> <hard-block-limit> /
    sudo setquota -g <用户组名> <soft-block-limit> <hard-block-limit> <soft-index-limit> <hard-block-limit> /
    • <soft-block-limit> : 磁盘大小软限制, 单位1kB, 可写成 12321 (12321kB), 12M (12MB), 12G, 12T (1024升位)
    • <hard-block-limit> : 磁盘大小硬限制, 写法同<soft-block-limit>
    • <soft-index-limit>: 文件数目软限制, 单位1个文件, 可写成 12121 (12121个文件), 12k (12,000个文件), 12M, 12G, 12T (1000升位)
    • <hard-index-limit>: 文件数目硬限制, 写法同<soft-index-limit>

    当用户超过

    • 软限制: 在宽限期 (grace) 内仍然可继续写入文件, 但向此用户发警告; 超过宽限期, 则不得继续写入并报错.

    • 硬限制: 不得继续写入并报错如下.

      sdb1: write failed, user block limit reached.
  • 交互设置配额

    sudo edquota -u <用户名>
    sudo edquota -g <用户组名>

    检查磁盘上的用户配额

    修改文件中的soft/hard限额, 保存退出编辑器即可.

设置宽限期

sudo setquota -t <block-grace> <index-grace> /
  • <block-grace>: 磁盘大小配额的宽限期, 单位必须为秒, 写成例如 864000 , 即10天.
  • <index-grace> : 文件数目配额的宽限期, 写法如上.

查看配额

查看单个用户/用户组

sudo quota -vs <用户名>
sudo quota -vsg <用户组名>
  • -s : 人类可读的数字格式
  • -v : verbose

验证用户配额限制

查看所有用户/用户组

sudo repquota -s /
sudo repquota -sg /

生成配额报告

常见错误消息

quotaon: cannot find //aquota.group on /dev/vda1 [/]

quotaon: cannot find //aquota.group on /dev/vda1 [/]
quotaon: cannot find //aquota.user on /dev/vda1 [/]

如果您尝试使用命令qoutaon打开配额,然后再尝试使用命令 sudo quotacheck -ugm / 检查配额的状态

quotaon: Quota format not supported in kernel

quotaon: using //aquota.group on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.
quotaon: using //aquota.user on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.

此错误告诉管理员内核不支持 quota_v1quota_v2 ,或者您在计算机上的版本可能不正确。 对于Ubuntu而言 ,此类错误在基于云的虚拟服务器上很常见。通过sudo apt install linux-image-extra-virtual -y来修复错误。

更多参考:

https://askubuntu.com/questions/109585/quota-format-not-supported-in-kernel

https://serverfault.com/questions/843994/ubuntu-quota-format-not-supported-in-kernel

quota: Cannot open quotafile //aquota.user: Permission denied

quota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //quota.user: No such file or directory

当当前用户没有读取配额文件的权限时,该错误将很明显。使用 sudo即可避免此错误。

测试quota有效

测试quota有效

# 创建用户组 quota, 其下有 用户quser1, 用户 quser2
sudo groupadd quota
sudo useradd -m -g quota quser1
sudo useradd -m -g quota quser2
sudo passwd quser1
sudo passwd quser2

# 为用户添加限额
sudo setquota -u quser1 200M 220M 0 0 /
sudo setquota -u quser2 200M 220M 0 0 /
sudo setquota -g quota 300M 320M 0 0 /

# 显示配额
sudo quota -vs  quser1
sudo quota -vs  quser2
sudo setquota -vsg quota

登录 quser1

# 在当前目录下会生成一个190MB的test文件,文件内容为全0
dd if=/dev/zero of=test bs=1M count=190 # 未超过软限额, 不报错
dd if=/dev/zero of=test bs=1M count=210 # 超过软限额, 未超过硬限额, 也不报错
dd if=/dev/zero of=test bs=1M count=230 # 超过硬限额, 报错如下, 并test只写入了220M
sdb1: write failed, user block limit reached.

超过软quota发送警告

法一: 通过邮件给用户发送警告, 参考: warnquota.

法二: 定时发送到用户的终端上, 使用我开发的此工具, 参见readme.

Project quota

不同于限制用户/用户组的磁盘使用, 将文件夹及其下文件, 设置为从属于一个项目, 对项目限制磁盘使用. 参考: project quota