磁盘配额(Quota):指对有限资源的分配, Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。磁盘配额在实际生活中其实是很常见的,比如,我们的邮箱不管多大,都是有限制的,而不可能无限制地存储邮件;我们可以上传文件的服务器也是有容量限制的;网页中的个人空间也不可能让我们无限制地使用。
在此概念中,有以下几个重点需要注意:
磁盘配额要想正常使用,有以下几个前提条件:
内核必须支持磁盘配额。Centos 7.x 版本的 Linux 默认支持磁盘配额,不需要做任何修改。可以查看内核配置文件,看是否支持磁盘配额。命令如下:
[root@CncLucZK test]# grep CONFIG_QUOTA /boot/config-4.18.0-80.el8.x86_64
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
可以看到,内核已经支持磁盘配额。如果内核不支持,就需要重新编译内核,加入 quota supper 功能。
系统中必须安装了 Quota 工具。我们的 Linux 中默认安装了 Quoted 工具,查看命令如下:
[root@CncLucZK test]# rpm -qa | grep quota
quota-nls-4.04-10.el8.noarch
quota-4.04-10.el8.x86_64
要支持磁盘配额的分区必须开启磁盘配额功能。这项功能可以手动开启,不再是默认开启的。
磁盘配额可用于限制每个人可用网页空间、邮件空间以及网络硬盘空间的容量。除此之外,在 Linux 系统资源配置方面,使用磁盘配额,还可以限制某一群组或某一使用者所能使用的最大磁盘配额,以及以 Link 的方式,来使邮件可以作为限制的配额(更改 /var/spool/mail 这个路径)。
磁盘配额中的常见概念:
[root@CncLucZK test]# df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 50G 8.5G 39G 18% /
/home 确实是独立的文件系统,因此可以直接对其进行限制。如果所用系统中,/home 不是独立的文件系统,则可能就要针对根目录做磁盘配额了,但不建议大家这样做。
[root@CncLucZK ~]# df -ahT /home
Filesystem Type Size Used Avail Use% Mounted on
/dev/hda3 ext3 50G 8.5G 39G 18% /
#/home 的文件系统为 ext4,是支持磁盘配额的。
在此基础上,如果想要获得文件系统的支持,还需要为执行的文件系统添加挂载参数,分别是 usrquota(启用用户限额)和 grpquota(启动用户组限额),添加的方式有以下 2 种:
如果只是想在本次启动中试验磁盘配额,则只需使用如下的方式手动添加挂载参数:
[root@CncLucZK ~]# mount -o remount,usrquota,grpquota /home
[root@CncLucZK ~]# mount | grep home
/dev/hda3 on /home type ext3 (rw,usrquota,grpquota)
手动添加的方式,会在下次重新挂载时消失,因此我们可以直接修改 /etc/fstab 文件,将挂载参数写入到配置文件中,这样,即便重新挂载也不会消失,执行命令如下:
[root@CncLucZK ~]# vi /etc/fstab
......
/home /home ext3 defaults,usrquota,grpquota 1 2
[root@CncLucZK ~]# umount /home
[root@CncLucZK ~]# mount -a
[root@CncLucZK ~]# mount | grep home
/dev/hda3 on /home type ext3 (rw,usrquota,grpquota)
注意,修改完 /etc/fatab 文件后,务必要亲自测试一下,有问题赶紧处理,因为此文件修改错误,将直接导致系统无法启动。
由此,我们就成功启用了文件系统对磁盘配额的支持,但此时还是不能立即使用磁盘配额,还需进一步检测相应的文件系统,并建立磁盘配额文件,这就需要使用 quotacheck 命令。
[root@CncLucZK ~]# quotacheck [-avugfM] 文件系统
此命令常用的选项以及各自的功能。
选项 | 功能 |
---|---|
-a | 扫瞄所有在 /etc/mtab 中,含有 quota 支持的 filesystem,加上此参数后,后边的文件系统可以不写; |
-u | 针对使用者扫瞄文件与目录的使用情况,会创建 aquota.user |
-g | 针对群组扫瞄文件与目录的使用情况,会创建 aquota.group |
-v | 显示扫瞄的详细过程; |
-f | 强制扫瞄文件系统,并写入新的 quota 记录文件 |
-M(大写) | 强制以读写的方式扫瞄文件系统,只有在特殊情况下才会使用。 |
在使用这些选项时,只需一起下达 -avug
即可。至于 -f 和 -M 选项,是在文件系统以启动 quota 的情况下,还要重新扫描文件系统(担心有其他用户在使用 quota 中),才需要使用这两个选项。
可以使用如下的命令,对整个系统中含有挂载参数(usrquota 和 grpquota)的文件系统进行扫描:
[root@CncLucZK ~]# quotacheck -avug
quotacheck: Scanning /dev/hda3 [/home] quotacheck: Cannot stat old user quota
file: No such file or directory <--有找到文件系统,但尚未制作记录文件!
quotacheck: Cannot stat old group quota file: No such file or directory
quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
done <--上面三个错误只是说明记录文件尚未创建而已,可以忽略不理!
quotacheck: Checked 130 directories and 107 files <--实际搜寻结果
quotacheck: Old file not found.
quotacheck: Old file not found.
# 若运行这个命令却出现如下的错误信息,表示你没有任何文件系统有启动 quota 支持!
# quotacheck: Can't find filesystem to check or filesystem not mounted with quota option.[root@CncLucZK ~]# ll -d /home/a*
-rw------- 1 root root 8192 Mar 6 11:58 /home/aquota.group
-rw------- 1 root root 9216 Mar 6 11:58 /home/aquota.user
# 可以看到,扫描的同时,会创建两个记录文件,放在 /home 底下
注意,此命令不要反复的执行,因为若启动 Quota 后还执行此命令,会破坏原有的记录文件,同时产生一些错误信息。
通过执行 quotacheck 命令,就可以成功创建支持配额的记录文件,不要去手动编辑这两个文件,一方面,这两个文件是 Quota 自己的数据文件,并不是纯文本文件;并且在你对该文件系统进行操作时,操作的结果会同步到这两个文件中,因此文件中的数据会发生变化。
[root@CncLucZK ~]# quotaon [-avug]
[root@CncLucZK ~]# quotaon [-vug] 文件系统名称
选项 | 功能 |
---|---|
-a | 根据 /etc/mtab 文件中对文件系统的配置,启动相关的Quota服务,如果不使用 -a 选项,则此命令后面就需要明确写上特定的文件系统名称 |
-u | 针对用户启动 Quota(根据记录文件 aquota.user) |
-g | 针对群组启动 Quota(根据记录文件 aquota.group) |
-v | 显示启动服务过程的详细信息 |
注意,quotaon -auvg 命令只需要在第一次启动 Quota 服务时才需要进行,因为下次重新启动系统时,系统的 /etc/rc.d/rc.sysinit 初始化脚本会自动下达这个命令。
root@CncLucZK ~]# quotaon -auvg
/dev/hda3 [/home]: group quotas turned on
/dev/hda3 [/home]: user quotas turned on
[root@CncLucZK ~]# quotaon -uv /var
[root@CncLucZK ~]# quotaoff [-avug]
[root@CncLucZK ~]# quotaoff [-vug] 文件系统名称
选项 | 功能 |
---|---|
-a | 根据 /etc/mtab 文件,关闭已启动的 Quota 服务,如果不使用 -a 选项,则此命令后面就需要明确写上特定的文件系统名称 |
-u | 关闭针对用户启动的 Quota 服务。 |
-g | 关闭针对群组启动的 Quota 服务。 |
-v | 显示服务过程的详细信息 |
[root@CncLucZK ~]# quotaoff -auvg
[root@CncLucZK ~]# quotaoff -uv /var
[root@CncLucZK ~]# edquota [-u 用户名] [-g 群组名]
[root@CncLucZK ~]# edquota -t
[root@CncLucZK ~]# edquota -p 源用户名 -u 新用户名
此命令各常用选项及功能:
选项 | 功能 |
---|---|
-u 用户名 | 进入配额的 Vi 编辑界面,修改针对用户的配置值; |
-g 群组名 | 进入配额的 Vi 编辑界面,修改针对群组的配置值; |
-t | 修改配额参数中的宽限时间; |
-p | 将源用户(或群组)的磁盘配额设置,复制给其他用户(或群组)。 |
以用户 myquota 为例,通过如下命令配置此命令的 Quota:
[root@CncLucZK ~]# 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
表头 | 含义 |
---|---|
文件系统(filesystem) | 说明该限制值是针对哪个文件系统(或分区); |
磁盘容量(blocks) | 此列的数值是 quota 自己算出来的,单位为 Kbytes,不要手动修改; |
磁盘容量的软限制(soft) | 当用户使用的磁盘空间超过此限制值,则用户在登陆时会收到警告信息,告知用户磁盘已满,单位为 KB; |
磁盘容量的硬限制(hard) | 要求用户使用的磁盘空间最大不能超过此限制值,单位为 KB; |
文件数量(inodes) | 同 blocks 一样,此项也是 quota自己计算出来的,无需手动修改; |
文件数量的软限制(soft) | 当用户拥有的文件数量超过此值,系统会发出警告信息; |
文件数量的硬限制(hard) | 用户拥有的文件数量不能超过此值。 |
注意,当 soft/hard 为 0 时,表示没有限制。另外,在 Vi(或 Vim)中修改配额值时,填写的数据无法保证同表头对齐,只要保证此行数据分为 7 个栏目即可。
[root@CncLucZK ~]# edquota -u myquota
Disk quotas for user myquota (uid 710):Filesystem blocks soft hard inodes soft hard/dev/hda3 80 250000 300000 10 0 0
[root@CncLucZK ~]# edquota -g mygrpquota
Disk quotas for group mygrpquota (gid 713):Filesystem blocks soft hard inodes soft hard/dev/hda3 400 900000 1000000 50 0 0
[root@CncLucZK ~]# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or secondsFilesystem Block grace period Inode grace period/dev/hda3 14days 7days
若我们需要写脚本建立大量的用户,并给每个用户都自动进行磁盘配额,那么 edquota 命令就不能在脚本中使用了,因为这个命令的操作过程和 vi 类似,需要和管理员产生交互。这种情况下就需要利用 setquota 命令进行设置,这个命令的好处是通过命令行设定配额,而不用和管理员交互设定。
edquota 命令格式如下:
[root@CncLucZK ~]# setquota -u 用户名 容量软限制 容量硬限制 个数软限制 个数硬限制 分区名
[root@CncLucZK ~]# useradd user1
[root@CncLucZK ~]# passwd user1
#建立用户
[root@CncLucZK ~]# setquota -u user1 10000 20000 5 8 /disk
#设定用户在/disk分区中的容量软限制为10MB,硬限制为20MB;文件个数软限制为5个,硬限制为8个
[root@CncLucZK ~]# quota -uvs user1
Disk quotas for user user1 (uid 503):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdbl 0 10000 20000 0 5 8
#查看一下,配额生效了
这个命令在写脚本进行批量设置时更加方便。当然,在写脚本时也可以先建立一个模板用户,设定好磁盘配额,再进行配额复制。
对于建立好的磁盘配额,还需要有效的查询配额的手段,这样才能知道系统中到底有哪些分区设定了哪些配额。
查询磁盘配额有两种方法:
quota 命令查询用户或用户组配额
[root@CncLucZK ~] # quota [选项] [用户名或组名]
[root@CncLucZK 〜]# quota -uvs user1
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 20 0 0 6 0 0
/dev/sdbl 0 40000 50000 0 8 10
#查看user1用户的配额值
[root@CncLucZK ~]# quota -uvs user2
Disk quotas for user user2 (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 36752 0 0 2672 0 0
/dev/sdbl 0 245M 293M 0 0 0
#查看user2用户的配额值
user1用户的配额值还不够大,所以没有换算成 MB 单位,但是 user2用户已经换算了。在选项列当中多出了 grace 字段,这里是用来显示宽限时间的,我们现在还没有达到软限制,所以 grace 字段为空。
[root@CncLucZK ~] # repquota [选项] [分区名]
[root@CncLucZK ~] # repquota -augvs
*** Report for user quotas on device /dev/sdbl
#用户配额信息
Block grace time: 8days; Inode grace time: 8days
Block limits File limits
User used soft hard grace used soft hard grace
root -- 13 0 0 2 0 0
userl -- 0 40000 50000 0 8 10
user2 -- 0 245M 293M 0 0 0
user3 -- 0 245M 293M 0 0 0
#用户的配额值
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 4
Used average: 4.000000
*** Report for group quotas on device /dev/sdbl
#组配额信息
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
root -- 13 0 0 2 0 0
brother -- 0 440M 489M 0 0 0
#组的配额值
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 2
Used average: 2.000000
参考文献:
磁盘配额是什么,磁盘配额概述