全新的 developerWorks Premium 会员计划提供了强大的开发工具和资源,包括 500 篇通过 Safari Books Online 提供的顶级技术文章(其中数十篇文章是专门针对 Linux 开发人员的)、最重要开发人员活动的大幅折扣、最新的 O'Reilly 大会的视频录像,等等。立即注册。
在本教程中,学习管理用户的磁盘配额。学习:
本教程可以帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 104 中的目标 104.4 进行应考准备。该目标的权重为 1。
配额允许您按用户或组来控制磁盘使用。配额可预防用户和组使用文件系统中超出允许范围的磁盘空间,或者预防将文件系统完全填满。XFS 文件系统还支持项目配额,这可以限制项目使用的空间量,无论哪些用户在项目的目录树中创建文件。
本教程系列帮助学习 Linux 系统管理任务。您还可以使用这些教程中的资料来对 Linux Professional Institute 的 LPIC-1:Linux 服务器专业认证考试 进行应考准备。
请参阅 “ 学习 Linux,101 :LPIC-1 学习路线图 ”,查看本系列中每部教程的描述和链接。这个路线图仍在开发中,目前反映的最新内容是在 2015 年 4 月 15 日更新的 4.0 版 LPIC-1 考试目标。一旦完成这些教程后,我们会将它们添加到路线图中。
配额必须由根用户或具有根用户权限的用户启用和管理。它们通常用在多用户系统上,较少用在单用户工作站上。
本教程将介绍非 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 组中的用户可以创建文件和目录。清单 2展示了如何设置所有权和权限。
[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 树,如 清单 3所示。请参阅 man
页面,了解其他重新标记方式,包括在下次引导时重新标记整个文件系统。
[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 组的成员。
如果您使用的是桌面系统,那么您可能尚未安装配额包,因为通常的默认桌面安装中不包含配额。使用 dpkg
或 rpm
检查该包是否已安装,如 清单 4所示。
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 种不同类型的配额支持:
配额需要高于 2.4 的内核中引入的内核支持。2.6 内核拥有您需要的支持。
XFS 配额始终具有日志功能。内核 2.6.11 及更高版本支持带日志的第 2 版配额。
第 1 版配额支持有时称为 vfsold ,而第 2 版配额支持有时称为 vfsv0 (32 位 UID/GID、64 位空间使用、32 位 inode 使用和限制)或 vfsv1 (64 位配额限制和使用)。
启用配额的下一步是根据您希望实现用户配额、组配额还是二者都实现,向 /etc/fstab 中的文件系统定义添加合适的选项。XFS 文件系统也支持项目配额。
在撰写本文时,没有明显的手册页集中介绍启用配额的选项。表 1显示了可用的选项和它们用于的配额系统类型。
选项 | 适用于 | 用途 |
---|---|---|
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 条目如 清单 5所示。
/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
命令的一些常见选项:
清单 6显示了卸载文件系统,然后使用来自 /etc/fstab 的定义重新挂载它们,然后在我们重新挂载的文件系统上运行 quotacheck
命令的结果。如果您不使用 -a
选项,必须指定您想要检查的文件系统。
[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 上下文。请返回检查。
请注意,来自 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
命令关闭配额检查。清单 7显示了这些命令的示例。
[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 文件系统,默认情况下已开启配额检查,除非该文件是使用 uqnoenforce
、 gqnoenforce
或 pqnoenforce
选项挂载的。使用 xfs_quota
命令和 -x
(表示 专家 )选项来处理 xfs 配额。没有 -x
选项,您只能显示配额信息。该命令有多个子命令,包括 help
显示可用子命令列表, state
显示整体状态, enable
启用配额检查, disable
禁用配额检查。选项 -u
、 -g
和 -p
分别将操作限制到用户、组或项目。使用 -v
获得详细输出。还可以在命令行模式下运行该命令,使用 -c
选项来指定各个子命令。您可以为多个子命令指定此选项多次。如果指定子命令的选项,可能需要将您的命令放在引号中。一些示例如 清单 8所示。
[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]
尽管这超出了本教程的讨论范围,但 quotacheck
和 quotaon
命令通常包含在初始化脚本中,以便在您重新引导系统时启用配额。 配额简要操作技巧 提供了更多信息。如果您使用的是带日志的配额,那么您可能不需要在引导时运行 quotacheck
。
您已经看到,配额由文件系统根目录中的二进制文件或通过文件系统元数据进行控制。要为一个特定用户设置配额,可以使用 edquota
命令。此命令从各种启用了配额的文件系统提取该用户的配额信息,创建临时文件,然后为您打开一个编辑器来调节配额。默认情况下, edquota
使用 vi 编辑器。如果您希望使用不同的编辑器,可以设置 EDITOR 或 VISUAL 环境变量。要编辑用户配额,可使用 -u
选项(默认)和一个或多个用户名。要编辑组配额,可以使用 -g
和一个或多个组名称。
只有根用户才能编辑配额。如果使用 vi 作为编辑器,显示的信息将会类似于 清单 9。
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
在 清单 9中可以看到, edquota
显示了我当前在每个开启了配额的文件系统上的 1K 块和 inode 使用情况。块和 inode 使用也有软性和硬性限制。在这个示例中,这些限制为 0,表示没有执行配额限制。
超出软性限制值后,用户会收到有关超出配额的电子邮件警告。用户不得超出硬性限制值。您可以将块限制视为用户可以存储的数据量的大体限制,将 inode 限制视为文件和目录数的限制。
您可以通过更改该临时文件中的值,然后保存该文件来更改配额限制。如果不想执行更改,可以退出该文件而不进行保存。我们将在示例中使用非常小的限制,使您能够轻松地看到效果。假设您想将我的配额设置为每个测试的文件系统上 10MB 数据和 50 个文件。硬性限制允许超出 10%,可以如 清单 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 的配额值作为其他用户的 原型 ,如 清单 11所示。
[root@attic4-cent ~]# edquota -p ian mary jenni
还可以使用 edquota
基于文件的组所有权来限制磁盘空间的分配。例如,上述 3 位开发人员都是 development 组的成员。要将该组的所有成员使用的总量限制为 250MB 和 100 个文件,可以使用命令 edquota -g development
并按 清单 12所示来设置该值。
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。还记得吗,在中我们使用了 chown
和 chmod
将所有新文件的默认组设置为 development 组?这也适用于这两个配额数据库文件。您可以将这些文件更改到根的组中,如 清单 13所示。一定要关闭配额检查后再执行更改,然后再打开它。
[root@attic4-cent ~]# quotaoff /quotatest/ext4/ [root@attic4-cent ~]# chown :root /quotatest/ext4/aquota.* [root@attic4-cent ~]# quotaon /quotatest/ext4
用户或组可能超出它们的 宽限期 软性限制,该限制的默认值为 7 天。宽限期结束后,软性限制将作为硬性限制来执行。达到硬性限制后,必须删除一些文件才能创建新文件。使用 edquota -t
设置宽限期。同样地,您将在一个编辑器中看到类似 清单 14的数据。和之前一样,保存更改来更新这些值。请确保为您的用户留出了接收其警告电子邮件的足够时间并相应地删除一些文件。
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
选项显示所有已启用配额的文件系统的信息。根用户还可以向该命令添加用户名来查看特定用户的配额。在 清单 15中,我们在 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
命令,则有可能看到临时显示了稍微更大的块数。
清单 16展示了您超出软性限制时会发生的情况和超出硬性限制时会发生的情况。在这个示例中,我们向已创建的 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 个空文件。清单 17显示了结果。
[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
命令生成配额报告。清单 18展示了如何查看 /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
请注意,清单 18中针对用户 ian 和 jenni 和组 development 的加号表示它们现在都已 超出配额。用户 ian 拥有太多数据。用户 jenni 拥有太多文件。组 development 也拥有太多文件。
与其他配额命令一样, -a
选项生成所有已启用配额的已挂载文件系统的报告。 -v
选项生成更详细的输出。 -n
选项生成按数值用户编号排列的列表,未将用户编号解析为名称。这可以提升大型报告的性能,但通常对人类读者没什么用。
xfs 配额系统也支持项目配额,它是组配额的一种替代选择。您不能在一个 XFS 文件系统上同时使用组和项目配额。项目配额必须通过将 prjquota
(或 pquota
)添加到 /etc/fstab 来启用。
项目配额使用数值 id 的概念和一个更具描述性的项目名称。文件 /etc/projects 用于将数值项目标识符映射到目录树,而文件 /etc/projid 将数值项目标识符映射到项目名称。/etc 中没有这两个文件也可以操作,只是不太方便。请参阅手册页了解有关的详细信息。
要设置项目配额,必须在专家模式下( -x
选项)使用 xfs_quota
命令。首先您必须使用带 -s
选项的 project
子命令,通过将所有受影响的 inode 标记为该项目的一部分来设置项目配额。然后使用 limit
子命令设置硬性或软性限制。清单 19展示了如何在 /quotatest/xfs/proj-dir1 设置一个具有 15MB 项目硬性限制的项目树。出于演示目的,我们还将设置一个没有限制的并行的 /quotatest/xfs/proj-dir2。
[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 或组设置任何配额。清单 20表明 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
作业来定期运行。请参阅 cron
和 warnquota
的手册页了解有关的更多信息。
对 Linux 上的配额的介绍到此就结束了。