配额子系统¶
配额子系统允许系统管理员为用户和/或组设置已用空间和已用 inode 数量的限制(inode 是一种文件系统结构,与每个文件或目录相关联)。对于已用空间和已用 inode 数量,实际上有两个限制。第一个称为软限制,第二个称为硬限制。用户永远不能超过任何资源的硬限制(除非他具有 CAP_SYS_RESOURCE 能力)。允许用户超过软限制,但只能在有限的时间内。此期限称为“宽限期”或“宽限时间”。当宽限期结束时,用户将无法分配更多空间/inode,直到他释放足够的空间/inode 以低于软限制。
配额限制(和宽限期)是为每个文件系统独立设置的。
有关配额设计的更多详细信息,请参见 quota-tools 包中的文档 (https://sourceforge.net/projects/linuxquota)。
配额 netlink 接口¶
当用户超过软限制,用完宽限期或达到硬限制时,配额子系统传统上会将消息打印到导致超出的进程的控制终端。此方法的缺点是,当用户使用图形桌面时,他通常无法看到该消息。因此,已设计配额 netlink 接口以将有关上述事件的信息传递给用户空间。在那里,它们可以被应用程序捕获并进行相应处理。
该接口使用通用 netlink 框架(有关此层的更多详细信息,请参见 https://lwn.net/Articles/208755/ 和 http://www.infradead.org/~tgr/libnl/)。配额通用 netlink 接口的名称为“VFS_DQUOT”。以下常量的定义位于 <linux/quota.h> 中。由于配额 netlink 协议不感知命名空间,因此配额 netlink 消息仅在初始网络命名空间中发送。
当前,该接口仅支持一种消息类型 QUOTA_NL_C_WARNING。此命令用于发送有关上述任何事件的通知。每个消息都有六个属性。这些是(参数的类型在括号中)
- QUOTA_NL_A_QTYPE (u32)
超过的配额类型(USRQUOTA,GRPQUOTA 之一)
- QUOTA_NL_A_EXCESS_ID (u64)
用户/组(取决于配额类型)的 UID/GID,其限制正在被超过。
- QUOTA_NL_A_CAUSED_ID (u64)
导致事件的用户的 UID
- QUOTA_NL_A_WARNING (u32)
超过了哪种限制
- QUOTA_NL_IHARDWARN
inode 硬限制
- QUOTA_NL_ISOFTLONGWARN
超过 inode 软限制的时间超过了给定的宽限期
- QUOTA_NL_ISOFTWARN
inode 软限制
- QUOTA_NL_BHARDWARN
空间(块)硬限制
- QUOTA_NL_BSOFTLONGWARN
超过空间(块)软限制的时间超过了给定的宽限期。
- QUOTA_NL_BSOFTWARN
空间(块)软限制
还定义了四个警告,用于用户停止超过某些限制的事件
- QUOTA_NL_IHARDBELOW
inode 硬限制
- QUOTA_NL_ISOFTBELOW
inode 软限制
- QUOTA_NL_BHARDBELOW
空间(块)硬限制
- QUOTA_NL_BSOFTBELOW
空间(块)软限制
- QUOTA_NL_A_DEV_MAJOR (u32)
受影响文件系统的设备主设备号
- QUOTA_NL_A_DEV_MINOR (u32)
受影响文件系统的设备次设备号