14.1 磁盘配额 (Quota) 的应用与实作

Quota 这个玩意儿就字面上的意思来看,就是有多少“限额”的意思啦!如果是用在零用钱上面, 就是类似“有多少零用钱一个月”的意思之类的。如果是在计算机主机的磁盘使用量上呢?以 Linux 来说,就是有多少容量限制的意思啰。我们可以使用 quota 来让磁盘的容量使用较为公平, 下面我们会介绍什么是 quota ,然后以一个完整的范例来介绍 quota 的实作喔!

14.1.1 什么是 Quota

在 Linux 系统中,由于是多用户多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生, 如果其中有少数几个使用者大量的占掉了硬盘空间的话,那势必压缩其他使用者的使用权力! 因此管理员应该适当的限制硬盘的容量给使用者,以妥善的分配系统资源!避免有人抗议呀!

举例来说,我们使用者的默认主文件夹都是在 /home 下面,如果 /home 是个独立的 partition , 假设这个分区有 10G 好了,而 /home 下面共有 30 个帐号,也就是说,每个使用者平均应该会有 333MB 的空间才对。 偏偏有个使用者在他的主文件夹下面塞了好多只影片,占掉了 8GB 的空间,想想看,是否造成其他正常使用者的不便呢? 如果想要让磁盘的容量公平的分配,这个时候就得要靠 quota 的帮忙啰!

  • Quota 的一般用途 [1]

quota 比较常使用的几个情况是:

  • 针对 WWW server ,例如:每个人的网页空间的容量限制!
  • 针对 mail server,例如:每个人的邮件空间限制。
  • 针对 file server,例如:每个人最大的可用网络硬盘空间 (教学环境中最常见!)

上头讲的是针对网络服务的设计,如果是针对 Linux 系统主机上面的设置那么使用的方向有下面这一些:

  • 限制某一群组所能使用的最大磁盘配额 (使用群组限制): 你可以将你的主机上的使用者分门别类,有点像是目前很流行的付费与免付费会员制的情况, 你比较喜好的那一群的使用配额就可以给高一些!呵呵! ^_^...

  • 限制某一使用者的最大磁盘配额 (使用使用者限制): 在限制了群组之后,你也可以再继续针对个人来进行限制,使得同一群组之下还可以有更公平的分配!

  • 限制某一目录 (directory, project) 的最大磁盘配额: 在旧版的 CentOS 当中,使用的默认文件系统为 EXT 家族,这种文件系统的磁盘配额主要是针对整个文件系统来处理,所以大多针对“挂载点”进行设计。 新的 xfs 可以使用 project 这种模式,就能够针对个别的目录 (非文件系统喔) 来设计磁盘配额耶!超棒的!

大概有这些实际的用途啦!基本上,quota 就是在回报管理员磁盘使用率以及让管理员管理磁盘使用情况的一个工具就是了! 比较特别的是,XFS 的 quota 是整合到文件系统内,并不是其他外挂的程序来管理的,因此,通过 quota 来直接回报磁盘使用率,要比 unix 工具来的快速! 举例来说, du 这东西会重新计算目录下的磁盘使用率,但 xfs 可以通过 xfs_quota 来直接回报各目录使用率,速度上是快非常多!

  • Quota 的使用限制

虽然 quota 很好用,但是使用上还是有些限制要先了解的:

  • 在 EXT 文件系统家族仅能针对整个 filesystem: EXT 文件系统家族在进行 quota 限制的时候,它仅能针对整个文件系统来进行设计,无法针对某个单一的目录来设计它的磁盘配额。 因此,如果你想要使用不同的文件系统进行 quota 时,请先搞清楚该文件系统支持的情况喔!因为 XFS 已经可以使用 project 模式来设计不同目录的磁盘配额。

  • 核心必须支持 quota : Linux 核心必须有支持 quota 这个功能才行:如果你是使用 CentOS 7.x 的默认核心, 嘿嘿!那恭喜你了,你的系统已经默认有支持 quota 这个功能啰!如果你是自行编译核心的, 那么请特别留意你是否已经“真的”打开了 quota 这个功能?否则下面的功夫将全部都视为“白工”。

  • 只对一般身份使用者有效: 这就有趣了!并不是所有在 Linux 上面的帐号都可以设置 quota 呢,例如 root 就不能设置 quota , 因为整个系统所有的数据几乎都是他的啊! ^_^

  • 若启用 SELinux,非所有目录均可设置 quota : 新版的 CentOS 默认都有启用 SELinux 这个核心功能,该功能会加强某些细部的权限控制!由于担心管理员不小心设置错误,因此默认的情况下, quota 似乎仅能针对 /home 进行设置而已~因此,如果你要针对其他不同的目录进行设置,请参考到后续章节查阅解开 SELinux 限制的方法喔! 这就不是 quota 的问题了...

