磁盘配额管理主要是指限制某些用户的可用磁盘空间,如针对提供虚拟主机的Web服务器,需要对网站空间大小进行限制;针对邮件服务器,需要对用户邮箱大小进行限制;针对文件服务器,需要对每个用户可用的网络硬盘空间进行限制等。

在Linux系统中,引入了quota磁盘配额功能,目的就是将用户对磁盘容量的使用限制在一个合理的水平,防止存储资源耗尽。

一、quota磁盘配额简介
 
quota磁盘配额功能只在指定的文件系统(分区)内有效,用户使用其它未设置配额的文件系统时,将不会受到限制。
quota主要针对系统中指定的用户账号、组账号进行限制,没有被设置限额的用户或组将不受影响。对组账号设置配额后,组内所有用户使用的磁盘容量、文件数量的总和不能超过限制。
通过设置磁盘配额可以对用户或组进行两方面的限制:磁盘容量、文件数量。
  • 磁盘容量:限制用户能够使用的磁盘数据块(block)大小,也就是限制磁盘空间大小,默认单位为KB。
  • 文件数量:限制用户能够拥有的文件个数。在Linux系统中,每一个文件都有一个对应的数字标记,称为i节点(inode)编号,这个编号在文件系统内是唯一的,因此quota通过限制i节点的数量来实现对文件数量的限制。
磁盘配额的限制方法分为软限制和硬限制两种。
  • 软限制:设定一个软性的配额数值(如400MB磁盘空间、150个文件),在固定的宽限期(默认为7天)内允许暂时超过这个限制,但系统会给出警告信息。
  • 硬限制:设定一个硬性的配额数值(如500MB磁盘空间、200个文件),而且绝对禁止用户超过该限值。当达到硬限制值时,系统也会给出警告并禁止继续写入数据。硬限制的配额值应大于相应的软限制值,否则软限制值将失效。
二、配置quota磁盘配额
 
在 RHEL6系统中,内核已经定制了支持Linux文件系统的磁盘配额功能,而且在系统中默认安装了quota软件包,因而只需直接设置启用该功能即可。
下面以在系统中已经创建好的磁盘分区“ /dev/sdb1”为例,将其挂载到“/data”目录,然后在该文件系统中配置实现磁盘配额功能。
 
1、启用quota磁盘配额功能
 
在 RHEL6系统中主要是通过修改配置文件“/etc/fstab”的方式启用quota磁盘配额功能,通过这种方式启用的磁盘配额功能可以永久生效。
修改“ /etc/fstab”,给需要设置配额的文件系统添加usrquota和grpquota选项。如图所示,在文件系统“/data”对应行的“defaults”字段后面添加“usrquota”,启用用户配额功能,添加“grpquota”启用组配额功能。
[root@localhost ~]# vim /etc/fstab                  ’修改配置文件

2、更新装载文件系统

修改完“ /etc/fstab”文件后需要将文件系统重新挂载,使设置生效。
[root@localhost ~]# mount -o remount /data          ’重新挂载文件系统
重新挂载后,执行 mount命令查看已经挂载的文件系统,发现成功启用了usrquota和grpquota功能:
[root@localhost ~]# mount | grep sdb1              ’查看已经挂载的文件系统
/dev/sdb1 on /data type ext4 (rw,usrquota,grpquota)
 
3、检测磁盘配额并生成配额文件
 
使用 quotacheck命令可以对文件系统进行磁盘配额检测,发现哪些文件系统启用了磁盘配额功能,并在这些文件系统中生成配额文件aquota.user和aquota.group,以便保存用户、组在该分区中的配额设置。
[root@localhost ~]# quotacheck -cuvg /data           ’检测磁盘配额并生成配额文件
相关选项的作用:
-c,创建配额文件。
-u,检查用户配额信息,创建 aquota.user文件。
-g,检查组配额信息,创建 aquota.group文件。
-v,显示详细信息。

注意,在采用默认设置的RHEL6系统中执行该命令时将产生“权限不够”的错误提示,如下图所示。

这是由于系统中默认启用了SELinux安全机制,将SELinux设为许可模式,再次执行命令,即可成功。

[root@localhost ~]# setenforce 0                 ’将SELinux设为许可模式
[root@localhost ~]# quotacheck -cuvg /data       ’再次执行quotacheck命令
命令执行成功后,会在“/data”目录中生成两个配额文件:aquota.user、atuota.group,分别用于保存用户和组的配额限制。
[root@localhost ~]# ls /data                     ’查看生成的配额文件
aquota.group aquota.user lost+found

4、编辑用户和组账号的配额设置
 
配额设置是实现磁盘配额功能中最重要的环节,使用 edquota命令结合“-u”、“-g”选项可用于编辑用户或组的配额设置。
例如,针对用户 jerry进行磁盘配额设置。
[root@localhost ~]# edquota -u jerry             ’设置用户 jerry的磁盘配额
正确执行 edquota命令后,将进入到文本编辑界面,可以设置磁盘容量和文件数目的软、硬限制数值,如下图所示。

