管理磁盘配额

概述

在本教程中,学习管理用户的磁盘配额。学习:

  • 为文件系统设置磁盘配额
  • 设置配额限制
  • 检查配额
  • 生成配额报告

本教程可以帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 104 中的目标 104.4 进行应考准备。该目标的权重为 1。

共享您的磁盘空间

配额允许您按用户或组来控制磁盘使用。配额可预防用户和组使用文件系统中超出允许范围的磁盘空间,或者预防将文件系统完全填满。XFS 文件系统还支持项目配额,这可以限制项目使用的空间量,无论哪些用户在项目的目录树中创建文件。

配额必须由根用户或具有根用户权限的用户启用和管理。它们通常用在多用户系统上,较少用在单用户工作站上。

本教程将介绍非 XFS 文件系统上的第 2 版配额和 XFS 文件系统上的 xfs 配额。请注意,LPI 101 考试的重点是第 2 版配额。

前提条件

要从本系列教程中获得最大收获,您应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,以实践本教程中涵盖的命令。除非另行说明,本教程中的示例使用 CentOS 6 和 2.6.-504 内核。有时,程序的不同版本将得到不同的输出格式,所以您的结果可能并不总是与这里给出的清单和图完全相同。

您还应熟悉我们的教程 “学习 Linux 101:创建分区和文件系统 ”。

我们的测试设置

为了让您更好地理解一些示例,我们首先会介绍我们对本教程使用的测试分区设置。如果您已经理解文件所有权和权限,而且已经安装了配额包,可以跳过 启用配额 部分。请参阅 developerWorks LPIC-1 考试路线图 ,获取本系列中其他教程的链接,这些教程对这些命令的介绍比这里提供的介绍更为详细。

测试分区和用户

我们将使用一个 110GB ext4 分区 (/dev/sdc6) 和一个 40GB XFS 分区 (/dev/sdc3) 来进行演示。它们分别挂载在 /quotatest/ext4 和 /quotatest/xfs 上。

