1.1 磁盘配额
1.1.1 什么是磁盘配额
磁盘配额(Quota)是指在Linux 系统中,用来限制普通用户或用户组在指定的分区或目录中所占用的磁盘容量或文件个数的限制。在这个概念中,需要强调以下几个重点:
● 在EXT 文件系统中(CentOS 6.x 以前的版本),磁盘配额只能限制在整个分区上用户所占用的磁盘容量与文件个数,而不能限制某个目录所占用的磁盘容量;在XFS 文件系统中(CentOS 7.x 以后的版本),磁盘配额的功能增强了,不仅可以限制整个分区,也能限制目录所占用的磁盘空间大小。这是CentOS 7.x 和CentOS 6.x 在磁盘配额方面的不同,本书会按照CentOS 7.x 版本进行讲解。如果需要了解CentOS 6.x 中磁盘配额的概念,请购买本书的第1版。
● 如果磁盘配额是针对分区进行限制的,则限制的是用户在本分区中所占用的磁盘空间大小,限制的主体是用户。这时,只有普通用户会被限制,而超级用户不会被限制。
● 如果磁盘配额是针对目录进行限制的,则限制的是目录在本分区中所占用的磁盘空间大小,限制的主体是目录。这时,不论是超级用户还是普通用户,在目录中所占用的磁盘空间大小和文件个数都受配额限制。
● 磁盘配额既能限制用户所占用的磁盘容量大小(block),也能限制用户允许占用的文件个数(inode)。
磁盘配额在实际工作中是很常见的。比如,我们的邮箱容量不管有多大,都是有限制的,不可能无限制地存储邮件;可以上传文件的服务器也是有容量限制的;网页中的个人空间也不可能被无限制地使用。
磁盘配额就好像出租写字楼,虽然整栋楼的空间非常大,但是租用整栋楼的成本太高。我们可以分开出租,用户如果觉得不够用,还可以租用更大的空间。不过,租用是不能随便进行的,有几条规矩必须遵守:第一,我的楼是租给外来用户的(普通用户),可以租给一个人(用户),也可以租给一家公司(用户组),但是这栋楼的所有权是我的,所以不能租给我自己(root用户);第二,如果要租用,则只能在每层租用一定大小的空间,而不能在一个房间中再划分出子空间来租用(配额只能针对分区,而不能限制某个目录);第三,租户既可以决定在某层租用多大的空间(磁盘容量限制),也可以在某层租用几个人员名额,这样只有这几个人员才能进入本层(文件个数限制)。
要想正常使用磁盘配额,有几个前提条件。
● 内核必须支持磁盘配额。CentOS 7.x 版本的Linux 默认支持磁盘配额,不需要做任何修改。如果不放心,则可以查看内核配置文件,看是否支持磁盘配额。命令如下:
可以看到,内核已经支持磁盘配额。如果内核不支持磁盘配额,就需要重新编译内核,加入quota supper 功能。
● 如果安装启动了SELinux(在CentOS 7.x 中默认是安装的),那么必须关闭SELinux,或者手工修改SELinux 规则,否则磁盘配额功能无法正常使用。关闭SELinux 的方法如下:
● 要支持磁盘配额的分区必须开启磁盘配额功能。这项功能需要手工开启,不再是默认开启的。
1.1.2 磁盘配额中的常见概念
1.用户配额和用户组配额
用户配额是指针对用户个人在分区中所占用磁盘空间大小和文件个数的配额,而用户组配额是指针对整个用户组的配额。如果需要限制的用户数量并不多,则可以给每个用户单独指定配额。如果需要限制的用户数量比较多,那么单独限制太过麻烦,这时先把用户加入某个用户组,然后给用户组指定配额,就会简单得多。需要注意的是,用户组中的用户是共享空间或文件个数的。也就是说,如果用户user1、user2和user3都属于tg 用户组,给tg 用户组分配100MB 的磁盘空间,那么,这3个用户不是平均分配这100MB 空间的,而是先到先得的,谁先占用,谁就有可能占满这100MB 空间,后来的就没有空间可用了。
2.目录配额
目录配额指的是限制目录在分区中占用的磁盘空间大小的限制,任何用户,包括超级用户,在此目录下写入的数据都计算在配额限制内。
3.磁盘容量限制和文件个数限制
除了可以通过限制用户可用的block 数量来限制用户可用的磁盘容量,也可以通过限制用户可用的inode 数量来限制用户可以上传或新建的文件个数。
4.软限制和硬限制
软限制可以理解为警告限制,硬限制就是真正的限制了。比如,规定软限制为100MB,硬限制为200MB,那么,当用户使用的磁盘空间为100~200MB 时,还可以继续上传和新建文件,但在每次登录时都会收到一条警告消息,告诉用户磁盘将满。
5.宽限时间
如果用户的磁盘占用量处于软限制和硬限制之间,那么系统会在用户登录时警告用户磁盘将满。但是这个警告不会一直发出,而是有时间限制的,这个时间就是宽限时间,默认是7天。如果到达宽限时间,用户的磁盘占用量仍超过软限制,那么软限制就会升级为硬限制。也就是说,如果软限制是100MB,硬限制是200MB,宽限时间是7天,此时用户占用了120MB,那么今后7天,在用户每次登录时都会出现磁盘将满的警告。如果用户置之不理,那么7天后,对这个用户的硬限制就会变成100MB,而不是200MB 了。
1.1.3 用户和用户组配额的实现过程
本小节先进行用户和用户组配额实验,下一小节再来尝试目录配额实验。首先来规划一下我们的实验。
● 由于磁盘配额是用来限制普通用户在分区上所使用的磁盘容量和文件个数的,所以需要指定一个分区。那么,我们手工建立一个容量为5GB 的/dev/sdb1分区,把它挂载到/disk 目录当中。不建议直接用根目录来做磁盘配额,因为这样会使文件系统变得无比复杂。
● 建立需要被限制的用户和用户组。假设需要限制user1、user2和user3用户,这3个用户均属于tg 用户组。
● tg 用户组的磁盘容量硬限制为500MB,软限制为450MB,文件个数没有限制。user1用户为了便于测试,设定磁盘容量硬限制为50MB,软限制为40MB;文件个数硬限制为10个,软限制为8个。user2和user3用户的磁盘容量硬限制为300MB,软限制为250MB,文件个数没有限制。
● 可以发现,user1、user2和user3用户加起来的磁盘容量硬限制为650MB,超过了tg 用户组的磁盘容量硬限制500MB。这样一来,某个用户可能还达不到自己的用户限制,而在达到用户组限制时就不能再写入数据了。也就是说,如果用户限制和用户组限制同时存在,那么,哪个限制更小,哪个限制优先生效。
● 系统宽限时间为8天。规划好了实验,下面开始进行磁盘配额的设置。
1.建立要指定配额的分区
我们按照实验规划,划分容量为5GB 的/dev/sdb1分区(划分分区的过程在《细说Linux基础知识》中已经详细介绍过,在这里直接看结果),并将它挂载到/disk 目录中,然后查看这个分区。命令如下:
2.建立需要被限制的用户和用户组
命令如下:
建立user1、user2和user3用户,并把它们加入tg 用户组中。
注意:如果要想测试用户组配额,那么tg 用户组必须是user1、user2和user3用户的初始组,用户组配额才能生效;否则用户组配额不起作用。
3.在分区上开启磁盘配额功能
在CentOS 6.x 以前的系统中,可以通过“mount -o remount,usrquota,grpquota /disk”命令来临时开启分区的磁盘配额功能。但是,在CentOS 7.x 中,磁盘配额功能是在挂载的时候就生效的,不能再通过remount 选项来临时开启磁盘配额功能。只能通过先修改/etc/fstab 文件开启磁盘配额功能,然后卸载分区,再重新挂载分区的方式来开启磁盘配额功能。命令如下:
注意:这里加入的是“usrquota”和“grpquota”这样两个不常见的缩写单词,中间用逗号隔开。在修改/etc/fstab 文件时一定要小心,因为一旦改错,就有可能导致系统无法正常启动。
解释一下/etc/mtab 和/etc/fstab 这两个文件的区别:在/etc/mtab 文件中记录的是操作系统已经挂载的文件系统(分区),包括操作系统建立的虚拟文件系统;而在/etc/fstab 文件中记录的是操作系统准备挂载的文件系统,也就是在下次启动后系统会挂载的文件系统,所以,如果磁盘配额功能是永久生效的,就应该修改这个文件。
在开启分区的磁盘配额功能之后,还需要卸载分区,再重新挂载分区。命令如下:
4.设置磁盘配额
在CentOS 7.x 中,如果按照旧版本的方式,使用quotacheck 命令来生成配额文件,就会报错。我们来试试:
注意:这里的报错英文原意是“找不到检测的文件系统或文件系统没有挂载磁盘配额选项”。很多读者以为引起这个报错的原因是分区没有开启磁盘配额功能,或者内核没有开启磁盘配额模块。其实都不是,真实的原因是XFS 文件系统不再使用quotacheck 命令来进行磁盘配额,而需要使用xfs_quota 命令来进行磁盘配额。
下面介绍xfs_quota 命令。这个命令比较复杂,先来看看通用的命令格式。
xfs_quota 命令确实比较复杂,我们逐个命令来使用。先来看看如何设置用户与用户组配额,需要使用xfs_quota 命令中的limit 命令。
知道了xfs_quota 命令中limit 命令的格式,就可以按照实验规划来设置我们的配额实验了。先设置用户配额。
再设置用户组配额。
5.查看磁盘配额
在xfs_quota 命令中,先来看一下用于查看的命令的常见选项。
例子1:查看用户配额的限制值。
这里查看的信息分为Blocks 和Inodes 两部分,每部分都包含4项内容。
● Used:当前用户已经占用的block/inode。
● Soft:block/inode 的软限制。
● Hard:block/inode 的硬限制。
● Warn/Grace:系统宽限时间。
例子2:查看用户组配额的限制值。
要想查看用户组配额的限制值,只要把“-u”选项替换为“-g”选项即可。
例子3:查看分区的配额开启状态。
例子4:查看分区的挂载参数。
例子5:查看磁盘配额分区的空间使用情况。
这个命令的作用和系统命令df 的作用基本类似,而且也支持“-h”选项。
6.设置宽限时间
设置宽限时间需要使用xfs_quota 命令中的timer 命令。命令格式如下:
宽限时间默认是7天,一般不需要修改。如果真要修改,则可以使用如下命令:
7.测试配额是否生效
磁盘配额设置成功后,需要测试一下,看看是否生效。首先需要修改/disk 分区的权限,让user1、user2和user3用户对这个分区拥有写入权限。命令如下:
● 测试user1用户的磁盘配额限制。
先尝试一下文件个数限制,看看是否被限制。针对user1用户,磁盘容量硬限制为50MB,软限制为40MB;文件个数硬限制为10个,软限制为8个。验证一下:
既然文件个数限制已经生效,那么我们来查看一下。命令如下:
再测试针对user1用户的磁盘容量限制是否生效。命令如下:
既然磁盘容量限制已经生效,那么我们来查看一下。命令如下:
● 测试其他用户的磁盘配额限制。
针对tg 用户组的磁盘容量硬限制为500MB,软限制为450MB,文件个数没有限制。针对user2和user3用户的磁盘容量硬限制为300MB,软限制为250MB,文件个数没有限制。这样一来,针对user1+user2+user3用户的磁盘容量硬限制为650MB,超出了针对tg 用户组的磁盘容量硬限制500MB。
我们来看看会出现什么情况。先测试针对user2用户的磁盘容量限制。命令如下:
再查看组配额限制。命令如下:
接下来看看user3用户是否可以写满300MB。如果user3用户只能写入150MB,就证明组配额已经生效。另外,组配额不是平均分配空间的,而采用的是先到先得的原则。我们试试:
最终test3.txt 文件的大小只有150MB,证明组配额确实生效了。查看一下组配额的情况,命令如下:
8.关闭或删除配额
如果需要关闭磁盘配额功能,或者需要删除配额选项,则可以使用以下命令。
如果需要暂时关闭磁盘配额功能,但是不清除配额的各项限制,则可以直接使用disable命令关闭,也可以使用enable 命令重新开启。
先使用disable 命令关闭磁盘配额功能,再使用enable 命令重新开启,是不影响配额限制的。查看一下,配额限制依然正常。
如果想要删除配额限制,就需要先使用off 命令彻底关闭磁盘配额功能,再使用remove 命令删除配额限制。我们试试:
1.1.4 目录配额的实现过程
目录配额是XFS 文件系统中新增的功能,限制的是目录在本分区中占用的磁盘空间大小,限制的主体是目录。这时,不论是超级用户还是普通用户,在目录中占用的磁盘空间大小和文件个数都受配额限制。也就是说,目录配额可以限制超级用户。
1.在分区上开启目录配额功能
首先需要开启分区的目录配额项。在之前的实验中已经清除了用户和用户组配额,在这里重新配置目录配额。
2.给目录设置项目名称和项目ID
如果需要做目录配额,则需要给目录起一个项目名称和项目ID,而且需要写入/etc/projects和/etc/projid 这两个文件中。需要注意的是,这两个文件默认不存在,需要手工建立。注意不要写错文件名,否则实验会失败。
既然限制的是目录,就不能直接限制/disk 目录了,因为/disk 是一个独立的分区。建立一个测试目录/disk/quota。
3.初始化项目名称
初始化项目名称需要使用xfs_quota 命令中的project 命令,我们来看看这个命令。
我们试一下:
接下来就可以查看目录配额功能了。
4.设置目录配额限制
给实验目录/disk/quota 设置磁盘容量硬限制为500MB,软限制为450MB。设置目录配额限制的命令依然是xfs_quota 命令中的limit 命令,选项也和之前的选项一致。
设置配额之后的查看方法也和之前的查看方法是一致的。例如:
5.测试目录配额
目录配额限制的是目录在本分区中占用的磁盘空间大小,限制的主体是目录。所以,不论是什么身份,哪怕是root 用户写入也会受到限制。下面用root 用户来测试一下。