所以 Linux 配额系统的所有教程和文档都让我感到困惑。对于每个启用/开启配额的文件系统,实际配额信息存储在哪里?是文件系统元数据还是在文件中?
假设用户 foo 在 /home 上创建了一个新文件。内核如何确定用户 foo 是否低于其硬限制?内核是否每次都要统计文件系统上的配额信息,还是将其存储在超级块或其他地方?
据我所知,内核会查阅 aquota.user 文件以了解实际规则,但当前配额使用情况数据存储在哪里?可以使用 repquota 等工具以外的任何工具查看吗?TIA!!
更新:
谢谢你的帮助。我已经读过那个 mini-HOWTO。我很清楚用户空间工具的使用方法。我不清楚的是使用数据是否也位于存储每个用户限制的文件中,而你的回答是肯定的。
据我所知,rc.sysinit 在启动时运行了quotacheck 和quotaon。quotacheck 程序会分析文件系统,更新 aquota.* 文件。然后,它使用quota.h 和quotactl() 系统调用将配额信息通知给内核。
从此时起,内核会散列该信息,并在发生变化时增加/减少配额统计信息。关机时,init.d/halt 脚本会在文件系统卸载之前立即运行quotaoff 命令。quotaoff 命令似乎不会使用内核内存中的信息更新 aquota.* 文件。我这样说是因为 aquota.user 文件的 {a,c,m}times 仅在系统重新启动或手动运行quotacheck 命令时更新。据我所知,内核似乎只是在关机时将其最新的使用数据丢弃在地上。此信息从未用于更新 aquota.* 文件。它们在启动期间由quotacheck(rc.sysinit) 更新。这对我来说似乎很愚蠢,因为内核已经收集了更新的信息。所以...总之,我仍然不完全清楚这些方法。;)
答案1
对于每个启用/打开配额的文件系统,实际配额信息存储在哪里?
例如参见quoteon 手册页. 文件系统根目录中会有名为 .quota* 的文件,其中包含必要的信息(.quota.user、.quota.group、.quota.ops.user、.quota.ops.group)。
假设用户 foo 在 /home 上创建了一个新文件。内核如何确定用户 foo 是否低于其硬限制?内核是否每次都要统计文件系统上的配额信息,还是将其存储在超级块或其他地方?
否,内核会持续跟踪文件系统使用情况,因此它不需要在每次分配时重新计算(这会非常昂贵)。启用配额后,它将进行一次计算,然后更新。初始计算由配额检查。
据我所知,内核会查阅 aquota.user 文件以了解实际规则,但当前配额使用情况数据存储在哪里?可以使用 repquota 等工具以外的任何工具查看吗?TIA!!
配额信息存储在 .quota* 中(见上文)。除了 repquota 之外,我不知道还有什么工具可以生成配额使用情况报告。但您应该能够使用/编写 repquota 脚本生成大多数报告。或者您必须破解源代码...
顺便提一句:
这配额迷你指南对 Linux 配额系统进行了很好的概述。虽然有点过时,但基本原理并没有太大变化。
答案2
通过阅读您的更新,您似乎想知道为什么内核的所有配额信息都会在机器关闭时被丢弃而不是写入 aquota.* 文件。
好吧,内核不会动态更新文件,因为这会浪费大量时间。基本上,一旦启用配额,内核就会跟踪使用情况,以防达到软/硬限制并且必须执行某些操作,这意味着每次它必须为系统上的任何用户/组分配任何 fs 块时,它都会跟踪这一点。如果它在尝试分配 fs 块时必须更新 aquota.* 文件,您可以看到这最终会在中等繁忙的系统上导致问题,这是没有必要的,因为内核会为您监视这一点,并会为您记录任何违规行为,因此您知道要运行配额检查。即使是配额计算也可能导致问题,这就是为什么您有可调的 sysctl - dquot-max - 和报告 sysctl - dquot-nr - 更多信息可以在这里看到:
http://www.mjmwired.net/kernel/Documentation/sysctl/fs.txt
至于在 init 进程中而不是在 halt 进程中放置配额检查,这完全取决于时间和你如何看待事物。通常,当你停止服务器时,你希望它快速关闭。不要花大量时间统计配额,我们更习惯于 init 花费更长时间。此外,将此过程视为 init 在系统启动时设置初始配额计数,而不是在关闭时进行清理。如果 FS 安装在另一个未启用配额的系统上,然后正常重新启动,你会想知道每次从哪里开始,因为每次停止后你都要初始化,所以它就是在那里设置的。
希望有所帮助。