# 磁盘配额(Quota)的应用于实践

Quota 字面意思是「限额」,对于磁盘来说就是限制容量的使用

# 什么是 Quota?

就是限制用户对磁盘容量的使用,不至于让其中某一个用户使用了大量的硬盘容量,导致其他用户不够用的情况

# Quota 的一般用途

针对网络服务的设计,比较常用的情况是:

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

针对 Linux 系统主机上面的使用者有如下常用情况:

  • 使用群组限制:限制某一群组所能使用的最大磁盘配额

  • 使用用户限制:限制某一用户的最大磁盘配额

  • 限制某一目录的最大磁盘配额

    在 EXT 家族文件系统的磁盘配额主要是针对整个文件系统来处理,所以大多针对挂载点进行设计。

    新的 xfs 可以使用 project 模式,可以针对个别的目录(非文件系统)来设计磁盘配额

基本上 qutoa 让管理员知道磁盘使用率以及管理磁盘使用情况的一个工具。比较特别的是 XFS 的 quota 是整合到文件系统内,并不是其他外挂程序来管理的。所以通过 quota 来直接回报磁盘使用率,要比 unix 工具快速。如 du会重新计算目录下的磁盘使用率,但 xfs 可以通过 xfs_quota 直接获得各个目录的使用率,速度要快很多

# Quota 的使用限制

  • EXT 文件系统家族只能针对整个 filesystem,xfs 可以使用 project 模式来为不同目录磁盘配额

  • 核心必须支持 quota

    Linux 核心必须有支持 quota 功能,CentOS7.x 预设支持 quota 功能

  • 只对一般身份使用者有效

    root 不能设置 quota,因为整个服务器数据都是他的

  • 若启用 SELinux,非所有目录均可设置 quota

    新版 CentOS 预设启用 SELinux 功能,该功能加强了某些细部的权限控制,所以预设情况下,只能针对 /home/进行配置 quota

    如果要针对其他目录配置 quota,后续章节会讲解怎么解开 SELinux 限制的方法

不同文件系统 quota 的处理不太一样,在 quota 前,先确认你的文件系统

# Quota 的规范设置项目

针对 XFS filesystem 的限制项目主要分为以下几部分:

  • 分别针对用户 user、群组 group、个别目录 project

    quota 的限制中,主要针对以上项进行磁盘使用率的限制

  • 容量限制 block 或文件数量 inode 限制

    第 7 章中说到,文件系统主要规划为存放属性的 inode 与实际文件数据的 block 区块。

    • 限制 inode 用量:限制可以建立的 文件数量
    • 限制 block 用量:管理用户磁盘容量限制,较常见该方式
  • 柔性 soft 劝导与硬性 hard 规定

    inode 和 block 限制值有两个:soft 与 hard,通常 hard 值比 soft 高。

    如:限制项目为 block,可以限制 hard 为 500MBytes ,soft 为 400MBytes。

    • hard:表示使用者绝对不会超过该值。
    • soft:表示使用者在地狱 soft 限制时,可以正常使用磁盘,但若超过 soft 且低于 hard 值,每次用户登录系统时,系统会主动发出磁盘即将爆满的警告信息,且会给予一个宽限时间(grace time),如果在宽限时间内降低到了 soft 限制下,则宽限时间会停止
  • 会倒计时的宽限时间(grace time)

    只有用户的磁盘用量介于 soft 到 hard 之间时,才会出现倒计时,由于达到 hard 值时,用户的磁盘使用权可能会被锁住。为了担心用户没有注意到磁盘配额问题,因此涉及了 soft,相当于预警机制,一般预设的宽限时间为 7 天,如果 7 天内你还不进行容量降低动作,那么 soft 限制会立刻取代 hard 值来做为 quota 的限制

# 一个 XFS 文件系统的 Quota 实验

