磁盘配额概述
Linux是一个多用户的操作系统,为了防止某个用户或组群占用过多的硬盘空间,可以通过硬盘配额(Disk Quota)功能限制用户和组群对硬盘空间的使用。磁盘配额(Quota)就是 Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。
在此概念中,有以下几个重点需要注意:
磁盘配额限制的用户和用户组,只能是普通用户和用户组,也就是说超级用户 root 是不能做磁盘配额的;
磁盘配额限制只能针对分区,而不能针对某个目录,换句话说,磁盘配额仅能针对文件系统进行限制,举个例子,如果你的 /dev/sda5 是挂载在 /home 底下,那么,在 /home 下的所有目录都会受到磁盘配额的限制;
我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)。
举例说明:
磁盘配额在实际生活中其实是很常见的,比如,我们的邮箱不管多大,都是有限制的,而不可能无限制地存储邮件;我们可以上传文件的服务器也是有容量限制的;网页中的个人空间也不可能让我们无限制地使用。
磁盘配额就好像我们出租写字楼,虽然整栋楼的空间非常大,但是租整栋楼的成本太高。我们可以分开出租,用户如果觉得不够用,则还可以租用更大的空间。不过租用是不能随便进行的,其中有几个规矩必须遵守:
我的楼是租给外来用户的(普通用户),可以租给一个人(用户),也可以租给一家公司(用户组),但是这栋楼的所有权是我的,所以不能租给我自己(root 用户);
如果要租用,则只能在每层租用一定大小的空间,而不能在一个房间中再划分出子空间来租用(配额只能针对分区,而不能限制某个目录);
租户可以决定在某层租用多大的空间(磁盘容量限制),也可以在某层租用几个人员名额,这样只有这几个人员才能进入本层(文件个数限制)。
磁盘配额中的常见概念
用户配额和组配额
用户配额是指针对用户个人的配额,而组配额是指针对整个用户组的配额。如果我们需要限制的用户数量并不多,则可以给每个用户单独指定配额。如果用户比较多,那么单独限制太过麻烦,这时我们可以把用户加入某个用户组,然后给组指定配额,就会简单得多。
需要注意的是,组中的用户是共享空间或文件数的。也就是说,如果用户user1、user2和user3都属于users用户组,给users用户组分配200MB的磁盘空间,那么,这三个用户不是平均分配这200MB空间的,而是先到先得,谁先占用,谁就有可能占满这200MB空间,后来的就没有空间可用了。
磁盘容量限制和文件个数限制
除了可以通过限制用户可用的block数量来限制用户可用的磁盘容量,也可以通过限制用户可用的inode数量来限制用户可以上传或新建的文件个数。
软限制和硬限制
软限制可理解为警告限制,硬限制就是真正的限制了。比如,规定软限制为100MB,硬限制为200MB,那么,当用户使用的磁盘空间为100~200MB时,用户还可以继续上传和新建文件,但是每次登录时都会收到一条警告消息,告诉用户磁盘将满。
宽限时间
如果用户的空间占用数处于软限制和硬限制之间,那么系统会在用户登录时警告用户磁盘将满,但是这个警告不会一直进行,而是有时间限制的,这个时间就是宽限时间,默认是7天。
如果到达宽限时间,用户的磁盘占用量还超过软限制,那么软限制就会升级为硬限制。也就是说,如果软限制是 100MB,硬限制是 200MB,宽限时间是 7天,此时用户占用了120MB,那么今后7天用户每次登录时都会出现磁盘将满的警告,如果用户置之不理,7天后这个用户的硬限制就会变成100MB,而不是200MB。
磁盘配额启动的前期准备
使用磁盘配额的前提,是必须要内核以及文件系统支持才行,这里假设大家使用的就是支持磁盘配额的内核,那么接下来就是要配置文件系统,使其支持配额限制。
查看当前/home情况
[root@Server01 ~]# mount | grep home #noquota表示无配额
/dev/mapper/rhel_server01-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
[root@Server01 ~]# df -Th /home/ #ext3/ext4/xfs,则支持Quota
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel_server01-home xfs 8.0G 90M 8.0G 2% /home
启用配额
[root@Server01 ~]# vim /etc/fstab
UUID=0a759e3a-bb79-4b28-9db3-7c413e64ad6c /home xfs
defaults,usrquota,grpquota 0 0
#实现基于用户的磁盘配额,就加入usrquota关键字,实现基于组的磁盘配额,就加入grpqouta关键字,如果两者都需要,就全写入,中间可以用逗号分隔
[root@Server01 ~]# reboot #重启系统
#重启后支持配额功能
[root@Server01 ~]# mount | grep home
/dev/mapper/rhel_server01-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota)
相关命令
xfs_quota命令
xfs_quota -x -c '指令' [挂载点]
-x: 专家模式, 加x会多一些可以显示的
-c: 加指令
指令:
- print: 打印文件系统参数等数据
- df: 与普通df一样
- report: 'report -ugribh'等参数 r=project
- state: 列出目前支持quota的文件系统的信息
- limit: 'limit [-ug] b[soft|hard]=N i[soft|hard]=N name' #b=block i=inode, N=数量, 也可为单位 name=用户/组的名称
- timer: 'timer [-ug] [-bir] Ndays'
edquota命令
edquota:用于编辑指定用户或工作组磁盘配额。edquota预设会使用vi来编辑使用者或群组的quota设置。
语法:edquota (选项) (参数)
选项
-u:设置用户的quota,这是预设的参数;
-g:设置群组的quota;
-p<源用户名称>:将源用户的quota设置套用至其他用户或群组;
-t:设置宽限期限。
参数
用户:指定要编辑磁盘配额限制的用户名或者工作组
edquota [-u 用户名] [-g 群组名]
edquota -t
edquota -p 源用户名 -u 新用户名
[root@ljh99 ~]# edquota -u myquota
Disk quotas for user myquota (uid 710):
Filesystem blocks soft hard inodes soft hard
/dev/hda3 80 0 0 10 0 0
此命令的输出信息共3行,第一行指明了针对哪个用户进行配额限制,第二行是各个配额值的表头,共分为7 列,其每一列的含义。
文件系统(filesystem):说明该限制值是针对哪个文件系统(或分区)
磁盘容量(blocks):此列的数值是quota自己算出来的,单位为Kbytes,不要手动修改
磁盘容量的软限制(soft):当用户使用的磁盘空间超过此限制值,则用户在登陆时会收到警告信息,告知用户磁盘已满,单位为 KB
磁盘容量的硬限制(hard):要求用户使用的磁盘空间最大不能超过此限制值,单位为KB
文件数量(inodes):同blocks一样,此项也是quota自己计算出来的,无需手动修改
文件数量的软限制(soft):当用户拥有的文件数量超过此值,系统会发出警告信息
文件数量的硬限制(hard):用户拥有的文件数量不能超过此值
注意,当soft/hard为0时,表示没有限制。另外,在Vi(或 Vim)中修改配额值时,填写的数据无法保证同表头对齐,只要保证此行数据分为7个栏目即可。
setquota命令
需要写脚本建立大量的用户,并给每个用户都自动进行磁盘配额,那么edquota命令就不能在脚本中使用了,因为这个命令的操作过程和vi类似,需要和管理员产生交互。这种情况下就需要利用setquota命令进行设置,该命令的好处是通过命令行设定配额,而不用和管理员交互设定。
setquota:非交互式设置磁盘配额
语法:setquota [ -u|-g ] 用户名/组名 容量软限制 容量硬限制 个数软限制 个数硬限制 分区名/挂载点
选项
-u user|UID:设置指定用户的配额限制,其中 user 表示每个用户的用户名,UID是用户ID
-g group|GID:设置特定组的配额限制,其中 group 表示每个组的名称,GID是组的ID
quota命令
quota:用于显示用户或者工作组的磁盘配额信息。输出信息包括磁盘使用和配额限制。
语法:quota (选项) (参数)
选项
-g:列出群组的磁盘空间限制;
-q:简明列表,只列出超过限制的部分;
-u:列出用户的磁盘空间限制;
-v:显示该用户或群组,在所有挂入系统的存储设备的空间限制;
-V:显示版本信息。
参数:用户或者工作组:指定要显示的用户或者工作组。
repquota命令
repquota:以报表的格式输出指定分区,或者文件系统的磁盘配额信息。
语法:repquota (选项) (参数)
选项
-a:列出在/etc/fstab文件里,有加入quota设置的分区的使用状况,包括用户和群组
-g:列出所有群组的磁盘空间限制
-u:列出所有用户的磁盘空间限制
-v:显示该用户或群组的所有空间限制
参数
文件系统:要打印报表的文件系统或者对应的设备文件名。
案例
环境及需求
目的用户:5个员工的账号分别是myquota1、myquota2、myquota3、myquota4和myquota5,5个用户的密码都是password,且这5个用户所属的初始组都是myquotagrp。其他的账号属性则使用默认值。
用户的硬盘容量限制值:5个用户都能够取得300MB的硬盘使用量(hard),文件数量则不予限制。此外,只要容量使用超过250MB,就予以警告(soft)。
用户的文件数量限制值:myquota1用户能够取得150个文件数量(hard),只要文件数量使用超过100,就予以警告(soft)。
组的配额:能够取得1GB的硬盘使用量(hard),文件数量则不予限制。此外,只要容量使用超过900M,就予以警告(soft)。
宽限时间的限制:最后,希望每个使用者在超过soft限制值之后,都还能够有14天的宽限时间。
注:本例中的/home必须是独立分区,文件系统是xfs
使用脚本建立quota所需的环境
[root@ljh99 ~]# cat useradd.sh
#!/bin/bash
#使用脚本建立quota所需的环境
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do
useradd -g myquotagrp $username
echo "password" | passwd --stdin $username
done
[root@ljh99 ~]# sh useradd.sh
#验证
[root@ljh99 ~]# tail /etc/group
myquotagrp:x:1000:
[root@ljh99 ~]# tail /etc/passwd
myquota1:x:1000:1000::/home/myquota1:/bin/bash
myquota2:x:1001:1000::/home/myquota2:/bin/bash
myquota3:x:1002:1000::/home/myquota3:/bin/bash
myquota4:x:1003:1000::/home/myquota4:/bin/bash
myquota5:x:1004:1000::/home/myquota5:/bin/bash
查看文件系统支持
要使用Quota(配额)必须要有文件系统的支持。假设已经使用了预设支持quota的核心,那么接下来就是要启动文件系统的支持。先检查一下/home是否是个独立的文件系统。
[root@ljh99 ~]# df -Th /home
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-home xfs 32G 256M 31G 1% /home
从上面的数据来看,该服务器/home确实是独立的文件系统,因此可以直接限制/dev/mapper/rhel-home。如果系统的/home并非独立的文件系统,那么可能就得要针对根目录(/)来规范
ext3/ext4/xfs,则支持quota
编辑配置文件fstab启用硬盘配额
[root@ljh99 ~]# mount | grep home #noquota表示无配额
/dev/mapper/rhel-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
#针对/home目录增加其他人的写入权限,保证用户能够正常写入数据
[root@ljh99 ~]# chmod -Rf o+w /home
[root@ljh99 ~]# vim /etc/fstab
/dev/mapper/rhel-home /home xfs defaults,usrquota,grpquota 0 0
[root@ljh99 ~]# reboot #重启系统
#验证
[root@ljh99 ~]# mount | grep home
/dev/mapper/rhel-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota)
#usrquota表示对/home启用了用户硬盘配额,grpquota表示对/home启用了组硬盘配额
[root@ljh99 ~]# ll -d /home
drwxr-xrwx. 7 root root 86 11月 13 06:50 /home
使用xfs_quota命令设置磁盘配额
设置用户的磁盘配额
[root@ljh99 ~]# xfs_quota -x -c 'limit bsoft=250M bhard=300M isoft=100 ihard=150 myquota1' /home/
[root@ljh99 ~]# xfs_quota -x -c 'limit bsoft=250M bhard=300M isoft=0 ihard=0 myquota2' /home/
#将myquotal2用户权限复制给其他用户
[root@ljh99 ~]# edquota -p myquota2 -u myquota3
[root@ljh99 ~]# edquota -p myquota2 -u myquota4
[root@ljh99 ~]# edquota -p myquota2 -u myquota5
#验证
[root@ljh99 ~]# xfs_quota -x -c report /home/
User quota on /home (/dev/mapper/rhel-home)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 0 0 0 00 [--------]
myquota1 16 256000 307200 00 [--------]
myquota2 16 256000 307200 00 [--------]
myquota3 16 256000 307200 00 [--------]
myquota4 16 256000 307200 00 [--------]
myquota5 16 256000 307200 00 [--------]
设置组的磁盘配额
方法一
[root@ljh99 ~]# edquota -g myquotagrp
Disk quotas for group myquotagrp (gid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/rhel-home 80 921600 1048576 25 0 0
方法二
[root@ljh99 ~]# xfs_quota -x -c 'limit -g bsoft=900M bhard=1G myquotagrp' /home/
方法三
[root@ljh99 ~]# setquota -g myquotagrp 900M 1G 0 0 /home
#磁盘配额限制设置为900MB和1G(硬和软配额限制),0 0表示没有限制inode数量,/home是指系统要设置的硬盘分区/挂载点。
#验证
[root@ljh99 ~]# xfs_quota -x -c report /home/
Group quota on /home (/dev/mapper/rhel-home)
Blocks
Group ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 0 0 0 00 [--------]
myquotagrp 80 921600 1048576 00 [--------]
设置宽限时间14天
方法一
[root@ljh99 ~]# edquota -t
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/mapper/rhel-home 14days 7days
方法二
[root@ljh99 ~]# xfs_quota -xc 'timer -b -u 14days' /home
#验证
[root@ljh99 ~]# xfs_quota -x -c state
User quota state on /home (/dev/mapper/rhel-home)
Accounting: ON
Enforcement: ON
Inode: #141 (2 blocks, 2 extents)
Blocks grace time: [14 days]
......
使用repquota命令查看文件系统的配额报表
[root@ljh99 ~]# repquota -ug /dev/mapper/rhel-home
*** Report for user quotas on device /dev/mapper/rhel-home
Block grace time: 14days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 0 0 0 3 0 0
myquota1 -- 16 256000 307200 5 100 150
myquota2 -- 16 256000 307200 5 0 0
myquota3 -- 16 256000 307200 5 0 0
myquota4 -- 16 256000 307200 5 0 0
myquota5 -- 16 256000 307200 5 0 0
*** Report for group quotas on device /dev/mapper/rhel-home
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 0 0 0 3 0 0
myquotagrp -- 80 921600 1048576 25 0 0
测试与管理
以myquota1为例验证用户的磁盘配额
硬盘容量限制
[root@ljh99 ~]# su - myquota1
#写入一个200MB的文件file1,可以正常写入
[myquota1@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=200M
记录了1+0 的读入
记录了1+0 的写出
209715200 bytes (210 MB, 200 MiB) copied, 0.139671 s, 1.5 GB/s
#再写入一个200MB的文件file2,超300MB部分无法写入
[myquota1@ljh99 ~]$ dd if=/dev/zero of=file2 count=1 bs=200M
dd: 写入'file2' 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
104792064 bytes (105 MB, 100 MiB) copied, 0.103298 s, 1.0 GB/s
[myquota1@ljh99 ~]$ ll -h
总用量 300M
-rw-r--r--. 1 myquota1 myquotagrp 200M 11月 13 07:24 file1
-rw-r--r--. 1 myquota1 myquotagrp 100M 11月 13 07:24 file2
文件数量限制值
[root@ljh99 ~]# su - myquota1
[myquota1@ljh99 ~]$ for i in {1..101};do touch $i ;done
touch: 无法创建 '101': 超出磁盘限额
[myquota1@ljh99 ~]$ ls
1 11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 52 55 58 60 63 66 69 71 74 77 8 82 85 88 90 93 96 99
10 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 53 56 59 61 64 67 7 72 75 78 80 83 86 89 91 94 97
100 13 16 19 21 24 27 3 32 35 38 40 43 46 49 51 54 57 6 62 65 68 70 73 76 79 81 84 87 9 92 95 98
组磁盘配额验证
从以下结果可以验证:组内的用户是共享空间或文件数的,并不是平均分配组限额的空间,而是先到先得,谁先占用,谁就有可能占满这空间,后来的就没有空间可用的。
[root@ljh99 ~]# su - myquota1
[myquota1@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=300M
dd: 写入'file1' 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
314376192 bytes (314 MB, 300 MiB) copied, 0.210725 s, 1.5 GB/s
[myquota1@ljh99 ~]$ ll -h
总用量 300M
-rw-r--r--. 1 myquota1 myquotagrp 300M 11月 13 07:30 file1
[root@ljh99 ~]# su - myquota2
[myquota2@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=300M
dd: 写入'file1' 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
310378496 bytes (310 MB, 296 MiB) copied, 1.56399 s, 198 MB/s
[myquota2@ljh99 ~]$ ll -h
总用量 296M
-rw-r--r--. 1 myquota2 myquotagrp 296M 11月 13 07:31 file1
[root@ljh99 ~]# su - myquota3
[myquota3@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=300M
dd: 写入'file1' 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
314376192 bytes (314 MB, 300 MiB) copied, 1.54786 s, 203 MB/s
[myquota3@ljh99 ~]$ ll -h
总用量 300M
-rw-r--r--. 1 myquota3 myquotagrp 300M 11月 13 07:31 file1
[root@ljh99 ~]# su - myquota4
[myquota4@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=300M
dd: 写入'file1' 出错: 超出磁盘限额
记录了1+0 的读入
记录了0+0 的写出
119209984 bytes (119 MB, 114 MiB) copied, 0.691382 s, 172 MB/s
[myquota4@ljh99 ~]$ ll
总用量 116416
-rw-r--r--. 1 myquota4 myquotagrp 119209984 11月 13 07:31 file1
[myquota4@ljh99 ~]$ ll -h
总用量 114M
-rw-r--r--. 1 myquota4 myquotagrp 114M 11月 13 07:31 file1
[root@ljh99 ~]# su - myquota5
[myquota5@ljh99 ~]$ dd if=/dev/zero of=file1 count=1 bs=300M
dd: 打开'file1' 失败: 超出磁盘限额
[myquota5@ljh99 ~]$ ll
总用量 0
评论区