在edquota的编辑界面中,第1行提示了当前配额文件所对应的用户或组账号,第2行是配置标题栏,分别对应以下每行配置记录。配置记录中从左到右分为七个字段,各字段的含义如下所述。

  • Filesystem:表示本行配置对应的文件系统(分区),即配额的作用范围。
  • blocks:表示用户当前已经使用的磁盘容量,默认单位为KB,该值由edquota程序自动计算生成。
  • inodes:表示用户当前已经拥有的文件数量,该数值也是由edquota程序自动计算生成。
  • soft:第3列中的soft对应为磁盘容量的软限制数值,默认单位为“KB”;第6列中的soft对应为文件数量的软限制数值,默认单位为“个”。
  • hard:第4列中的hard对应为磁盘容量的硬限制数值,默认单位为“KB”,第7列中的hard对应为文件数量的硬限制数值,默认单位为“个”。
进行配置设置时,只需要修改相应的 soft、hard列下的数值即可。另外,由于很少对用户的文件数量进行限制,所以主要是修改第3列和第4列中的软限制容量和硬限制容量。
这里将用户 jerry的磁盘容量软限额设置为400000(即400MB),硬限额设置为500000(即500MB),设置完成后保存退出。
也可以通过“ edquota –g”命令对用户组进行配额设置。例如,针对caiwu组进行磁盘配额设置,将其硬限额设置为4000000(即4GB)。
[root@localhost ~]# edquota -g caiwu             ’设置 caiwu组的磁盘配额

需要注意的是,配额设置仅对基本组生效。如用户jerry所属的基本组是“caiwu”,所属的附加组是“xiaoshou”,那么只有针对“caiwu”组设置的配额才对jerry有效,而针对“xiaoshou”组设置的配额则对jerry没有限制。

5、激活磁盘配额
 
磁盘配额设置完毕后,还必须用 quotaon命令将之激活,在命令中需要指定设备文件名或文件系统的挂载点目录作为命令参数。
[root@localhost ~]# quotaon -ugv /data      ’激活“ /data”文件系统的用户、组配额
/dev/sdb1 [/data]: group quotas turned on
/dev/sdb1 [/data]: user quotas turned on
相关选项的作用:
-u,激活用户磁盘配额。
-g,激活组磁盘配额。
-v,显示详细信息。
 
三、验证磁盘配额功能
 
使用受配额限制的用户账号 jerry登录Linux系统,并向应用了配额的文件系统进行复制文件等写入操作,测试所设置的磁盘配额项是否有效。为了方便测试,将用户jerry的基本组设为caiwu,对用户和组的磁盘配额功能一并进行测试。
 
[root@localhost ~]# usermod -g caiwu jerry     ’将 jerry用户的基本组设为caiwu
[root@localhost ~]# id jerry                   ’查看 jerry的用户信息
uid=604(jerry) gid=517(caiwu) 组 =517(caiwu)
[root@localhost ~]# chmod 777 /data            ’开放 /data目录的写入权限
[root@localhost ~]# su – jerry                ’切换到 jerry用户身份
[jerry@localhost ~]$ ll –h                     ’事先准备好的容量为 210MB的测试文件
总用量 210M
-rw-r--r--. 1 root root 210M 12月 12 07:50 test.data
[jerry@localhost ~]$ cp test.data /data        ’向 /data目录中复制测试文件
[jerry@localhost ~]$ cp test.data /data/test2.data    ’再次复制测试文件,开始报警
sdb1: warning, user block quota exceeded.
[jerry@localhost ~]$ cp test.data /data/test3.data    ’第三次复制测试文件,提示超出限额
sdb1: write failed, user block limit reached.
cp: 正在写入 "/data/test3.data": 超出磁盘限额
 
磁盘配额功能验证成功。
切换到 root用户身份,使用quota命令结合“-u”、“-g”选项可以分别查看指定用户和组的配额使用情况。
[root@localhost ~]# quota -u jerry        ’查看用户 jerry的磁盘配额使用情况

可以看到jerry所用的磁盘空间(blocks)已经达到了最大限额(limit)。

[root@localhost ~]# quota -g caiwu       ’查看caiwu组的磁盘配额使用情况

可以看到caiwu组所用的磁盘空间500000KB尚未达到最大限额4000000KB。

也可以使用 repquota命令针对指定的文件系统输出配额情况报告。
[root@localhost ~]# repquota /data       ’查看“ /data”文件系统的配额使用情况报告

从中可以看到有哪些用户在/data文件系统中被设置了磁盘配额,以及用户磁盘空间的使用情况。

最后需要强调的是, 由于root用户在Linux系统中具有至高无上的权限,所以quota磁盘配额对root是无效的。