一个场景来实践,如下是需求描述

  • 目的与账户

    让 5 个专题生为一组,账户是 myquota1、myquota2、myquota3、myquota4、myquota5 ,密码都是 123456,初始群组都是 myquotagrp。其他属性都为默认值

  • 账户的磁盘容量限制

    5 个用户都能使用 300MBytes 的磁盘使用量(hard),文件数量不限制。此外,只要容量使用超过 250MBytes,则警告(soft)

  • 群组限额(option 1)

    由于该系统还有其他用户存在,因此 myquotagrp 群组最多可用使用 1GBytes 的容量。也就是说 myquota1~3 都用了 280Mbytes,那么剩下两人最多只能使用 1000MB - 280x3 = 160MB 的磁盘容量。这就是使用者与群组同时设置时会产生的后果

  • 共享目录限额(option 2)

    另一种设置方式是:每个用户具有自己的独立容量上限,他们的专题共享目录在 /home/myquota 该目录设置为其他人没有任何权限的共享空间,只有 myquotagrp 群组拥有全部的权限。且该目录最多只能使用 500MB 的磁盘容量。群组 group 的限制与目录 (directory/project)无法同时设置

  • 宽限时间限制:每个使用者在超过 soft 限制值之后,有 14 天的宽限时间

接下来一步一步实现以上需求

# 多账户创建,可以使用之前的批量账户创建脚本来实现,这里使用简化版的定制脚本来实现

[root@study ~]# vim addaccount2.sh
#!/bin/bash
# 使用脚本来创建 xfs 文件系统 Quota 实验的账户
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5 
do
	useradd -g myquotagrp $username
	echo "123456" | passwd --stdin $username
done

mkdir /home/myquota
chgrp myquotagrp /home/myquota		# 改变该目录的所属群
chmod 2770 /home/myquota		# 拥有者和群组有权限,这里加了个 SGID=2 的特殊权限,笔者暂时不理解是为什么


[root@study ~]# sh addaccount2.sh 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 实验流程 1:文件系统的支持与观察

XFS 默认支持 Quota,Ext 则请自行百度。另外 不要在根目录下进行 quota,因为文件系统会变得太复杂,下面以 /home 这个 xfs 文件系统为例,如何启动 quota 功能

# 查看文件系统
# -h 格式化容量单位,-T 显示 type 字段
[root@study ~]# df -hT /home
Filesystem                    Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos_study-root xfs    35G  4.4G   31G  13% /
# 可以看到上面的挂载点是 / 根目录,这里是由于该指令不是在最初我们搭建分区的哪台学习机上操作的
# 所以最好还是切换到我们的学习机上面去实验;目前由于在外面,暂时没有环境
1
2
3
4
5
6
7

在过去的版本中,管理员可以通过 mount -o remount 机制来重新挂载启动 quota 的功能,不过当前的 XFS 文件系统在挂载之初就声明了,因此无法使用 remount 来重新启动 quota 功能,一定要写入 /etc/fstab 中,或者是在初始挂载过程中加入这个项目,否则不会生效

[root@study ~]# vim /etc/fstab
/dev/mapper/centos_study-root   /    xfs     defaults,usrquota,grpquota        0 0
# 第一字端对应 df -hT /home 中出现的第一字段。这里只增加了第 4 字段的这部分内容 ,usrquota,grpquota

# 卸载根目录,肯定会提示忙碌;这里只有重启让自动挂载了
[root@study ~]# umount /       
umount: /: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
# 这里尝试使用根目录来启用 quota 功能,配置,重启之后,也没有被开启,这里我放弃了
1
2
3
4
5
6
7
8
9
10

好了,回到了最开始学习分好区那台学习机上了,下面再来做这个实验

[root@study ~]$ df -hT /home
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-home xfs   5.0G  128M  4.9G   3% /home

# 先看看该目录提供的服务
[root@study ~]$ mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

