如何在Ubuntu20.04上设置文件系统配额

来自菜鸟教程
跳转至:导航、​搜索

介绍

配额用于限制用户或组可以在文件系统上使用的磁盘空间量。 如果没有这样的限制,用户可能会填满机器的磁盘并给其他用户和服务带来问题。

在本教程中,您将安装命令行工具来创建和检查磁盘配额,然后为示例用户设置配额。

先决条件

  • 本教程假设您使用非 root、启用 sudo 的用户登录 Ubuntu 20.04 服务器,如 使用 Ubuntu 20.04 的初始服务器设置中所述。 本教程中的技术通常适用于 Ubuntu 以外的 Linux 发行版,但可能需要进行一些调整。

第 1 步 – 安装配额工具

要设置和检查配额,首先需要使用 apt 安装配额命令行工具。 先更新包列表,再安装包:

sudo apt update
sudo apt install quota

您可以通过运行 quota 命令并询问其版本信息来验证工具是否已安装:

quota --version
OutputQuota utilities version 4.05.
. . .

如果您的输出显示的版本号略有不同,这很好。

接下来确保您有适当的内核模块来监控配额。

第 2 步 – 安装配额内核模块

如果您在基于云的虚拟服务器上,您的默认 Ubuntu Linux 安装可能没有支持配额管理所需的内核模块。 要检查,您将使用 find/lib/modules/... 目录中搜索 quota_v1quota_v2 模块:

find /lib/modules/ -type f -name '*quota_v*.ko*'
Output/lib/modules/5.4.0-99-generic/kernel/fs/quota/quota_v2.ko
/lib/modules/5.4.0-99-generic/kernel/fs/quota/quota_v1.ko

记下您的内核版本(在上面的文件路径中突出显示),因为您将在后面的步骤中需要它。 它可能会有所不同,但只要列出了这两个模块,您就已经准备就绪,可以跳过此步骤的其余部分。

如果上述命令没有输出,请安装 linux-image-extra-virtual 包:

sudo apt install linux-image-extra-virtual

这将提供实现配额所需的内核模块。 再次运行之前的find命令,验证安装成功。

接下来,您将更新文件系统 mount 选项以在 root 文件系统上启用配额。

第 3 步 - 更新文件系统挂载选项

要在特定文件系统上激活配额,您需要指定一些与配额相关的选项来挂载它。 您可以通过更新 /etc/fstab 配置文件中的文件系统条目来做到这一点。 打开该文件 nano 或您喜欢的文本编辑器:

sudo nano /etc/fstab

该文件的内容将类似于以下内容:

/etc/fstab

LABEL=cloudimg-rootfs   /        ext4   defaults        0 0
LABEL=UEFI      /boot/efi       vfat    defaults        0 0

fstab 文件来自虚拟服务器。 台式机或笔记本电脑的 fstab 可能略有不同,但在大多数情况下,您将拥有一个代表所有磁盘空间的 /root 文件系统。

突出显示的行表示已安装设备的名称、安装位置、文件系统类型和使用的安装选项。 第一个零表示不会进行备份,第二个零表示在启动时不会进行错误检查。

通过将 defaults 选项替换为以下突出显示的选项来更新指向根文件系统的行:

/etc/fstab

LABEL=cloudimg-rootfs   /        ext4   usrquota,grpquota        0 0
. . .

此更改将允许我们在文件系统上启用基于用户的 (usrquota) 和基于组的 (grpquota) 配额。 如果您只需要其中一个,则可以省略未使用的选项。 如果您的 fstab 行已经列出了一些选项而不是 defaults,您应该将新选项添加到已经存在的任何内容的末尾,确保用逗号分隔所有选项并且没有空格.

重新挂载文件系统以使新选项生效:

sudo mount -o remount /

这里,-o 标志用于传递 remount 选项。

注意: 确保您的 /etc/fstab 文件中列出的选项之间没有空格。 如果在 , 逗号后加一个空格,您将看到如下错误:

Outputmount: /etc/fstab: parse error

如果您在运行之前的 mount 命令后看到此消息,请重新打开 fstab 文件,更正所有错误,然后在继续之前重复 mount 命令。


您可以通过查看 /proc/mounts 文件来验证新选项是否用于挂载文件系统。 在这里,使用 grep 仅显示该文件中的根文件系统条目:

cat /proc/mounts | grep ' / '
Output/dev/vda1 / ext4 rw,relatime,quota,usrquota,grpquota 0 0

请注意两个指定的选项。 现在您已经安装了工具并更新了文件系统选项,您可以打开配额系统。