新版的 CentOS 使用的 xfs 确实比较有趣!不但无须额外的 quota 纪录档,也能够针对文件系统内的不同目录进行配置!相当有趣! 只是不同的文件系统在 quota 的处理情况上不太相同,因此这里要特别强调,进行 quota 前,先确认你的文件系统吧!

  • Quota 的规范设置项目:

quota 这玩意儿针对 XFS filesystem 的限制项目主要分为下面几个部分:

  • 分别针对使用者、群组或个别目录 (user, group & project):

XFS 文件系统的 quota 限制中,主要是针对群组、个人或单独的目录进行磁盘使用率的限制!

  • 容量限制或文件数量限制 (block 或 inode):

我们在第七章谈到文件系统中,说到文件系统主要规划为存放属性的 inode 与实际文件数据的 block 区块,Quota 既然是管理文件系统,所以当然也可以管理 inode 或 block 啰! 这两个管理的功能为:

  • 限制 inode 用量:可以管理使用者可以创建的“文件数量”;
  • 限制 block 用量:管理使用者磁盘容量的限制,较常见为这种方式。

  • 柔性劝导与硬性规定 (soft/hard):

既然是规范,当然就有限制值。不管是 inode/block ,限制值都有两个,分别是 soft 与 hard。 通常 hard 限制值要比 soft 还要高。举例来说,若限制项目为 block ,可以限制 hard 为 500MBytes 而 soft 为 400MBytes。这两个限值的意义为:

  • hard:表示使用者的用量绝对不会超过这个限制值,以上面的设置为例, 使用者所能使用的磁盘容量绝对不会超过 500MBytes ,若超过这个值则系统会锁住该用户的磁盘使用权;
  • soft:表示使用者在低于 soft 限值时 (此例中为 400MBytes),可以正常使用磁盘,但若超过 soft 且低于 hard 的限值 (介于 400~500MBytes 之间时),每次使用者登陆系统时,系统会主动发出磁盘即将爆满的警告讯息, 且会给予一个宽限时间 (grace time)。不过,若使用者在宽限时间倒数期间就将容量再次降低于 soft 限值之下, 则宽限时间会停止。

  • 会倒数计时的宽限时间 (grace time):

刚刚上面就谈到宽限时间了!这个宽限时间只有在使用者的磁盘用量介于 soft 到 hard 之间时,才会出现且会倒数的一个咚咚! 由于达到 hard 限值时,使用者的磁盘使用权可能会被锁住。为了担心使用者没有注意到这个磁盘配额的问题, 因此设计了 soft 。当你的磁盘用量即将到达 hard 且超过 soft 时,系统会给予警告,但也会给一段时间让使用者自行管理磁盘。 一般默认的宽限时间为七天,如果七天内你都不进行任何磁盘管理,那么 soft 限制值会即刻取代 hard 限值来作为 quota 的限制。

以上面设置的例子来说,假设你的容量高达 450MBytes 了,那七天的宽限时间就会开始倒数, 若七天内你都不进行任何删除文件的动作来替你的磁盘用量瘦身, 那么七天后你的磁盘最大用量将变成 400MBytes (那个 soft 的限制值),此时你的磁盘使用权就会被锁住而无法新增文件了。

整个 soft, hard, grace time 的相关性我们可以用下面的图示来说明:

soft, hard, grace time 的相关性图14.1.1、soft, hard, grace time 的相关性

图中的长条图为使用者的磁盘容量,soft/hard 分别是限制值。只要小于 400M 就一切 OK , 若高于 soft 就出现 grace time 并倒数且等待使用者自行处理,若到达 hard 的限制值, 那我们就搬张小板凳等着看好戏啦!嘿嘿!^_^!这样图示有清楚一点了吗?

