16.14. 文件系统配额

配额是操作系统的一个可选择的属性,它允许限制用户使用的磁盘空间大小或是 使用的文件数量。这可以防止某个用户占用所有的磁盘空间。

16.14.1. 配置系统来启用磁盘配额

在决定使用磁盘配额前,确信磁盘配额已经在内核中配置好了。只要在在内核 中配置文件中添加下面一行就行了:

options QUOTA

在默认情况下 GENERIC 内核是不会启用这个功能的, 所以必须配置、重建和安装一个定制的内核。请参考 FreeBSD 内核配置 Chapter 8 这章了解更多有关内核配置的信息。

接下来,需要在 /etc/rc.conf 中启用磁盘配额。可以 通过添加下面这行来完成:

enable_quotas="YES"

为了更好的控制配额时的启动,还有另外一个可配置的变量。通常 启动时,集成在每个文件系统上的配额会被配额检查程序 quotacheck(8) 自动检查。配额检查功能能够确保在配额数据库中 的数据正确地反映了文件系统的数 据情况。这是一个很耗时间的处理进程,它会影响系统的启动时间。如果 想跳过这一步,可以在文件 /etc/rc.conf 加入 下面这一行来达到目的:

check_quotas="NO"

如果运行的是 3.2-RELEASE 以前的版本,配置比较简单,只需要配置 一个选项,在您的 /etc/rc.conf 中设置下面这行:

check_quotas="YES"

最后,要编辑 /etc/fstab 文件,以在每一个 文件系统基础上雇用磁盘配额。这是启用用户和组配额,或同时启用用户 和组配额的地方。

要在一个文件系统上启用每个用户的配额,可以在 /etc/fstab 里添加 userquota 选项在要雇用配额文件的系统上。例如:

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

同样的,要启用组配额,使用 groupquota 选项来代替 userquota 选项。要同时启用用户和组配额,可以这样做:

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

默认情况下,配额文件是存放在文件系统的以 quota.userquota.group 命名的根目录下。可以查看 fstab(5) 联机手册了解更多信息。即使联机手册 fstab(5) 说中以为配额文件指定其他 的位置,这里并不推荐这样做,因为不同的配额工具不一定遵循这样的规则。

到这儿,可以用新内核重新启动系统。 /etc/rc 将自动 运行适当的命令来创建最初的配额文件,所以并不需要手动来创建任何零长度的配额 文件。

在通常的操作过程中,并不要求手动运行 quotacheck(8)quotaon(8), 或 quotaoff(8) 命令,然而可能需要阅读与他们的操作 相似的联机手册。

16.14.2. 设置配额限制

一旦您配置好了启用配额的系统,可以检查一下它们是真的有用。 可以这样做:

# quota -v

您应该能够看到一行当前正在使用的每个文件系统启用的磁盘配额 使用情况的摘要信息。

现在可以使用 edquota(8) 命令准备启用配额限制。

有几个有关如何强制限制用户或组可以分配到的磁盘空间大小的选项。 您可以限制磁盘窨的分配,或文件的数量,或两者都有。这些限制中的每 一个最终可分为两类:硬限制和软限制。

一个硬限制可能无法被超越。一旦一个用户达到了他们的硬限制,他们 将无法在文件系统中行到更多的配额。例如,如果用户在文件系统上且个 500 blocks 的硬限制,而当前已经分派了490个 blocks ,用户就只能分派 剩下的 10 个 blocks 。如果硬是要分派 11 个 blocks 将会失败。

软限制可以被有时间限制性地被越过。这段时间可以被理解为允许限期, 默认是一个星期。如果一个用户延缓时间太长的话,软限制将会变成硬限制, 根本就不允许再继续占用磁盘配额。当用户因到软限制以下时,允许延期将 重新开始计算。

下面是一个运行 edquota(8) 时看到的例子。当 edquota(8) 命令被调用时,会被转移进 EDITOR 环境变量指派的编辑 器中,允许编辑配额限制。如果环境变量没有设置,默认在 vi 编辑器上进行。

# edquota -u test
Quotas for user test:
/usr: blocks in use: 65, limits (soft = 50, hard = 75)
        inodes in use: 7, limits (soft = 50, hard = 60)
/usr/var: blocks in use: 0, limits (soft = 50, hard = 75)
        inodes in use: 0, limits (soft = 50, hard = 60)

在每一个启用了磁盘配额的文件系统上,通常会看到两行。一行是 block 限制,另一行是 inode 限制。简单地改变要修改的配额限制的值。 例如,提高这个用户软限制的数值到 500 ,硬限制到 600 :

/usr: blocks in use: 65, limits (soft = 50, hard = 75)

to:

 /usr: blocks in use: 65, limits (soft = 500, hard = 600)

当离开编辑器的时候,新的配额限制设置将会被保存。

有时,在 UIDs 的范围上设置配额限制是非常必要的。这可以通过在 edquota(8) 命令后面加上 -p 选项来完成。首先, 给用户分配所需要的配额限制,然后运行命令 edquota -p protouser startuid-enduid。例如,如果 用户 test 已经有了所需要的配额限制,下面的命令 可以被用来复制那些 UIDs 为10,000 到 19,999 的配额限制:

# edquota -p test 10000-19999

更多细节请参考 edquota(8) 手册页。

16.14.3. 检查配额限制和磁盘使用

即可以使用 quota(1) 也可以使用 repquota(8) 命令来检查 配额限制和磁盘使用情况。 quota(1) 命令能够检查单个用户和组的配置 使用情况。只有超级用户才可以检查其它用户的配额和磁盘使用情况。 repquota(8) 命令可以用来了解所有配额和磁盘的使用情况。

下面是一个使用 quota -v 命令后的输出情况:

Disk quotas for user test (uid 1002):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
           /usr      65*     50      75   5days       7      50      60
       /usr/var       0      50      75               0      50      60

上面的例子表示在 /usr 文件系统中,这个文件系统 中,这个用户超越了软限制(50 blocks )15个 blocks ,但是他有5天的宽限期。 注意: * 号表示用户当前超过了他的配额限制。

通常用户没有在上面使用任何磁盘空间的文件系统不会在 quota(1) 命令的输出中显示,即使他有一个针对文件系统的配置限制。 -v 选项将显示那些文件系统,如上一个例子中的 /usr/var 文件系统。

16.14.4. 通过 NFS 使用磁盘配额

配额能够在 NFS 服务器上被配额子系统强迫使用。在 NFS 客房端, rpc.rquotad(8) 命令可以使用 quota 信息用于 quota(1) 命令,可以允许用户察看它们的 quota 统计信息。

可以这样在 /etc/inetd.conf 中启用 rpc.rquotad

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

现在重启 inetd

# kill -HUP `cat /var/run/inetd.pid`