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