# 增加挂载时提供的服务 ,usrquota,grpquota 
[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home /home                   xfs     defaults,usrquota,grpquota        0 0
# 还是提示繁忙,这里只能用重启代替,下面的2个步骤
# 原因是有 home 下面的账户在登录,因此无法卸载掉
[root@study ~]# umount /home
umount: /home: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[root@study ~]# mount -a	# 挂载
# 仔细看下面的信息,证明已经启动了
[mrcode@study ~]$ mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

基本个,针对 quota 限制的项目主要有三项:

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

务必小心 修改/etc/fstab文件内容,发生错误的话,有可能导致无法开机

# 实验流程 2:观察 Quota 报告资料

可以使用 xfs_quota 指令来查阅相关信息,该指令参数较多,先来了解简单查询的参数

xfs_quota -x -c "指令" [挂载点]

选项与参数:
	-x:专家模式,后续才能够加入 -c 的指令参数
	-c:后面接指令,本小节先讲解数据回报的指令
指令:
	print:单纯的列出目前主机内的文件系统参数等信息
	df:与原本的  df 功能一样,可以加上 -b(block)  -i(inode) -h(格式化单位)等
	report:列出目前的 quota 项目,有 -ugr(user/group/project) 和 -bi 等信息
	state:列出目前支持 quota 的文件系统信息,有无启动相关项目等信息
1
2
3
4
5
6
7
8
9
10
# 范例 1:列出目前系统的各个文件系统,以及文件系统的 quota 挂载参数支持
[root@study ~]$ xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/centos-root
/boot               /dev/sda2
/home               /dev/mapper/centos-home (uquota, gquota)		# 这里显示支持

# 范例 2:列出目前 /home 支持 quota 的挂载点文件系统使用情况
[root@study ~]$ xfs_quota -x -c "df -h" /home
Filesystem     Size   Used  Avail Use% Pathname
/dev/mapper/centos-home
               5.0G 127.7M   4.9G   2% /home
# 和 df -h 类似,只是更准确了 
1
2
3
4
5
6
7
8
9
10
11
12
13
# 范例 3: 列出目前 /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            0      0      0  00 [------]      8      0      0  00 [------]
mrcode       7.4M      0      0  00 [------]    260      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]     16      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 [------]

# Blocks 是容量限制
# Inodes 是文件数量限制
# soft/hard 为 0 则表示没有限制

默认情况下, report 会将支持的 user/group/prject 相关数据都列出来;上面加了 -u 参数,所以只列出了 user 的相关数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 范例 4:列出目前支持的 quota 文件系统是否有启动了 quota 功能
[root@study ~]# xfs_quota -x -c "state" 
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON		# 是否启用计算功能; ON 是,OFF 否
  Enforcement: ON		# 是否有实际 quota 管制功能
  Inode: #1605 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1606 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)	# project 并未开启
  Accounting: OFF	
  Enforcement: OFF
  Inode: #1606 (2 blocks, 2 extents)
Blocks grace time: [7 days]		# 下面是 grace timec 的项目,宽限时间
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 实验流程 3:限制值设置方式

启动支持并能查询到相关状态,那么进行实验的限制操作:每个用户 250/300MB 容量限制、群组供 950M/1G 容量限制、宽限时间(grace time)14 天

语法如下:

xfs_quota -x -c "limit [-ug] b[soft|hard]=N name"
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 设置
1
2
3
4
5
6
7
8
9
10
# 范例 1:设置用户的 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  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      8      0      0  00 [------]
mrcode       7.4M      0      0  00 [------]    260      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]     16      0      0  00 [------]
myquota1      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota2      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota3      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota4      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota5      12K   250M   300M  00 [------]      7      0      0  00 [------]
# 可以看到  5 个账户的设置以及生效了,在 Blocks 这边
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 范例 2:设置 myqutarp 的 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  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      7      0      0  00 [------]
mrcode       7.4M      0      0  00 [------]    260      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]     16      0      0  00 [------]
myquotagrp    60K   950M     1G  00 [------]     36      0      0  00 [------]

1
2
3
4
5
6
7
8
9
10
11
12
13
# 范例 3: 设置 grace time 为 14 天
[root@study ~]# xfs_quota -x -c "timer -u -b 14days" /home
[root@study ~]# xfs_quota -x -c "timer -g -b 14days" /home

