磁盘配额是什么,Linux磁盘配额简介(新手必看)
在 Linux 服务器环境中,通常多用户的使用场景居多。在多用户的使用场景下,如果我们不对用户可用空间进行限制,就会出现少量用户占用大量分区资源的情况,这会影响其他用户正常使用分区空间。
以之前安装系统时的分区方式为例,我们划分了根(/)分区、/boot 分区、swap 分区。假设系统中存在超级用户 root 和普通用户 user1,现在两个用户分别在自己的家目录中写入数据:
两个用户的家目录虽然不同,但是它们同样属于根分区,写入数据同样需要占用根分区的 inode 和 block。
假设安装系统后,根分区有 15GB 空间可用,user1 用户在自己的家目录中保存了 14GB 的数据,那么根分区剩余 1GB 空间可用。此时,root 用户将无法在根分区中写入大于 1GB 的文件。很明显,作为一个多用户的操作系统,如果不对用户可用分区的 inode 和 block 进行限制,就极易出现上述情况。
磁盘配额(Quota)是指在某分区或目录中,可以用来限制普通用户(user)或组(group)占用的磁盘空间大小或文件数量。在这个概念中,我们需要强调以下几个重点:
Rocky Linux 9.x 版本的 Linux 系统默认支持磁盘配额,不需要进行任何修改。可以查看内核配置文件,确认系统是否支持磁盘配额,命令如下:
通过统计分区中所有以某用户为所有者的文件,并将所有文件所占空间相加,最终得到某用户在分区中占用 block 情况(通常对 block 占用情况使用 KB、MB、GB 等单位进行表示)。
通过统计分区中所有以某组为所属组的文件,并将所有文件占用空间相加,最终得到某组在分区中 block 占用情况(通常对 block 占用情况使用 KB、MB、GB 等单位进行表示)。
其与用户配额的不同点在于,组内可能存在多个成员。需要注意的是,组内成员共享组内创建的文件数量和分区空间。也就是说,只要用户以组身份创建文件,就会占用组配额。
举例来说,如果用户 user1、user2 和 user3 都属于 tg 组,给 tg 组分配 100MB 的磁盘空间,那么只要有用户使用 tg 组身份创建文件,就会消耗组配额中的空间。如果分区中所有 tg 组的文件大小总计达到 100MB,其余用户就无法使用 tg 组身份在分区中继续写入数据。
如果某用户既设置了用户配额又设置了组配额,那么在这种情况下并不存在优先级问题,而是先达到最大限制的先生效。举例来说,假设用户 user1 初始组为 user1 组,user1 用户设置分区中可写入 10 个文件,user1 组设置分区中可写入 20 个文件,在这种情况下,用户创建 10 个文件时就达到了用户限制值,无法继续创建新文件。
在目录配额限制下,任何用户,包括超级用户写入的数据都计算在目录配额限制内。
注意,xfs_quota 命令在 man 帮助中解释了带有 realtime 功能的文件系统尚未实现配额警告机制。简单来说,就是超出软限制后不发出提示信息(当前使用的 Rocky Linux 9.x 系统中,默认 XFS 文件系统是带有 realtime 的文件系统)。
使用硬限制可以限制用户在分区中可创建的文件数量(对应 inode 限制)和占用的空间大小(对应 block 限制)。硬限制是一个不可超出的数值。
如果用户 inode 或 block 达到了软限制,就被认为满足警告条件。在后续使用过程中每超出 1 次软限制,警告次数就加 1 次,默认警告最大值是 5 次,即用户受到 5 次警告后,即便没有达到硬限制,也会禁止其继续使用分区 inode 或 block(在 Rocky Linux 9.4 版本中,警告次数功能暂未启用)。
也就是说,如果软限制是 100MB,硬限制是 200MB,宽限时间是 7 天,此时用户占用了 120MB,那么今后 7 天用户每次登录时都会出现磁盘将满的警告。如果用户置之不理,7 天后用户的硬限制就会变成 100MB,而不是 200MB。
以之前安装系统时的分区方式为例,我们划分了根(/)分区、/boot 分区、swap 分区。假设系统中存在超级用户 root 和普通用户 user1,现在两个用户分别在自己的家目录中写入数据:
- root 用户的家目录在 /root/ 中;
- 普通用户的家目录在 /home/user1/ 中。
两个用户的家目录虽然不同,但是它们同样属于根分区,写入数据同样需要占用根分区的 inode 和 block。
假设安装系统后,根分区有 15GB 空间可用,user1 用户在自己的家目录中保存了 14GB 的数据,那么根分区剩余 1GB 空间可用。此时,root 用户将无法在根分区中写入大于 1GB 的文件。很明显,作为一个多用户的操作系统,如果不对用户可用分区的 inode 和 block 进行限制,就极易出现上述情况。
磁盘配额(Quota)是指在某分区或目录中,可以用来限制普通用户(user)或组(group)占用的磁盘空间大小或文件数量。在这个概念中,我们需要强调以下几个重点:
- 在 ext 文件系统(CentOS 6.x 以前的版本)中,磁盘配额只能限制在整个分区中用户使用的磁盘空间大小与文件数量,而不能限制某个目录占用的空间大小;而在 XFS 文件系统(Rocky Linux 9.0 中的默认文件系统)中,磁盘配额功能增强了,不仅可以限制整个分区,也能限制分区中某个目录使用的磁盘空间大小和文件数量;
- 磁盘配额针对分区进行限制,其限制的是用户在分区中占用的空间大小和文件数量,限制的主体是用户或组。这时只有普通用户会被限制,超级用户不会被限制;
- 磁盘配额能够限制用户/组占用分区的空间大小(对应 block 限制),当然也能限制用户/组允许占用分区的文件数量(对应 inode 限制);
- 可以针对目录做配额限制,限制的是目录及其子文件、子目录在本分区中占用的空间大小和创建的文件数量。因为限制的主体是目录,所以无论是超级用户还是普通用户,在目录中创建的文件大小和创建的文件数量都受目录配额限制;
- 当前的 Rocky Linux 9.0 操作系统默认使用 XFS 文件系统,其中增加了警告次数的限制,如果用户创建文件超出了警告次数的限制,那么也会禁止用户继续使用分区资源;
- 通常在表示用户或组磁盘配额时,应以分区为单位,也就是说,某用户在某分区中可以创建的文件数量是多少,或者某用户在某分区中可以使用的空间大小是多少。以整个操作系统为单位进行描述是不清晰的,因为不能具体表达某用户在具体某分区中能够创建的文件数量和能够占用的分区空间大小。
Rocky Linux 9.x 版本的 Linux 系统默认支持磁盘配额,不需要进行任何修改。可以查看内核配置文件,确认系统是否支持磁盘配额,命令如下:
[root@localhost~]# grep "CONFIG_QUOTA" \ /boot/config-5.14.0-70.13.1.el9_0.x86_64 CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y CONFIG_QUOTACTL=y可以看到,内核已经支持磁盘配额。如果内核不支持,就需要重新编译内核,加入 quota supper 功能。
Linux磁盘配额中的常见概念
1) 用户配额
用户配额是指以用户为限制主体,统计分区中有多少以某用户为所有者的文件,来确定某用户在分区中占用的 inode 数量。通过统计分区中所有以某用户为所有者的文件,并将所有文件所占空间相加,最终得到某用户在分区中占用 block 情况(通常对 block 占用情况使用 KB、MB、GB 等单位进行表示)。
2) 组配额
组配额是指以组为限制主体,统计分区中有多少以某组为所属组的文件,来确定某组在分区中占用的 inode 数量。通过统计分区中所有以某组为所属组的文件,并将所有文件占用空间相加,最终得到某组在分区中 block 占用情况(通常对 block 占用情况使用 KB、MB、GB 等单位进行表示)。
其与用户配额的不同点在于,组内可能存在多个成员。需要注意的是,组内成员共享组内创建的文件数量和分区空间。也就是说,只要用户以组身份创建文件,就会占用组配额。
举例来说,如果用户 user1、user2 和 user3 都属于 tg 组,给 tg 组分配 100MB 的磁盘空间,那么只要有用户使用 tg 组身份创建文件,就会消耗组配额中的空间。如果分区中所有 tg 组的文件大小总计达到 100MB,其余用户就无法使用 tg 组身份在分区中继续写入数据。
如果某用户既设置了用户配额又设置了组配额,那么在这种情况下并不存在优先级问题,而是先达到最大限制的先生效。举例来说,假设用户 user1 初始组为 user1 组,user1 用户设置分区中可写入 10 个文件,user1 组设置分区中可写入 20 个文件,在这种情况下,用户创建 10 个文件时就达到了用户限制值,无法继续创建新文件。
3) 分区空间限制
在用户配额和组配额中,我们反复提到了一个概念——文件占用分区空间。在分区文件系统中,我们限制了用户或组可用的 block 块数量,这就相当于限制了用户或组在分区中的可用空间。4) 分区文件数量限制
在用户配额和组配额中,我们还反复提到了一个概念——文件数量。在分区文件系统中,我们限制了用户或组可用的 inode 数量,这就相当于限制了用户或组在分区中能够创建的文件数量。5) 目录配额
目录配额指的是分区中以某个目录为限制主体,可以限制目录使用的 inode 和 block,即递归式统计目录及在目录下的所有子文件子目录在分区文件系统中创建的文件数量(对应 inode 限制)和目录下文件所占的分区空间(对应 block 限制)。在目录配额限制下,任何用户,包括超级用户写入的数据都计算在目录配额限制内。
6) 软限制
软限制可以理解为警告限制,在超出软限制后用户会收到提示信息。但此时我们的文件创建或数据写入是能够正常保存的,我们应该立即停止数据写入或新文件的创建,考虑是否应该删除某些文件来释放可用空间,或者联系 root 用户来调整限制值。注意,xfs_quota 命令在 man 帮助中解释了带有 realtime 功能的文件系统尚未实现配额警告机制。简单来说,就是超出软限制后不发出提示信息(当前使用的 Rocky Linux 9.x 系统中,默认 XFS 文件系统是带有 realtime 的文件系统)。
7) 硬限制
既然软限制超出后会进行提示,那么用户到底能在分区中创建多少个文件,以及会占用多少分区空间呢?使用硬限制可以限制用户在分区中可创建的文件数量(对应 inode 限制)和占用的空间大小(对应 block 限制)。硬限制是一个不可超出的数值。
8) 警告次数
在当前的 Rocky Linux 9.0 系统中,使用了警告次数的概念。如果用户 inode 或 block 达到了软限制,就被认为满足警告条件。在后续使用过程中每超出 1 次软限制,警告次数就加 1 次,默认警告最大值是 5 次,即用户受到 5 次警告后,即便没有达到硬限制,也会禁止其继续使用分区 inode 或 block(在 Rocky Linux 9.4 版本中,警告次数功能暂未启用)。
9) 宽限时间
如果用户的 inode 或 block 超出软限制,系统就会在用户登录时警告用户磁盘将满。但是这个警告不会一直进行,而是默认有 7 天的时间限制,这被称为宽限时间。如果宽限时间用尽,并且用户的 inode 或 block 占用仍然超过软限制,那么软限制就会升级为硬限制。也就是说,如果软限制是 100MB,硬限制是 200MB,宽限时间是 7 天,此时用户占用了 120MB,那么今后 7 天用户每次登录时都会出现磁盘将满的警告。如果用户置之不理,7 天后用户的硬限制就会变成 100MB,而不是 200MB。