Ext4 开启 project quota

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>
上一篇:元心科技加入,龙蜥社区迎来国内领先的智能移动OS厂商


下一篇:福建升腾资讯加入龙蜥社区,共建新型信息基础设施体系