[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1605 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1606 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #1606 (2 blocks, 2 extents)
Blocks grace time: [14 days]		# 这里变成了 14 天
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 范例 4:以 myquota1 的用户测试 quota 是否真的有限制效果
su -l myquotal
[myquota1@study ~]$ dd if=/dev/zero of=123.img bs=1M count=310
dd: 写入"123.img" 出错: 超出磁盘限额
记录了300+0 的读入
记录了299+0 的写出
313524224字节(314 MB)已复制,0.386459 秒,811 MB/秒
# 英文版本
[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
313524224 bytes (314 MB) copied, 0.175228 s, 1.8 GB/s

# 查看状态
[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            0      0      0  00 [0 days]      8      0      0  00 [------]
mrcode       7.4M      0      0  00 [------]    260      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]     16      0      0  00 [------]
myquota1   299.0M   250M   300M  00 [13 days]     16      0      0  00 [------]
myquota2      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota3      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota4      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota5      12K   250M   300M  00 [------]      7      0      0  00 [------]
# 会发现 myquota1 使用量已经满了,并且宽限时间还有 13 天
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 实验流程 4:project 的限制(针对目录)- 可选

注意:这里是针对 /home/myquota 这个目录,而不是针对 myquotagrp 这个群组。上面配置过 myquotagrp 这个组的限制

另外:上述 myquota1 已经使用了 300M 的容量,他是在他自己家的目录做的 dd 指令,因此 /home/myquota 这个目录目前还未使用,但是

[root@study ~]# xfs_quota -x -c "report -h" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks              
User ID      Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root            0      0      0  00 [0 days]
mrcode       7.4M      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]
myquota1   299.0M   250M   300M  00 [13 days]
myquota2      12K   250M   300M  00 [------]
myquota3      12K   250M   300M  00 [------]
myquota4      12K   250M   300M  00 [------]
myquota5      12K   250M   300M  00 [------]

Group quota on /home (/dev/mapper/centos-home)
                        Blocks              
Group ID     Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root            0      0      0  00 [0 days]
mrcode       7.4M      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]
myquotagrp 299.1M   950M     1G  00 [------]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

会发现,myquotagrp 这个群组的容量已经用掉了 300M,对于目录的限制来说,就不会有效果了

还因为 project 不能与 group 同时设置,所以需要取消掉 group 的设置,并加入 project 才可以

# 修改 /etc/fstab 内的文件系统支持参数
# 把 grpquota 去掉,加入 prjquota
[root@study ~]# vim /etc/fstab 

/dev/mapper/centos-home /home                   xfs     defaults,usrquota,prjquota        0 0