第 4 步 - 启用配额

在最终开启配额系统之前,需要手动运行一次quotacheck命令:

sudo quotacheck -ugm /

此命令创建文件 /aquota.user/aquota.group。 这些文件包含有关文件系统的限制和使用情况的信息,并且它们需要在您打开配额监控之前存在。 使用的quotacheck参数有:

  • u: 指定创建基于用户的配额文件
  • g: 表示应该创建一个基于组的配额文件
  • m: 在执行配额的初始统计时禁用以只读方式重新挂载文件系统。 如果用户在此过程中主动保存文件,则将文件系统重新安装为只读将提供更准确的结果,但在此初始设置期间不是必需的。

如果您不需要启用基于用户或组的配额,您可以省略相应的 quotacheck 选项。

您可以通过列出根目录来验证是否创建了适当的文件:

ls /
Outputaquota.group  bin   dev  home        initrd.img.old  lib64       media  opt   root  sbin  srv  tmp  var      vmlinuz.old
aquota.user   boot  etc  initrd.img  lib             lost+found  mnt    proc  run   snap  sys  usr  vmlinuz

如果您没有在 quotacheck 命令中包含 ug 选项,则会丢失相应的文件。

接下来,您必须将配额模块添加到 Linux 内核。 或者,您可以重新启动服务器以完成相同的任务。 否则,手动添加它们,将突出显示的内核版本替换为您在 Step 2 中找到的版本:

sudo modprobe quota_v1 -S 5.4.0-99-generic
sudo modprobe quota_v2 -S 5.4.0-99-generic

现在您已准备好开启配额系统:

sudo quotaon -v /
quotaon Output/dev/vda1 [/]: group quotas turned on
/dev/vda1 [/]: user quotas turned on

您的服务器现在正在监控和执行配额,但我们还没有设置任何! 接下来,您将为单个用户设置磁盘配额。

第 5 步 – 为用户配置配额

您可以通过多种方式为用户或组设置配额。 在这里,您将了解如何使用 edquotasetquota 命令设置配额。

使用 edquota 设置用户配额

使用 edquota 命令来 edit quotas。 让我们编辑您的示例 sammy 用户的配额:

sudo edquota -u sammy

-u 选项指定这是您将要编辑的 user 配额。 如果您想编辑组的配额,请使用 -g 选项代替。

这将在您的默认文本编辑器中打开一个文件,类似于 crontab -e 打开一个临时文件供您编辑。 该文件将类似于以下内容:

Disk quotas for user sammy (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/vda1                        40          0          0         13        0        0

这列出了用户名和 uid、启用了配额的文件系统,以及基于 inode 的使用和限制。 设置基于 inode 的配额将限制用户可以创建的文件和目录数量,无论他们使用多少磁盘空间。 大多数人会想要基于块的配额,它专门限制磁盘空间的使用。 这就是您要配置的内容。

注意: block 的概念定义不明确,可能会根据许多因素而改变,包括报告它们的命令行工具。 在 Ubuntu 上设置配额的上下文中,假设 1 个块等于 1 KB 磁盘空间是相当安全的。

在上面的清单中,您的用户 sammy 正在使用 40 个块,即 /dev/vda1 驱动器上的 40KB 空间。 softhard 限制均使用 0 值禁用。


每种配额类型都允许您设置 软限制硬限制 。 当用户超过软限制时,他们超出配额,但不会立即阻止他们消耗更多空间或 inode。 取而代之的是一些回旋余地:默认情况下,用户有 7 天的时间将其磁盘使用量恢复到软限制之下。 在 7 天宽限期结束时,如果用户仍然超过软限制,它将被视为硬限制。 硬限制不太宽容:当您达到指定的硬限制时,所有新块或 inode 的创建都会立即停止。 这表现为磁盘空间完全不足:写入将失败,临时文件将无法创建,用户在执行常见任务时将开始看到警告和错误。

让我们将您的 sammy 用户更新为具有 100MB 软限制和 110MB 硬限制的块配额:

Disk quotas for user sammy (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/vda1                        40       100M       110M         13        0        0

保存并关闭文件。 要检查新配额,您可以使用 quota 命令:

sudo quota -vs sammy
OutputDisk quotas for user sammy (uid 1000):
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/vda1     40K    100M    110M              13       0       0

该命令输出您当前的配额状态,并显示您的配额为100M,而您的限制为110M。 这分别对应于软限制和硬限制。

注意: 如果您希望您的用户能够在没有 sudo 访问权限的情况下检查自己的配额,您需要授予他们读取您在第 4 步中创建的配额文件的权限。 一种方法是创建一个 users 组,使这些文件可由 users 组读取,然后确保您的所有用户也都放在该组中。

要了解有关 Linux 权限的更多信息,包括用户和组所有权,请阅读 Linux 权限简介


使用 setquota 设置用户配额

edquota 不同,setquota 将在单个命令中更新用户的配额信息,无需交互式编辑步骤。 您将为基于块和基于 inode 的配额指定用户名和软限制和硬限制,最后指定将配额应用到的文件系统:

sudo setquota -u sammy 200M 220M 0 0 /

上述命令将 sammy 的基于块的配额限制加倍,分别为 200 兆字节和 220 兆字节。 基于 inode 的软限制和硬限制的 0 0 表示它们仍未设置。 即使您没有设置任何基于 inode 的配额,这也是必需的。

再次使用 quota 命令检查您的工作:

sudo quota -vs sammy
OutputDisk quotas for user sammy (uid 1000):
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/vda1     40K    200M    220M              13       0       0

现在您已经设置了一些配额,让我们了解如何生成配额报告。

第 6 步 – 生成配额报告

要为特定文件系统上的所有用户生成有关当前配额使用情况的报告,请使用 repquota 命令:

sudo repquota -s /
Output*** Report for user quotas on device /dev/vda1
Block grace time: 7days; Inode grace time: 7days
                        Space limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   1696M      0K      0K          75018     0     0
daemon    --     64K      0K      0K              4     0     0
man       --   1048K      0K      0K             81     0     0
nobody    --   7664K      0K      0K              3     0     0
syslog    --   2376K      0K      0K             12     0     0
sammy     --     40K    200M    220M             13     0     0

在这种情况下,您正在为 / root 文件系统生成报告。 -s 命令告诉 repquota 尽可能使用人类可读的数字。 列出了一些系统用户,默认情况下可能没有设置配额。 您的用户 sammy 列在底部,其中包含使用的数量以及软硬限制。

另请注意 Block grace time: 7days 标注和 grace 列。 如果您的用户超过了软限制,grace 列将显示他们还剩多少时间才能回到限制之下。

第 7 步 – 为超额配置宽限期

您可以配置允许用户在软限制之上浮动的时间段。 使用 setquota 命令执行此操作:

sudo setquota -t 864000 864000 /

上面的命令将块和 inode 宽限时间都设置为 864000 秒,即 10 天。 此设置适用于所有用户,即使您不使用两种类型的配额(阻止与限制),也必须提供这两个值。 索引节点)。

请注意,值 必须 以秒为单位指定。

再次运行 repquota 以检查更改是否生效:

sudo repquota -s /
OutputBlock grace time: 10days; Inode grace time: 10days
. . .

更改应立即反映在 repquota 输出中。

结论

在本教程中,您安装了 quota 命令行工具,验证了您的 Linux 内核可以处理监控配额,为一个用户设置基于块的配额,并生成文件系统配额使用情况的报告。

附录:常见配额相关错误信息

以下是您在设置和操作文件系统配额时可能会看到的一些常见错误。

quotaon Outputquotaon: cannot find //aquota.group on /dev/vda1 [/]
quotaon: cannot find //aquota.user on /dev/vda1 [/]

如果您在运行初始 quotacheck 命令之前尝试打开配额(使用 quotaon),您可能会看到此错误。 quotacheck 命令创建打开配额系统所需的 aquotaquota 文件。 有关详细信息,请参阅 步骤 4

quotaon Outputquotaon: using //aquota.group on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.
quotaon: using //aquota.user on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.

这个 quotaon 错误告诉我们您的内核不支持配额,或者至少不支持正确的版本(有 quota_v1quota_v2 版本)。 这意味着您需要的内核模块未安装或未正确加载。 在 Ubuntu Server 上,最可能的原因是在基于云的虚拟服务器上使用精简的安装映像。

如果是这种情况,可以通过安装带有 aptlinux-image-extra-virtual 软件包来修复它。 有关详细信息,请参阅 步骤 2

如果安装后此错误仍然存在,请查看 Step 4。 确保您正确使用了 modprobe 命令,或者如果这对您来说是一个可行的选项,则已重新启动您的服务器。

quota Outputquota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //quota.user: No such file or directory

如果您运行 quota 并且您的当前用户没有读取文件系统配额文件的权限,您将看到此错误。 您(或您的系统管理员)将需要适当地调整文件权限,或者在运行需要访问配额文件的命令时使用 sudo

要了解有关 Linux 权限的更多信息,包括用户和组所有权,请阅读 Linux 权限简介