14.1.2 一个 XFS 文件系统的 Quota 实作范例

坐而言不如起而行啊,所以这里我们使用一个范例来设计一下如何处理 Quota 的设置流程。

  • 目的与帐号:现在我想要让我的专题生五个为一组,这五个人的帐号分别是 myquota1, myquota2, myquota3, myquota4, myquota5,这五个用户的密码都是 password ,且这五个用户所属的初始群组都是 myquotagrp 。 其他的帐号属性则使用默认值。

  • 帐号的磁盘容量限制值:我想让这五个用户都能够取得 300MBytes 的磁盘使用量(hard),文件数量则不予限制。 此外,只要容量使用率超过 250MBytes ,就予以警告 (soft)。

  • 群组的限额 (option 1):由于我的系统里面还有其他用户存在,因此我仅承认 myquotagrp 这个群组最多仅能使用 1GBytes 的容量。 这也就是说,如果 myquota1, myquota2, myquota3 都用了 280MBytes 的容量了,那么其他两人最多只能使用 (1000MB - 280x3 = 160MB) 的磁盘容量啰!这就是使用者与群组同时设置时会产生的后果。

  • 共享目录限额 (option 2):另一种设置方式,每个用户还是具有自己独立的容量限止,但是这五个人的专题共享目录在 /home/myquota 这里,该目录请设置为其他人没有任何权限的共享目录空间,仅有 myquotagrp 群组拥有全部的权限。 且无论如何,该目录最多仅能够接受 500MBytes 的容量。请注意,群组 (group) 的限制与目录 (directory/project) 无法同时并存喔! 所以下面的流程中,我们会先以群组来设计,然后再以目录限制来进一步说明!

  • 宽限时间的限制:最后,我希望每个使用者在超过 soft 限制值之后,都还能够有 14 天的宽限时间。

好了,那你怎么规范帐号以及相关的 Quota 设置呢?首先,在这个小节我们先来将帐号相关的属性、参数及其他环境搞定再说吧!

# 制作帐号环境时,由于有五个帐号,因此鸟哥使用 script 来创建环境!
[root@study ~]# vim addaccount.sh
#!/bin/bash
# 使用 script 来创建实验 quota 所需的环境
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do
    useradd -g myquotagrp $username
    echo "password" | passwd --stdin $username
done
mkdir /home/myquota
chgrp myquotagrp /home/myquota
chmod 2770 /home/myquota

[root@study ~]# sh addaccount.sh

接下来,就让我们来实作 Quota 的练习吧!

14.1.3 实作 Quota 流程-1:文件系统的支持与观察

前面我们就谈到,要使用 Quota 必须要核心与文件系统支持才行!假设你已经使用了默认支持 Quota 的核心, 那么接下来就是要启动文件系统的支持啦!但是要注意,我们这边是以 XFS 文件系统为例的,如果你使用的是 EXT 家族,请找前一版的书籍说明喔! 此外,不要在根目录下面进行 quota 设计喔!因为文件系统会变得太复杂!因此,下面我们是以 /home 这个 xfs 文件系统为例的! 当然啦,首先就是要来检查看看!

[root@study ~]# df -hT /home
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-home xfs   5.0G   67M  5.0G   2% /home

从上面的数据来看,鸟哥这部主机的 /home 确实是独立的 filesystem,而且确实是使用了 xfs 文件系统!所以可以使用下面的流程啰! 此外,由于 VFAT 文件系统并不支持 Linux Quota 功能,所以我们得要使用 mount 查询一下 /home 的文件系统为何才行啊!

在过去的版本中,管理员似乎可以通过 mount -o remount 的机制来重新挂载启动 quota 的功能,不过 XFS 文件系统的 quota 似乎是在挂载之初就宣告了, 因此无法使用 remount 来重新启动 quota 功能,一定得要写入 /etc/fstab 当中,或者是在初始挂载过程中加入这个项目, 否则不会生效喔!那就来瞧瞧鸟哥改了 fstab 成为怎样吧!

