quota 介绍
project quota 介绍
quota 子系统用于限制磁盘的使用量。
从限制的主体进行分类,quota 包含 user quota、group quota 与 project quota 三部分。顾名思义,user quota、group quota 限制的主体分别是 user、user group,而 project quota 限制的主体则是 project id。当一个目录下的所有子目录和文件拥有相同的 project id 时,就可以限制一个目录下总的磁盘使用量。
quota 子系统其实是一项“古老”的特性,user quota 与 group quota 早在 Linux v2.6 就开始支持,而 project quota 则来得相对晚一些。project quota 特性最初来源于 XFS,Linux v4.5 开始 ext4 才正式支持 project quota。
quota 配额
quota 从限制的对象进行分类,包括 block quota 与 inode quota 两部分。
限制的类型又包含 softlimit 与 hardlimit 两类,其中 hardlimit 是不可超越的,即 inode/block 分配过程中若当前占用的 inode/block 数量超过 hardlimit,那么分配过程就会失败。
softlimit 是可以暂时超越的,inode/block 分配过程中若当前占用的 inode/block 数量超过 softlimit 但是尚未超过 hardlimit,那么只会打印 warnning 信息,但是分配过程并不会失败。
但是系统不能长时间超过 softlimit,系统可以超过 softlimit 的最长时间称为 grace time,在第一次超过 softlimit 的时候开始计时,在 grace time 时间以内,尽管当前占用的 inode/block 数量超过 softlimit,但是分配过程不会失败;而如果 grace time 时间以后,当前占用的 inode/block 数量仍然没有降到 softlimit 以下,此时分配过程就会失败。
grace time 参数是 filesystem wide 统一的,即同一个文件系统(磁盘分区)共用同一份 grace time 参数。
注意
测试的时候,root 用户具有 CAP_SYS_RESOURCE 权限,因而不受 hardlimit 限制。
使用步骤
1 格式化文件系统
mkfs 格式化文件系统时打开 "project,quota" 特性:
mkfs.ext4 -O project,quota <device>
或者对现有的文件系统打开 "project,quota" 特性:
tune2fs -O project,quota <device>
2 开启/关闭 prjquota 限制
quota 子系统实际上实现有两种功能:
1) accounting,即统计各个 project id 分组的 inode/block 使用量;
2) limit,即在 accounting 的基础上,对各个 project id 分组的 inode/block 使用量上限进行限制。
格式化文件系统时打开 "project,quota" 特性,实际上只是开启 accounting 功能,使用默认参数挂载文件系统时,只是开启 accounting 功能,limit 功能并没有开启。此时需要使用 quotaon 手动开启 limit 功能,或者使用 prjquota 挂载参数自动开启 limit 功能。
2.1 查看 quota 状态
使用 quotaon -Ppv 来查看文件系统 accounting/limit 这两种功能的开启情况。
例如在 limit 功能开启前:
# print quota state
quotaon -Ppv <mntpoint>
输出如下:
project quota on /mnt (/dev/vdb) is on (accounting)
表示 accounting on, limit off。
使用 quotaon 手动开启 limit 功能:
# turning quota on
quotaon -P <mntpoint>
此时 quota 的状态变为:
# print quota state
quotaon -Ppv <mntpoint>
输出如下:
project quota on /mnt (/dev/vdb) is on (enforced)
表示 accounting on, limit on。
2.2 quotaon 开启
使用默认参数挂载文件系统时,只是开启 accounting 功能,limit 功能并没有开启,需要通过 quotaon 手动开启:
quotaon -P <mntpoint>
2.3 prjquota 挂载参数开启
使用 "prjquota" 参数挂载文件系统时,默认自动打开 project quota 限制功能。
mount -o prjquota <device> <mntpoint>
2.4 quotaoff 关闭
使用 quotaoff 关闭 project quota 限制功能。
quotaoff -P <mntpoint>
3 project id
3.1 设置 project id
使用 chattr -p 设置文件或目录的 project id
chattr -p <projectid> <file|directory>
但是此时在目录下创建的子文件或子目录并不会继承父目录的 project id,需要使用 chattr +P 开启目录的继承 project id 的特性:
chattr +P <file|directory>
或者直接使用以下命令同时设置 project id 和开启继承特性:
chattr +P -p <projectid> <file|directory>
3.2 查看 project id
使用 lsattr -p 获取文件的 projec id:
lsattr -p
4 prjquota 配额
4.1 edquota 设置配额
使用 edquota 设置特定 project id 的配额:
edquota -P -f <mntpoint> <projectid>
执行 edquota 命令会进入一个 vim 界面,此时用户可以设置 inode/block 的 soft/hard limit。
例如:
edquota -P -f /dev/vdb 124
输出如下:
Disk quotas for project 124 (pid 124):
Filesystem blocks soft hard inodes soft hard
/dev/vdb 4 0 0 2 0 0 0 0 0 0 0 0
4.2 setquota 设置配额
也可以使用 setquota 设置特定 project id 的配额:
setquota -P <projectid> <block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit> <mntpoint>
4.3 repquota 查看配额
使用 repquota 查看所有 project id 的配额:
repquota -P <mntpoint>