磁盘配额设置
目录下统计磁盘用量
法一 使用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
文件来决定哪些文件系统需要使用quotasudo 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.group
与aquota.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.group
与aquota.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_v1
和 quota_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