设置分区
 [root@attic4-cent ~]# mkfs -t ext4 /dev/sdc6
 mke2fs 1.41.12 (17-May-2010)
 Filesystem label=
 OS type: Linux
 Block size=4096 (log=2)
 Fragment size=4096 (log=2)
 Stride=1 blocks, Stripe width=0 blocks
 7045120 inodes, 28160000 blocks
 1408000 blocks (5.00%) reserved for the super user
 First data block=0
 Maximum filesystem blocks=4294967296
 860 block groups
 32768 blocks per group, 32768 fragments per group
 8192 inodes per group
 Superblock backups stored on blocks:
     32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
     4096000, 7962624, 11239424, 20480000, 23887872

 Writing inode tables: done
 Creating journal (32768 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 31 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.
 [root@attic4-cent ~]# mkfs -t xfs -i size=512 /dev/sdc3
 mkfs.xfs: /dev/sdc3 appears to contain an existing filesystem (xfs).
 mkfs.xfs: Use the -f option to force overwrite.
 [root@attic4-cent ~]# mkfs -t xfs -f -i size=512 /dev/sdc3
 meta-data=/dev/sdc3              isize=512    agcount=16, agsize=655360 blks
         =                       sectsz=4096  attr=2, projid32bit=0
 data     =                       bsize=4096   blocks=10485760, imaxpct=25
         =                       sunit=0      swidth=0 blks
 naming   =version 2              bsize=4096   ascii-ci=0
 log      =internal log           bsize=4096   blocks=5120, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 [root@attic4-cent ~]# mkdir -p /quotatest/ext4
 [root@attic4-cent ~]# mkdir -p /quotatest/xfs
 [root@attic4-cent ~]# mount /dev/sdc6 /quotatest/ext4
 [root@attic4-cent ~]# mount /dev/sdc3 /quotatest/xfs

对于本示例,我们希望普通用户能够在新文件系统中创建文件。创建文件后,文件系统归根用户所有,而且普通用户无法在它们之上创建文件或目录。我们将更改所有权,以便新文件系统归用户 development 所有,该用户也有一个称为 development 的私有组。我们还将更改权限,以便 development 组中的用户可以创建文件和目录。 更改我们的测试分区的所有权和权限 展示了如何设置所有权和权限。

更改我们的测试分区的所有权和权限
[root@attic4-cent ~]# # Show default ownership and permissions
[root@attic4-cent ~]# ls -l /quotatest/
total 4
drwxr-xr-x. 3 root root 4096 Aug  7 15:51 ext4
drwxr-xr-x. 2 root root    6 Aug  7 15:56 xfs
[root@attic4-cent ~]# # Change user and group ownership to development
[root@attic4-cent ~]# chown development:development /quotatest/*
[root@attic4-cent ~]# # Allow group members to create files and directories
[root@attic4-cent ~]# chmod g+w /quotatest/*
[root@attic4-cent ~]# ls -l /quotatest/
total 4
drwxrwxr-x. 3 development development 4096 Aug  7 15:51 ext4
drwxrwxr-x. 2 development development    6 Aug  7 15:56 xfs
[root@attic4-cent ~]# # Set default group of new files and directories
[root@attic4-cent ~]# # to development
[root@attic4-cent ~]# chmod g+s /quotatest/ext4/
[root@attic4-cent ~]# ls -l /quotatest/
total 4
drwxrwsr-x. 3 development development 4096 Aug  7 15:51 ext4
drwxrwxr-x. 2 development development    6 Aug  7 15:56 xfs

最后,如果您在执行模式下使用了 SELinux(安全增强 Linux),可能需要更新安全上下文。运行 fixfiles check 来检查您是否需要更新上下文,运行 fixfiles relabel 来重新标记 /quotatest 树,如 检查和修复 SELinux 上下文 所示。请参阅 man 页面,了解其他重新标记方式,包括在下次引导时重新标记整个文件系统。

检查和修复 SELinux 上下文
 [root@attic4-cent ~]# # Check whether SELinux contexts need updating
 [root@attic4-cent ~]# fixfiles check /quotatest
 /sbin/restorecon reset /quotatest context unconfined_u:object_r:default_t:s0->
                                          unconfined_u:object_r:home_root_t:s0
 /sbin/restorecon reset /quotatest/ext4 context system_u:object_r:file_t:s0->
                                               system_u:object_r:user_home_dir_t:s0
 /sbin/restorecon reset /quotatest/ext4/lost+found context system_u:object_r:file_t:s0->
                                                          system_u:object_r:user_home_t:s0
 /sbin/restorecon reset /quotatest/xfs context system_u:object_r:file_t:s0->
                                              system_u:object_r:user_home_dir_t:s0
 [root@attic4-cent ~]# # Update SELinux contexts
 [root@attic4-cent ~]# fixfiles relabel /quotatest

    Files in the /tmp directory may be labeled incorrectly, this command
    can remove all files in /tmp.  If you choose to remove files from /tmp,
    a reboot will be required after completion.

    Do you wish to clean out the /tmp directory [N]? n

我们还使用了 3 个用户(ian、mary 和 jenni),每个用户都有一个与用户名同名的私有组。这些用户还是 development 组的成员。

检查配额包

如果您使用的是桌面系统,那么您可能尚未安装配额包,因为通常的默认桌面安装中不包含配额。使用 dpkgrpm 检查该包是否已安装,如 检查配额包 所示。

检查配额包
 ian@ubuntu:~$ # Ubuntu 15.04
 ian@ubuntu:~$ dpkg -l quota
 Desired=Unknown/Install/Remove/Purge/Hold
 | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
 |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
 ||/ Name           Version      Architecture Description
 +++-==============-============-============-=================================
 un  quota          <none>       <none>       (no description available)

 [root@attic4-cent ~]# # CentOS 6
 [root@attic4-cent ~]# rpm -q quota
 quota-3.17-21.el6_5.x86_64
 [root@attic4-cent ~]# yum list installed quota
 Loaded plugins: fastestmirror, refresh-packagekit, security
 Loading mirror speeds from cached hostfile
 * base: centos.mirror.nac.net
 * epel: archive.linux.duke.edu
 * extras: mirror.us.leaseweb.net
 * updates: mirror.netdepot.com
 Installed Packages
 quota.x86_64      1:3.17-21.el6_5       @anaconda-CentOS-201410241409.x86_64/6.6

我们的 Ubuntu 15.04 示例没有安装配额包,但已经安装了 CentOS 6 系统。

如果您尚未安装配额包,请参阅我们的教程 “学习 Linux 101:使用 Debian 包管理 ” 和 “学习 Linux 101:使用 RPM 和 YUM 包管理 来获取安装包的相关帮助。

启用配额

有 3 种不同类型的配额支持:

  1. 第 1 版配额格式用于 2.2 及更低版本内核
  2. 第 2 版配额格式用在 2.4 及更高版本内核上
  3. xfs 是 XFS 文件系统上的配额

配额需要高于 2.4 的内核中引入的内核支持。2.6 内核拥有您需要的支持。

XFS 配额始终具有日志功能。内核 2.6.11 及更高版本支持带日志的第 2 版配额。

第 1 版配额支持有时称为 vfsold ,而第 2 版配额支持有时称为 vfsv0 (32 位 UID/GID、64 位空间使用、32 位 inode 使用和限制)或 vfsv1 (64 位配额限制和使用)。

向 /etc/fstab 添加配额支持

启用配额的下一步是根据您希望实现用户配额、组配额还是二者都实现,向 /etc/fstab 中的文件系统定义添加合适的选项。XFS 文件系统也支持项目配额。

在撰写本文时,没有明显的手册页集中介绍启用配额的选项。 /etc/fstab 中的配额选项 显示了可用的选项和它们用于的配额系统类型。

/etc/fstab 中的配额选项
选项 适用于 用途
usrquota 所有类型 启用用户配额
usrjquota= filename vfsv0、vfsv1(第 2 版) 启用带日志的用户配额;需要一个配额数据库文件名(通常为 aquota.user)和 jqfmt 选项规范
uquota xfs 等效于 usrquota
grpquota 所有类型 启用组配额
grpjquota= filename vfsv0、vfsv1(第 2 版) 启用带日志的组配额;需要一个配额数据库文件名(通常为 aquota.group)和 jqfmt 选项规范
gquota xfs 等效于 grpquota
prjquota xfs 启用项目配额
pquota xfs 等效于 prjquota
jqfmt= format vfsv0、vfsv1(第 2 版) 指定 usrjquota 或 grpjquota 时使用的配额格式;目前仅支持 vfsv0、vfsv1(第 2 版)格式
quota vfsold(第 1 版)、vfsv0、vfsv1(第 2 版) 等效于 usrquota
noquota vfsold(第 1 版)、vfsv0、vfsv1(第 2 版) 不启用配额
uqnoenforce xfs 启用用户配额核算,但禁用执行
gqnoenforce xfs 启用组配额核算,但禁用执行
pqnoenforce xfs 启用项目配额核算,但禁用执行

我们使用了一个 ext4 分区和一个 XFS 分区来进行演示。我们将向这些文件系统添加用户和组配额,以便您可以了解两种不同文件系统上的配额工作原理。我们的 /etc/fstab 条目如 在 /etc/fstab 中启用配额支持 所示。

在 /etc/fstab 中启用配额支持
/dev/sdc6  /quotatest/ext4  ext4    defaults,usrquota,grpquota          1 2
/dev/sdc3  /quotatest/xfs   xfs     defaults,usrquota,grpquota          1 2

重新挂载文件系统

在编辑 /etc/fstab 和添加配额后,您需要重新挂载文件系统。对于 XFS 文件系统,配额数据被视为文件系统元数据的一部分。对于其他文件系统,用户配额信息存储在文件系统的根目录中的 aquota.user 文件中,类似地,组配额存储在 aquota.group 中。第 1 版配额使用了 quota.user 和 quota.group。对于这些文件系统,在重新挂载文件系统后,必须创建配额文件和启用配额检查。 quotacheck 命令检查所有文件系统上的配额,并在需要的 aquota.user 和 aquota.group 文件不存在时创建它们。它还可以修复损坏的配额文件。请参阅手册页来了解更多的信息。

以下是用于 quotacheck 命令的一些常见选项:

  • -a 或 –all: 检查 /etc/mtab 中挂载的所有文件系统(NFS 文件系统除外)
  • -c 或 –create-files: 忽略现有的配额文件。运行一次新扫描并将结果写入磁盘
  • -u 或 –user: 检查用户配额(这是默认选项)
  • -g 或 –group: 检查组配额
  • -v 或 –verbose: 详细输出

为 vfsold(第 1 版)和 vfsv0 或 vfsv1(第 2 版)创建配额数据库文件 显示了卸载文件系统,然后使用来自 /etc/fstab 的定义重新挂载它们,然后在我们重新挂载的文件系统上运行 quotacheck 命令的结果。如果您不使用 -a 选项,必须指定您想要检查的文件系统。

为 vfsold(第 1 版)和 vfsv0 或 vfsv1(第 2 版)创建配额数据库文件
[root@attic4-cent ~]# umount /quotatest/*
[root@attic4-cent ~]# mount /quotatest/ext4
[root@attic4-cent ~]# mount /quotatest/xfs
[root@attic4-cent ~]# quotacheck -augvc
quotacheck: Your kernel probably supports journaled quota but you are not using it.
Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sdc6 [/quotatest/ext4] done
quotacheck: Cannot stat old group quota file /quotatest/ext4/aquota.group: No such file
or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /quotatest/ext4/aquota.group: No such file
or directory. Usage will not be subtracted.
quotacheck: Checked 2 directories and 1 files
quotacheck: Old file not found.
quotacheck: Skipping /dev/sdc3 [/quotatest/xfs]
[root@attic4-cent ~]# # find the created quota ext4 files
[root@attic4-cent ~]# find /quotatest
/quotatest
/quotatest/ext4
/quotatest/ext4/aquota.group
/quotatest/ext4/lost+found
/quotatest/ext4/aquota.user
/quotatest/xfs

如果您的输出包含类似这样的消息:

quotacheck: Cannot create new quotafile /quotatest/ext4/aquota.user.new: Permission denied

那么您或许没有更新您的 SELinux 上下文。请返回检查 检查和修复 SELinux 上下文

请注意,来自 quotacheck 命令的警告建议我们切换为使用带日志的配额。为此,请将 /etc/fstab 中针对 /dev/sdc6 上的 ext4 文件系统的选项从

defaults,usrquota,grpquota

更改为

defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0

更新 /etc/fstab 后,需要再次重新挂载您的文件系统。

另请注意, quotacheck 命令跳过了 XFS 文件系统,因为 XFS 配额结构包含在元数据中且带有日志。

启动或停止配额检查

要执行 vfsold 和 vfsv0 配额检查,必须使用 quotaon 命令打开它。命令选项 -a-g-u-v 的含义与 quotacheck 命令相同。类似地,如果未指定 -a 选项,则必须指定一个文件系统。如果仅想显示配额是否已打开,可以使用 -p 选项。可使用 quotaoff 命令关闭配额检查。 为 vfsold 和 vfsv0 配额打开配额检查 显示了这些命令的示例。

为 vfsold 和 vfsv0 配额打开配额检查
[root@attic4-cent ~]# quotaon -p /quotatest/ext4/
group quota on /quotatest/ext4 (/dev/sdc6) is off
user quota on /quotatest/ext4 (/dev/sdc6) is off
[root@attic4-cent ~]# quotaon -uagv
/dev/sdc6 [/quotatest/ext4]: group quotas turned on
/dev/sdc6 [/quotatest/ext4]: user quotas turned on
[root@attic4-cent ~]# quotaoff -ugv /quotatest/ext4/
/dev/sdc6 [/quotatest/ext4]: group quotas turned off
/dev/sdc6 [/quotatest/ext4]: user quotas turned off
[root@attic4-cent ~]# quotaon -ugv /quotatest/ext4/
/dev/sdc6 [/quotatest/ext4]: group quotas turned on
/dev/sdc6 [/quotatest/ext4]: user quotas turned on

对于 XFS 文件系统,默认情况下已开启配额检查,除非该文件是使用 uqnoenforcegqnoenforcepqnoenforce 选项挂载的。使用 xfs_quota 命令和 -x (表示 专家 )选项来处理 xfs 配额。没有 -x 选项,您只能显示配额信息。该命令有多个子命令,包括 help 显示可用子命令列表, state 显示整体状态, enable 启用配额检查, disable 禁用配额检查。选项 -u-g-p 分别将操作限制到用户、组或项目。使用 -v 获得详细输出。还可以在命令行模式下运行该命令,使用 -c 选项来指定各个子命令。您可以为多个子命令指定此选项多次。如果指定子命令的选项,可能需要将您的命令放在引号中。一些示例如 为 xfs 配额打开配额检查 所示。

为 xfs 配额打开配额检查
[root@attic4-cent ~]# xfs_quota -x
xfs_quota> state
User quota state on /quotatest/xfs (/dev/sdc3)
 Accounting: ON
 Enforcement: ON
 Inode: #99 (2 blocks, 2 extents)
Group quota state on /quotatest/xfs (/dev/sdc3)
 Accounting: ON
 Enforcement: ON
 Inode: #100 (2 blocks, 2 extents)
Project quota state on /quotatest/xfs (/dev/sdc3)
 Accounting: OFF
 Enforcement: OFF
 Inode: #100 (2 blocks, 2 extents)
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
xfs_quota> disable
xfs_quota> quit
[root@attic4-cent ~]# xfs_quota -x  -c "enable -gu -v"  /quotatest/xfs
User quota state on /quotatest/xfs (/dev/sdc3)
 Accounting: ON
 Enforcement: ON
 Inode: #99 (2 blocks, 2 extents)
Group quota state on /quotatest/xfs (/dev/sdc3)
 Accounting: ON
 Enforcement: ON
 Inode: #100 (2 blocks, 2 extents)
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

在引导时检查第 1 和 2 版配额

尽管这超出了本教程的讨论范围,但 quotacheckquotaon 命令通常包含在初始化脚本中,以便在您重新引导系统时启用配额。 配额简要操作技巧 提供了更多信息。如果您使用的是带日志的配额,那么您可能不需要在引导时运行 quotacheck

设置配额限制

您已经看到,配额由文件系统根目录中的二进制文件或通过文件系统元数据进行控制。要为一个特定用户设置配额,可以使用 edquota 命令。此命令从各种启用了配额的文件系统提取该用户的配额信息,创建临时文件,然后为您打开一个编辑器来调节配额。默认情况下, edquota 使用 vi 编辑器。如果您希望使用不同的编辑器,可以设置 EDITOR 或 VISUAL 环境变量。要编辑用户配额,可使用 -u 选项(默认)和一个或多个用户名。要编辑组配额,可以使用 -g 和一个或多个组名称。

只有根用户才能编辑配额。如果使用 vi 作为编辑器,显示的信息将会类似于 运行 edquota -u ian

运行 edquota -u ian
Disk quotas for user ian (uid 1000):
 Filesystem                   blocks       soft       hard     inodes     soft     hard
 /dev/sdc6                         0          0          0          0        0        0
 /dev/sdc3                         0          0          0          0        0        0

运行 edquota -u ian 中可以看到, edquota 显示了我当前在每个开启了配额的文件系统上的 1K 块和 inode 使用情况。块和 inode 使用也有软性和硬性限制。在这个示例中,这些限制为 0,表示没有执行配额限制。

超出软性限制值后,用户会收到有关超出配额的电子邮件警告。用户不得超出硬性限制值。您可以将块限制视为用户可以存储的数据量的大体限制,将 inode 限制视为文件和目录数的限制。

更改配额限制

您可以通过更改该临时文件中的值,然后保存该文件来更改配额限制。如果不想执行更改,可以退出该文件而不进行保存。我们将在示例中使用非常小的限制,使您能够轻松地看到效果。假设您想将我的配额设置为每个测试的文件系统上 10MB 数据和 50 个文件。硬性限制允许超出 10%,可以如 设置限制 所示来设置这些值。

设置限制
Disk quotas for user ian (uid 1000):
 Filesystem                   blocks       soft       hard     inodes     soft     hard
 /dev/sdc6                         0      11264          0          0       50       55
 /dev/sdc3                         0      11264          0          0       50       55

保存该文件后,新配额将立即生效。请注意,您对使用的 blocks 或 inodes 值所做的任何更改都会被忽略。

复制配额

现在假设您正在为其他开发人员创建 ID。假设您拥有用户 mary 和 jenni,您希望它们都拥有与 ian 相同的配额。可使用 edquota-p 选项实现此目的,它使用 ian 的配额值作为其他用户的 原型 ,如 从原型设置配额 所示。

从原型设置配额
[root@attic4-cent ~]# edquota -p ian mary jenni

组限制

还可以使用 edquota 基于文件的组所有权来限制磁盘空间的分配。例如,上述 3 位开发人员都是 development 组的成员。要将该组的所有成员使用的总量限制为 250MB 和 100 个文件,可以使用命令 edquota -g development 并按 设置组的配额 所示来设置该值。

设置组的配额
Disk quotas for group development (gid 1002):
 Filesystem                   blocks       soft       hard     inodes     soft     hard
 /dev/sdc6                         4      25600      28160          1      100      110
 /dev/sdc3                         0      25600      28160          1      100      110

您可能想知道为什么我们的 ext4 文件系统 /dev/sdc6 上已经使用了一些块和 inode。还记得吗,在 更改我们的测试分区的所有权和权限 中我们使用了 chownchmod 将所有新文件的默认组设置为 development 组?这也适用于这两个配额数据库文件。您可以将这些文件更改到根的组中,如 重新设置配额数据库文件的组所有者 所示。一定要关闭配额检查后再执行更改,然后再打开它。

重新设置配额数据库文件的组所有者
[root@attic4-cent ~]# quotaoff /quotatest/ext4/
[root@attic4-cent ~]# chown :root /quotatest/ext4/aquota.*
[root@attic4-cent ~]# quotaon /quotatest/ext4

宽限期

用户或组可能超出它们的 宽限期 软性限制,该限制的默认值为 7 天。宽限期结束后,软性限制将作为硬性限制来执行。达到硬性限制后,必须删除一些文件才能创建新文件。使用 edquota -t 设置宽限期。同样地,您将在一个编辑器中看到类似 设置宽限期 的数据。和之前一样,保存更改来更新这些值。请确保为您的用户留出了接收其警告电子邮件的足够时间并相应地删除一些文件。

设置宽限期
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
 Filesystem             Block grace period     Inode grace period
 /dev/sdc6                     7days                  7days
 /dev/sdc3                     7days                  7days

检查配额

没有选项的 quota 命令会显示调用用户在任何为其设置了配额的文件系统上的配额(如果该用户在该系统上拥有文件)。 -v 选项显示所有已启用配额的文件系统的信息。根用户还可以向该命令添加用户名来查看特定用户的配额。在 显示配额 中,我们在 ext4 文件系统上创建一个 1MB 文件,然后展示使用带和不带 -v 选项的 quota 命令。

显示配额
[ian@attic4-cent ~]$ dd if=/dev/zero of=/quotatest/ext4/ianfile1 bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00736743 s, 142 MB/s
[ian@attic4-cent ~]$ quota
Disk quotas for user ian (uid 1000):
    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdc6    1024   11264       0               1      50      55
[ian@attic4-cent ~]$ quota -v
Disk quotas for user ian (uid 1000):
    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdc6    1024   11264       0               1      50      55
     /dev/sdc3       0   11264       0               0      50      55

除了当前使用情况的统计数据,您还会看到显示了软性和硬性配额限制。如果您在创建文件后立即运行 quota 命令,则有可能看到临时显示了稍微更大的块数。

超出块配额 展示了您超出软性限制时会发生的情况和超出硬性限制时会发生的情况。在这个示例中,我们向已创建的 1MB 添加了一个 9.5MB 的文件,这已远远超出了软性限制。现在您可以注意到,软性限制旁边有一个星号,这表明该用户已超出了配额。另请注意,宽限期列现在表明了用户需要在多长时间内更正该问题。最后,当我们尝试复制该 1MB 文件时,操作会失败,因为这超出了用户 ian 的硬性限制。

超出块配额
[ian@attic4-cent ~]$ dd if=/dev/zero of=/quotatest/ext4/ianfile2 bs=1024 count=9500
9500+0 records in
9500+0 records out
9728000 bytes (9.7 MB) copied, 0.0503342 s, 193 MB/s
[ian@attic4-cent ~]$ quota
Disk quotas for user ian (uid 1000):
    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdc6   10524   11264       0               2      50      55
[ian@attic4-cent ~]$ cp /quotatest/ext4/ianfile1 /quotatest/ext4/ianfile3
sdc6: warning, user block quota exceeded.
[ian@attic4-cent ~]$ quota
Disk quotas for user ian (uid 1000):
    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdc6   11548*  11264       0   6days       3      50      55

为了演示超出 inode(文件)配额时会发生什么,我们将切换到用户 jenni,在 /quotatest/ext4 中创建 52 个空文件。 超出 Jenni 的文件配额 显示了结果。

超出 Jenni 的文件配额
[jenni@attic4-cent ~]$ for n in $(seq 1 52); do touch /quotatest/ext4/jenni$n;done
sdc6: warning, user file quota exceeded.
[jenni@attic4-cent ~]$ quota
Disk quotas for user jenni (uid 1004):
    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/sdc6       0   11264       0              52*     50      55   7days

配额报告

一次检查一个用户的用户配额不是很有用,所以您希望使用 repquota 命令生成配额报告。 生成配额报告 展示了如何查看 /quotatest/ext4/ 上的所有用户和组的配额。

生成配额报告
 [root@attic4-cent ~]# repquota -ug /quotatest/ext4
 *** Report for user quotas on device /dev/sdc6
 Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
 User            used    soft    hard  grace    used  soft  hard  grace
 ----------------------------------------------------------------------
 root      --      16       0       0              1     0     0
 ian       +-   11548   11264       0  6days      22    50    55
 development --       4       0       0              1     0     0
 jenni     -+       0   11264       0             52    50    55  6days
 mary      --    1024   11264       0             35    50    55

 *** Report for group quotas on device /dev/sdc6
 Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
 Group           used    soft    hard  grace    used  soft  hard  grace
 ----------------------------------------------------------------------
 root      --      16       0       0              1     0     0
 development -+   12576   25600   28160            110   100   110  7days

请注意, 生成配额报告 中针对用户 ian 和 jenni 和组 development 的加号表示它们现在都已 超出配额。用户 ian 拥有太多数据。用户 jenni 拥有太多文件。组 development 也拥有太多文件。

与其他配额命令一样, -a 选项生成所有已启用配额的已挂载文件系统的报告。 -v 选项生成更详细的输出。 -n 选项生成按数值用户编号排列的列表,未将用户编号解析为名称。这可以提升大型报告的性能,但通常对人类读者没什么用。

XFS 文件系统上的项目配额

xfs 配额系统也支持项目配额,它是组配额的一种替代选择。您不能在一个 XFS 文件系统上同时使用组和项目配额。项目配额必须通过将 prjquota (或 pquota )添加到 /etc/fstab 来启用。

项目配额使用数值 id 的概念和一个更具描述性的项目名称。文件 /etc/projects 用于将数值项目标识符映射到目录树,而文件 /etc/projid 将数值项目标识符映射到项目名称。/etc 中没有这两个文件也可以操作,只是不太方便。请参阅手册页了解有关的详细信息。

要设置项目配额,必须在专家模式下( -x 选项)使用 xfs_quota 命令。首先您必须使用带 -s 选项的 project 子命令,通过将所有受影响的 inode 标记为该项目的一部分来设置项目配额。然后使用 limit 子命令设置硬性或软性限制。 设置 xfs 项目配额。 展示了如何在 /quotatest/xfs/proj-dir1 设置一个具有 15MB 项目硬性限制的项目树。出于演示目的,我们还将设置一个没有限制的并行的 /quotatest/xfs/proj-dir2。

设置 xfs 项目配额。
[root@attic4-cent ~]# mkdir -m ag+w /quotatest/xfs/proj-dir{1,2}
[root@attic4-cent ~]# chown development:development /quotatest/xfs/proj-dir*
[root@attic4-cent ~]# echo "50:/quotatest/xfs/proj-dir1" >> /etc/projects
[root@attic4-cent ~]# echo "dev-projects:50" >> /etc/projid
[root@attic4-cent ~]# xfs_quota -x
xfs_quota> path
     Filesystem          Pathname
000  /quotatest/xfs      /dev/sdc3 (uquota, gquota)
[001] /quotatest/xfs/proj-dir1 /dev/sdc3 (project 50, dev-projects)
xfs_quota> project -s dev-projects
Setting up project dev-projects (path /quotatest/xfs/proj-dir1)...
Processed 1 (/etc/projects and cmdline) paths for project dev-projects with
recursion depth infinite (-1).
xfs_quota> limit -p bhard=15m dev-projects
xfs_quota> q

我们将通过让用户 chris 创建一些文件来演示项目配额的实际运用。用户 chris 不是 development 组的成员,而且没有为他的 id 或组设置任何配额。 项目配额实战 表明 chris 无法在 /quotatest/xfs/proj-dir1 中创建超过 15MB 的数据,但在 /quotatest/xfs/proj-dir2 中不受限制。

项目配额实战
[chris@attic4-cent ~]$ id chris
uid=1006(chris) gid=1006(chris) groups=1006(chris)
[chris@attic4-cent ~]$ cd /quotatest/xfs/
[chris@attic4-cent xfs]$ dir
proj-dir1  proj-dir2
[chris@attic4-cent xfs]$ dd if=/dev/zero of=proj-dir1/chris1 bs=1024 count=10000
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.0386164 s, 265 MB/s
[chris@attic4-cent xfs]$ cp proj-dir1/chris1 proj-dir1/chris2
cp: writing `proj-dir1/chris2': No space left on device
[chris@attic4-cent xfs]$ ls -l proj-dir1
total 15356
-rw-rw-r--. 1 chris chris 10240000 Aug  8 18:01 chris1
-rw-rw-r--. 1 chris chris  5484544 Aug  8 18:01 chris2
[chris@attic4-cent xfs]$ # Note: second copy was truncated at hard limit
[chris@attic4-cent xfs]$ cp proj-dir1/chris1 proj-dir2/chris1
[chris@attic4-cent xfs]$ cp proj-dir1/chris1 proj-dir2/chris2
[chris@attic4-cent xfs]$ cp proj-dir1/chris1 proj-dir2/chris3
[chris@attic4-cent xfs]$ du -sh *
15M      proj-dir1
30M      proj-dir2
[chris@attic4-cent xfs]$ du -sh $(find /quotatest/xfs/proj-dir1 -user chris)
9.8M      /quotatest/xfs/proj-dir1/chris1
5.3M      /quotatest/xfs/proj-dir1/chris2
[chris@attic4-cent xfs]$ du -sh $(find /quotatest/xfs/proj-dir2 -user chris)
9.8M      /quotatest/xfs/proj-dir2/chris1
9.8M      /quotatest/xfs/proj-dir2/chris2
9.8M      /quotatest/xfs/proj-dir2/chris3

警告用户

warnquota 命令用于向超出配额的用户发送电子邮件警告。当一个组超出配额时,该电子邮件会发送到该组的 /etc/quotagrpadmins 中指定的用户。该电子邮件的格式由文件 /etc/warnquota.conf 控制。文件 /etc/quotatab 用于将 /dev/sdc6 这样的名称映射到对用户更友好的描述,比如 “Shared EXT3 filesystem”。通常 warnquota 会作为 cron 作业来定期运行。请参阅 cronwarnquota 的手册页了解有关的更多信息。

对 Linux 上的配额的介绍到此就结束了。

本文翻译自:Learn Linux, 101: Manage disk quotas(2016-05-05)