# 卸载 /home, 并重新加载
# 这里还是老问题,远程登录笔者用 mrcode 为入口的,所以 /home 目录卸载在使用(虽然使用 su 切换到了 root)
# 这里还是使用重启机器来自动挂载
[root@study ~]# umount /home/
umount: /home: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
[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: #1605 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF				# 已经关闭了
  Enforcement: OFF
  Inode: #1606 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON		# 已经启动了
  Enforcement: ON
  Inode: #1606 (2 blocks, 2 extents)
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

# 这里还没有配置任何项目的限制的哈。除了第一行哪个 #0
[root@study ~]# xfs_quota -x -c "report -h" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks              
User ID      Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root            0      0      0  00 [------]
mrcode       7.4M      0      0  00 [------]
mrcode1     87.9M      0      0  00 [------]
myquota1   299.0M   250M   300M  00 [13 days]
myquota2      12K   250M   300M  00 [------]
myquota3      12K   250M   300M  00 [------]
myquota4      12K   250M   300M  00 [------]
myquota5      12K   250M   300M  00 [------]

Project quota on /home (/dev/mapper/centos-home)
                        Blocks              
Project ID   Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
#0         394.3M      0      0  00 [------]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

规范目录、项目名称和项目 ID

# 指定项目表伺服与目录的对应;
# 语法可以看成是:别名:目录;这里别名设置的是数字 11
[root@study ~]# echo "11:/home/myquota" >> /etc/projects
# 规范项目名称;
# 语法是:项目名称:目录别名
echo "myquotaproject:11" >> /etc/projid

# 这个语法感觉很奇怪,需要先个目录取个别名,然后再取个别名取关联这个别名
# 不过笔者看目录名称:可以这样来理解:
# projects 目录给目标目录取了一个  别名
# projid 用自定义的 ID,关联了别名
# 这个应该是解耦配置之类的考虑吧

# 初始化专案名称
[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).
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion depth infinite (-1).
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion depth infinite (-1).

# 就可以看到完整的文件系统各项支持,与 project 的目录对应
[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)

[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  
---------- --------------------------------- --------------------------------- 
#0         394.3M      0      0  00 [------]    327      0      0  00 [------]
myquotaproject      0      0      0  00 [------]      1      0      0  00 [------]
# 第二行,是我们刚刚配置的项目 ID,各个使用都还是 0 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

测试与观察

# 测试与观察
[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  
---------- --------------------------------- --------------------------------- 
#0         394.3M      0      0  00 [------]    327      0      0  00 [------]
myquotaproject      0   450M   500M  00 [------]      1      0      0  00 [------]
# 可以看到一件配置上 450 和 500 m 的限制了
dd if=/dev/zero of=/home/myquota/123/img bs=1M count=510

# 测试是否有效
[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.491772 s, 1.1 GB/s
# 使用 root 对该目录写入,超过限制也被提示了,这个才是完整的针对目录的规范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

小节:

  • /etc/projects:给具体的目录建立别名
  • /etc/projid:给目录别名建立 projid

这样就可以针对目录来限制了。

有如下一个常见,就能满足使用限制目录的需求:在 www 服务中,要针对某些目录进行容量限制,但是因为容量之前仅针对用户进行限制,但是由于 www 服务都是一个名为 httpd 的账户管理的,因此该 www 服务所产生的文件数据都属于 httpd 账户,就无法针对某些特定的目录进行限制了,有了 project 之后,就可以针对不同的目录做容量限制,而不用管在里面建立文件的文件拥有者

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

这里讲解稍微完讲解常用的 quota 维护指令

  • disable:暂时取消 quota 的限制,但其实同还是在计算 quota,只是暂时不对限制做任何操作

  • enable:恢复 quota 的限制

  • off:完全关闭 quota 的限制

    该选项只能通过卸载重新挂载才能重新开启 quota 的限制哟

  • remov:必须要在 off 状态下才能执行该指令,移除 quota 的限制配置

    比如要移除 project 的限制配置,只需要 remove -p 就可以了,而不需要重新设置限制值为 0

实践练习

# 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		# 已经变成 OFF 了
  Inode: #1605 (2 blocks, 2 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #1606 (2 blocks, 2 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: OFF
  Inode: #1606 (2 blocks, 2 extents)
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

# 测试写入大于限制值的文件到 目录
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
510+0 records in
510+0 records out
534773760 bytes (535 MB) copied, 0.365973 s, 1.5 GB/s
# 发现没有限制了

[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  
---------- --------------------------------- --------------------------------- 
#0         394.3M      0      0  00 [------]    327      0      0  00 [------]
myquotaproject   510M   450M   500M  00 [-none-]      2      0      0  00 [------]
# 会发现有统计,只是没有限制

# 开启限制
[root@study ~]# xfs_quota -x -c "enable -up" /home

# 再次写入,限制出现了
[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.400271 s, 1.3 GB/s

# 关闭了 quota 限制行为,再尝试开启,会发现不能开启
[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 通过 off 之后,需要重新卸载挂载  umount/mount 才可以重新开启

# 笔者这里还是使用重启来替代者两个命令
umount /home; mount -a;

# 移除所有的限制
[root@study ~]#xfs_quota -x -c "off -up" /homee
# 移除项目的配置
[root@study ~]# xfs_quota -x -c "remove -p" /home

# 关闭后,不重新挂载,没有任何信息
[root@study ~]# xfs_quota -x -c "state" /home
[root@study ~]# xfs_quota -x -c "state"      
[root@study ~]# xfs_quota -x -c "report -pbh" /home
# 重新挂载后,查看,项目的限制配置就没有了
[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   
---------- --------------------------------- 
#0         394.3M      0      0  00 [------]
myquotaproject   500M      0      0  00 [------]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

下面是 EXT 家族与 XFS 系统的相关命令,可以尝试使用以下命令来维护

设定流程项目 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

# 不修改现有系统的 quota

有这样一种情况:之前分区时,没有规划邮件信箱目录 /var/spool/mail/ 是一个独立的 partition,现在主机也没有办法新增或分区出任何新的分区槽了。

那么在这样的情况下,quota 的支持与文件系统有关,无法夸文件系统来设计 quota 的 project 功能

那么此时,那么想要使用的邮件信箱与家目录的总体磁盘使用量为固定,要怎么做?由于 /home//var/spool/mail 根本不可能是同一个 filesystem(除非是都不分区,使用根目录,才有肯可能整合在一起),所以这样的情况怎么进行 quota 的限制?

假设。你有 /home 这个独立的分区槽了,你只需要:

  1. /var/spool/mail这个目录完整的移动到 /home
  2. 利用 ln -s /home/mail /var/spool/mail 来建立链接
  3. /home 进行 quota 的限制配置

还可以依据不同的使用者与群组来设置 quota,让后以同样的方式来进行 link