[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home  /home  xfs  defaults,usrquota,grpquota   0 0
# 其他项目鸟哥并没有列出来!重点在于第四字段!于 default 后面加上两个参数!

[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)

基本上,针对 quota 限制的项目主要有三项,如下所示:

  • uquota/usrquota/quota:针对使用者帐号的设置
  • gquota/grpquota:针对群组的设置
  • pquota/prjquota:针对单一目录的设置,但是不可与 grpquota 同时存在!

还是要再次的强调,修改完 /etc/fstab 后,务必要测试一下!若有发生错误得要赶紧处理! 因为这个文件如果修改错误,是会造成无法开机完全的情况啊!切记切记!最好使用 vim 来修改啦! 因为会有语法的检验,就不会让你写错字了!此外,由于一般用户的主文件夹在 /home 里面,因此针对这个项目的卸载时, 一定要将所有一般帐号的身份登出,否则肯定无法卸载喔!留意留意!

14.1.4 实作 Quota 流程-2:观察 Quota 报告数据

制作文件系统支持之后,当然得要来瞧一瞧到底有没有正确的将 quota 的管理数据列出来才好!这时我们得要使用 xfs_quota 这个指令才行!这个指令真的是挺复杂的,因为全部的 quota 实作都是这个指令耶!所以里面的参数有够多! 不过稍微观察一下即可!先让我们来谈谈观察目前 quota 的报告内容吧!

[root@study ~]# xfs_quota -x -c "指令" [挂载点]
选项与参数:
-x  :专家模式,后续才能够加入 -c 的指令参数喔!
-c  :后面加的就是指令,这个小节我们先来谈谈数据回报的指令
指令:
      print :单纯的列出目前主机内的文件系统参数等数据
      df    :与原本的 df 一样的功能,可以加上 -b (block) -i (inode) -h (加上单位) 等
      report:列出目前的 quota 项目,有 -ugr (user/group/project) 及 -bi 等数据
      state :说明目前支持 quota 的文件系统的信息,有没有起动相关项目等

范例一:列出目前系统的各的文件系统,以及文件系统的 quota 挂载参数支持
[root@study ~]# xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/centos-root
/srv/myproject      /dev/vda4
/boot               /dev/vda2
/home               /dev/mapper/centos-home (uquota, gquota)  # 所以这里就有显示支持啰

范例二:列出目前 /home 这个支持 quota 的载点文件系统使用情况
[root@study ~]# xfs_quota -x -c "df -h" /home
Filesystem     Size   Used  Avail Use% Pathname
/dev/mapper/centos-home
               5.0G  67.0M   4.9G   1% /home
# 如上所示,其实跟原本的 df 差不多啦!只是会更正确就是了。

范例三:列出目前 /home 的所有用户的 quota 限制值
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root           4K      0      0  00 [------]      4      0      0  00 [------]
dmtsai      34.0M      0      0  00 [------]    432      0      0  00 [------]
.....(中间省略).....
myquota1      12K      0      0  00 [------]      7      0      0  00 [------]
myquota2      12K      0      0  00 [------]      7      0      0  00 [------]
myquota3      12K      0      0  00 [------]      7      0      0  00 [------]
myquota4      12K      0      0  00 [------]      7      0      0  00 [------]
myquota5      12K      0      0  00 [------]      7      0      0  00 [------]
# 所以列出了所有用户的目前的文件使用情况,并且列出设置值。注意,最上面的 Block
# 代表这个是 block 容量限制,而 inode 则是文件数量限制喔。另外,soft/hard 若为 0,代表没限制

范例四:列出目前支持的 quota 文件系统是否有起动了 quota 功能?
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON    # 有启用计算功能
  Enforcement: ON   # 有实际 quota 管制的功能
  Inode: #1568 (4 blocks, 4 extents)  # 上面四行说明的是有启动 user 的限制能力
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1569 (5 blocks, 5 extents)  # 上面四行说明的是有启动 group 的限制能力
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #1569 (5 blocks, 5 extents)  # 上面四行说明的是 project 并未支持
Blocks grace time: [7 days 00:00:30]  # 下面则是 grace time 的项目
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

在默认的情况下, xfs_quota 的 report 指令会将支持的 user/group/prject 相关数据列出来,如果只是想要某个特定的项目, 例如我们上面要求仅列出用户的数据时,就在 report 后面加上 -u 即可喔!这样就能够观察目前的相关设置信息了。 要注意,限制的项目有 block/inode 同时可以针对每个项目来设置 soft/hard 喔!接下来实际的设置看看吧!

14.1.5 实作 Quota 流程-3:限制值设置方式

确认文件系统的 quota 支持顺利启用后,也能够观察到相关的 quota 限制,接下来就是要实际的给予用户/群组限制啰! 回去瞧瞧,我们需要每个用户 250M/300M 的容量限制,群组共 950M/1G 的容量限制,同时 grace time 设置为 14 天喔! 实际的语法与设置流程来瞧瞧:

[root@study ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[root@study ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
选项与参数:
limit :实际限制的项目,可以针对 user/group 来限制,限制的项目有
        bsoft/bhard : block 的 soft/hard 限制值,可以加单位
        isoft/ihard : inode 的 soft/hard 限制值
        name        : 就是用户/群组的名称啊!
timer :用来设置 grace time 的项目喔,也是可以针对 user/group 以及 block/inode 设置

范例一:设置好用户们的 block 限制值 (题目中没有要限制 inode 啦!)
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1      12K   250M   300M  00 [------]      7      0      0  00 [------]

范例二:设置好 myquotagrp 的 block 限制值
[root@study ~]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
[root@study ~]# xfs_quota -x -c "report -gbih" /home
Group quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp    60K   950M     1G  00 [------]     36      0      0  00 [------]

范例三:设置一下 grace time 变成 14 天吧!
[root@study ~]# xfs_quota -x -c "timer -ug -b 14days" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
.....(中间省略).....
Blocks grace time: [14 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

范例四:以 myquota1 用户测试 quota 是否真的实际运行呢?
[root@study ~]# su - myquota1
[myquota1@study ~]$ dd if=/dev/zero of=123.img bs=1M count=310
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 Bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[myquota1@study ~]$ ll -h
-rw-r--r--. 1 myquota1 myquotagrp 300M Jul 24 21:38 123.img

[myquota1@study ~]$ exit
[root@study ~]# xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquota1     300M   250M   300M  00 [13 days]
myquota2      12K   250M   300M  00 [------]
# 因为 myquota1 的磁盘用量已经破表,所以当然就会出现那个可怕的 grace time 啰!

这样就直接制做好 quota 啰!看起来也是挺简单啦!

14.1.6 实作 Quota 流程-4:project 的限制 (针对目录限制) (Optional)

现在让我们来想一想,如果需要限制的是目录而不是群组时,那该如何处理呢?举例来说,我们要限制的是 /home/myquota 这个目录本身, 而不是针对 myquotagrp 这个群组啊!这两种设置方法的意义不同喔!例如,前一个小节谈到的测试范例来说, myquota1 已经消耗了 300M 的容量,而 /home/myquota 其实还没有任何的使用量 (因为在 myquota1 的主文件夹做的 dd 指令)。 不过如果你使用了 xfs_quota -x -c "report -h" /home 这个指令来查看,就会发现其实 myquotagrp 已经用掉了 300M 了! 如此一来,对于目录的限制来说,就不会有效果!

为了解决这个问题,因此我们这个小节要来设置那个很有趣的 project 项目!只是这个项目不可以跟 group 同时设置喔! 因此我们得要取消 group 设置并且加入 project 设置才行。那就来实验看看。

  • 修改 /etc/fstab 内的文件系统支持参数

首先,要将 grpquota 的参数取消,然后加入 prjquota ,并且卸载 /home 再重新挂载才行!那就来测试看看!

# 1\. 先修改 /etc/fstab 的参数,并启动文件系统的支持
[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs  defaults,usrquota,grpquota,prjquota  0 0
# 记得, grpquota 与 prjquota 不可同时设置喔!所以上面删除 grpquota 加入 prjquota

[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF         <==已经取消啰!
  Enforcement: OFF
  Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON          <==确实启动啰!
  Enforcement: ON
  Inode: N/A
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]
  • 规范目录、专案名称(project)与专案 ID

目录的设置比较奇怪,他必须要指定一个所谓的“专案名称、专案识别码”来规范才行!而且还需要用到两个配置文件! 这个让鸟哥觉得比较怪一些就是了。现在,我们要规范的目录是 /home/myquota 目录,这个目录我们给个 myquotaproject 的专案名称, 这个专案名称给个 11 的识别码,这个都是自己指定的,若不喜欢就自己指定另一个吧!鸟哥的指定方式如下:

# 2.1 指定专案识别码与目录的对应在 /etc/projects
[root@study ~]# echo "11:/home/myquota" >> /etc/projects

# 2.2 规范专案名称与识别码的对应在 /etc/projid
[root@study ~]# echo "myquotaproject:11" >> /etc/projid

# 2.3 初始化专案名称
[root@study ~]# xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion 
depth infinite (-1).    # 会闪过这些讯息!是 OK 的!别担心!

[root@study ~]# xfs_quota -x -c "print " /home
Filesystem          Pathname
/home               /dev/mapper/centos-home (uquota, pquota)
/home/myquota       /dev/mapper/centos-home (project 11, myquotaproject)
# 这个 print 功能很不错!可以完整的查看到相对应的各项文件系统与 project 目录对应!

[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
Project ID       Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject      0      0      0  00 [------]      1      0      0  00 [------]
# 喔耶!确定有抓到这个专案名称啰!接下来准备设置吧!
  • 实际设置规范与测试

依据本章的说明,我们要将 /home/myquota 指定为 500M 的容量限制,那假设到 450M 为 soft 的限制好了! 那么设置就会变成这样啰:

# 3.1 先来设置好这个 project 吧!设置的方式同样使用 limit 的 bsoft/bhard 喔!:
[root@study ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
                            Blocks                            Inodes
Project ID       Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject      0   450M   500M  00 [------]      1      0      0  00 [------]

[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 Bytes (524 MB) copied, 0.96296 s, 544 MB/s
# 你看!连 root 在该目录下面创建文件时,也会被挡掉耶!这才是完整的针对目录的规范嘛!赞!

这样就设置好了啰!未来如果你还想要针对某些个目录进行限制,那么就修改 /etc/projects, /etc/projid 设置一下规范, 然后直接处理目录的初始化与设置,就完成设置了!好简单!

当鸟哥跟同事分享这个 project 的功能时,强者我同事蔡董大大说,刚刚好!他有些朋友要求在 WWW 的服务中,要针对某些目录进行容量的限制! 但是因为容量之前仅针对用户进行限制,如此一来,由于 WWW 服务都是一个名为 httpd 的帐号管理的,因此所有 WWW 服务所产生的文件数据, 就全部属于 httpd 这个帐号,那就无法针对某些特定的目录进行限制了。有了这个 project 之后,就能够针对不同的目录做容量限制! 而不用管在里头创建文件的文件拥有者!哇!这真是太棒了!实务应用给各位了解啰! ^_^

14.1.7 XFS quota 的管理与额外指令对照表

不管多完美的系统,总是需要可能的突发状况应付手段啊!所以,接下来我们就来谈谈,那么万一如果你需要暂停 quota 的限制, 或者是重新启动 quota 的限制时,该如何处理呢?还是使用 xfs_quota 啦!增加几个内部指令即可:

  • disable:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能啰!
  • enable:就是回复到正常管制的状态中,与 disable 可以互相取消、启用!
  • off:完全关闭 quota 的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota 喔!也就是说, 用了 off 状态后,你无法使用 enable 再次复原 quota 的管制喔!注意不要乱用这个状态!一般建议用 disable 即可,除非你需要执行 remove 的动作!
  • remove:必须要在 off 的状态下才能够执行的指令~这个 remove 可以“移除”quota 的限制设置,例如要取消 project 的设置, 无须重新设置为 0 喔!只要 remove -p 就可以了!

现在就让我们来测试一下管理的方式吧:

# 1\. 暂时关闭 XFS 文件系统的 quota 限制功能
[root@study ~]# xfs_quota -x -c "disable -up" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
 Accounting: ON
  Enforcement: OFF   <== 意思就是有在计算,但没有强制管制的意思
  Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
 Accounting: ON
  Enforcement: OFF
  Inode: N/A
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]

[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
520+0 records in
520+0 records out  # 见鬼!竟然没有任何错误发生了!
545259520 Bytes (545 MB) copied, 0.308407 s, 180 MB/s

[root@study ~]# xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID       Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquotaproject   520M   450M   500M  00 [-none-]
# 其实,还真的有超过耶!只是因为 disable 的关系,所以没有强制限制住就是了!

[root@study ~]# xfs_quota -x -c "enable -up" /home  # 重新启动 quota 限制
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
dd: error writing ‘/home/myquota/123.img’: No space left on device
# 又开始有限制!这就是 enable/disable 的相关对应功能喔!暂时关闭/启动用的!

# 完全关闭 quota 的限制行为吧!同时取消 project 的功能试看看!
[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 您瞧瞧!没有办法重新启动!因为已经完全的关闭了 quota 的功能!所以得要 umouont/mount 才行!

[root@study ~]# umount /home; mount -a
# 这个时候使用 report 以及 state 时,管制限制的内容又重新回来了!好!来瞧瞧如何移除project

[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "remove -p" /home
[root@study ~]# umount /home; mount -a
[root@study ~]# xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID       Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquotaproject   500M      0      0  00 [------]
# 嘿嘿!全部归零!就是“移除”所有限制值的意思!

请注意上表中最后一个练习,那个 remove -p 是“移除所有的 project 控制列表”的意思!也就是说,如果你有在 /home 设置多个 project 的限制, 那么 remove 会删的一个也不留喔!如果想要回复设置值,那...只能一个一个重新设置回去了!没有好办法!

上面就是 XFS 文件系统的简易 quota 处理流程~那如果你是使用 EXT 家族呢?能不能使用 quota 呢?除了参考上一版的文件之外,鸟哥这里也列出相关的参考指令/设置文件给你对照参考! 没学过的可以看看流程,有学过的可以对照了解! ^_^

设置流程项目 XFS文件系统 EXT家族
/etc/fstab参数设置 usrquota/grpquota/prjquota usrquota/grpquota
quota 配置文件 不需要 quotacheck
设置用户/群组限制值 xfs_quota -x -c "limit..." edquota 或 setquota
设置 grace time xfs_quota -x -c "timer..." edquota
设置目录限制值 xfs_quota -x -c "limit..."
观察报告 xfs_quota -x -c "report..." repquota 或 quota
启动与关闭 quota 限制 xfs_quota -x -c "[disable|enable]..." quotaoff, quotaon
发送警告信给用户 目前版本尚未支持 warnquota

14.1.8 不更动既有系统的 quota 实例

想一想,如果你的主机原先没有想到要设置成为邮件主机,所以并没有规划将邮件信箱所在的 /var/spool/mail/ 目录独立成为一个 partition ,然后目前你的主机已经没有办法新增或分区出任何新的分区了。那我们知道 quota 的支持与文件系统有关, 所以并无法跨文件系统来设计 quota 的 project 功能啊!因此,你是否就无法针对 mail 的使用量给予 quota 的限制呢?

此外,如果你想要让使用者的邮件信箱与主文件夹的总体磁盘使用量为固定,那又该如何是好? 由于 /home 及 /var/spool/mail 根本不可能是同一个 filesystem (除非是都不分区,使用根目录,才有可能整合在一起), 所以,该如何进行这样的 quota 限制呢?

其实没有那么难啦!既然 quota 是针对 filesystem 来进行限制,假设你又已经有 /home 这个独立的分区了,那么你只要:

  1. 将 /var/spool/mail 这个目录完整的移动到 /home 下面;
  2. 利用 ln -s /home/mail /var/spool/mail 来创建链接数据;
  3. 将 /home 进行 quota 限额设置

只要这样的一个小步骤,嘿嘿!您家主机的邮件就有一定的限额啰!当然啰!您也可以依据不同的使用者与群组来设置 quota 然后同样的以上面的方式来进行 link 的动作!嘿嘿嘿!就有不同的限额针对不同的使用者提出啰!很方便吧!^_^

鸟哥的图示

Tips 朋友们需要注意的是,由于目前新的 distributions 大多有使用 SELinux 的机制, 因此你要进行如同上面的目录搬移时,在许多情况下可能会有使用上的限制喔!或许你得要先暂时关闭 SELinux 才能测试, 也或许你得要自行修改 SELinux 的规则才行喔!