18.12. 磁盘配额

磁盘配额可以用来限制一个用户或一个组的成员在每个文件系统上可以分配的磁盘空间或文件数量。这可以防止一个用户或一组用户消耗所有的可用磁盘空间。

本节描述了如何为 UFS 文件系统配置磁盘配额。要在 ZFS 文件系统上配置配额,请参阅数据集、用户和组配额

18.12.1. 启用磁盘配额

要确定 FreeBSD 内核是否提供对磁盘配额的支持,使用:

  1. % sysctl kern.features.ufs_quota
  2. kern.features.ufs_quota: 1

在这个例子中,1 表示支持配额。如果这个值是 0 ,请在自定义的内核配置文件中加入以下一行,并按照配置 FreeBSD 内核的说明重建内核:

  1. options QUOTA

接下来,在 /etc/rc.conf 中启用磁盘配额:

  1. quota_enable="YES"

通常在启动时,每个文件系统的配额完整性由 quotacheck(8) 检查。这个程序确保配额数据库中的数据正确反映了文件系统上的数据。这是一个耗时的过程,会大大影响系统的启动时间。要跳过这个步骤,请在 /etc/rc.conf 中添加这个变量:

  1. check_quotas="NO"

最后,编辑 /etc/fstab 以在每个文件系统上启用磁盘配额。要在一个文件系统上启用每个用户的配额,在文件系统的 /etc/fstab 条目中的选项字段中添加 userquota ,以启用配额。例如:

  1. /dev/da1s2g /home ufs rw,userquota 1 2

要启用组配额,请使用 groupquota 代替。要同时启用用户和组配额,请用逗号隔开选项:

  1. /dev/da1s2g /home ufs rw,userquota,groupquota 1 2

默认情况下,配额文件以 quota.userquota.group 的形式存储在文件系统的根目录下。请参考 fstab(5) 以了解更多信息。不建议为配额文件指定其他的位置。

配置完成后,重新启动系统,/etc/rc 将自动运行适当的命令,为 /etc/fstab 中启用的所有配额创建初始配额文件。

在正常操作过程中,应该不需要手动运行quotacheck(8)quoton(8)quotaoff(8)。然而,应该阅读这些手册页面以熟悉它们的操作

18.12.2. 设置配额限制

要验证配额是否已启用,请运行:

  1. # quota -v

应该有一行关于磁盘使用情况和每个文件系统的当前配额限制的摘要,这些文件系统已启用配额。

现在,系统已经准备好用 edquota 分配配额限制。

有几个选项可用于强制限制用户或组可以分配的磁盘空间,以及他们可以创建多少文件。可以根据磁盘空间(块配额)、文件数量(节点配额)或两者的组合来限制分配。每个限制进一步细分为两类:硬限制和软限制。

硬限制是不能超过的。如果有一个用户达到了硬限制,该用户就不能再在该文件系统上进行分配。例如,如果用户在一个文件系统上的硬限制是 500 kbytes,目前正在使用 490 kbytes,用户只能再分配 10 kbytes。试图分配额外的 11kbytes 将会失败。

软限制可以在有限的时间内被超过,称为宽限期,默认情况下是一个星期。如果一个用户超过他们的限制超过宽限期,软限制变成了硬限制,不允许进一步分配。当用户回落到软限制以下时,宽限期被重置。

在下面的例子中,测试账户的配额正在被编辑。当 edquota 被调用时,由 EDITOR 指定的编辑器被打开,以便编辑配额限制。默认编辑器被设置为vi.

  1. # edquota -u test
  2. Quotas for user test:
  3. /usr: kbytes in use: 65, limits (soft = 50, hard = 75)
  4. inodes in use: 7, limits (soft = 50, hard = 60)
  5. /usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
  6. inodes in use: 0, limits (soft = 50, hard = 60)

每个启用了配额的文件系统通常有两行。一行代表块的限制,另一行代表 inode 的限制。改变数值来修改配额限制。例如,要把 /usr 的块限制提高到 500 的软限制和 600 的硬限制,改变该行的值如下:

  1. /usr: kbytes in use: 65, limits (soft = 500, hard = 600)

新的配额限制在退出编辑器时生效。

有时,我们希望对一定范围内的用户设置配额限制。这可以通过首先为一个用户分配所需的配额限制来实现。然后,使用 -p 将该配额复制到指定范围的用户 ID(UID)。下面的命令将为 UID 10,000 到 19,999 复制这些配额限制:

  1. # edquota -p test 10000-19999

更多信息,请参考 edquota(8)

18.12.3. 检查配额限制和磁盘使用情况

要检查单个用户或组的配额和磁盘使用情况,请使用 quota(1) 。一个用户只能检查他自己的配额和他所属的组的配额。只有超级用户可以查看所有用户和组的配额。要获得启用了配额的文件系统的所有配额和磁盘使用情况的摘要,请使用 repquota(8)

通常,用户没有使用任何磁盘空间的文件系统不会显示在 quota 的输出中,即使用户为该文件系统分配了配额限制。使用 -v 来显示这些文件系统。下面是 quota -v 的输出示例,该用户在两个文件系统上有配额限制:

  1. Disk quotas for user test (uid 1002):
  2. Filesystem usage quota limit grace files quota limit grace
  3. /usr 65* 50 75 5days 7 50 60
  4. /usr/var 0 50 75 0 50 60

在这个例子中,用户目前在 /usr 上的软限制为 50kbytes ,超过了 15kbytes ,并且还有 5 天的宽限期。星号*表示该用户目前超过了配额限制

18.12.4 NFS上的配额

配额是由 NFS 服务器上的配额子系统执行的。rpc.rquotad(8) 守护进程上的配额信息对 NFS 客户端可用,允许这些机器上的用户查看他们的配额统计信息。

在 NFS 服务器上,通过删除 /etc/inetd.conf 中这一行的#来启用 rpc.rquotad:

  1. rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad

然后,重新启动 inetd:

  1. # service inetd restart