一、前言
Linux 是一个多用户操作系统。在默认情况下,所有用户共享使用主机上的磁盘空间以及系统资源。
如果某个用户总是无节制地使用磁盘空间或系统资源,那么系统多多少少会出现不稳定现象,从而影响到其他用户的正常使用。
为此,我们一般需要对每个用户所使用的磁盘空间和系统资源进行限制,这样才能确保公平性。
下面将简单介绍限制各用户磁盘用量以及系统资源用量的操作方法。
二、实验环境
- 操作系统:CentOS 7.3.1708
- 磁盘文件系统:ext4
三、限制磁盘用量
3.1 打开挂载点的配额功能
3.1.1 修改挂载参数
请使用 vim 之类的文本编辑器打开 /etc/fstab
,找到需要限制磁盘用量的挂载点所在的行,在该行的第四列后面加上 ,userquota,grpquota
这两个参数。修改完成后记得保存文件。
例如
#修改前
UUID=0bedb5c4-7471-4eab-bfde-fa3b37dc4895 / ext4 defaults 1 1
#修改后
UUID=0bedb5c4-7471-4eab-bfde-fa3b37dc4895 / ext4 defaults,usrquota,grpquota 1 1
3.1.2 重新挂载磁盘
命令用法
mount -o remount <挂载点>
3.1.3 初始化配额配置文件
命令用法
quotacheck -ugm <挂载点>
执行完该命令之后,在挂载点上会生成 aquota.group
和 aquota.user
这两个配额配置文件。
3.1.4 开启挂载点的配额功能
命令用法
quotaon <挂载点>
3.2 修改配额参数
3.2.1 磁盘用量限制
命令用法
edquota <用户名>
执行完该命令之后,系统会打开一个 vi 文本编辑器来编辑用户的磁盘用量限制配置文件。
文件内容大概是这样子的:
Disk quotas for user mail (uid 8):
Filesystem blocks soft hard inodes soft hard
/dev/sda2 4 0 0 1 0 0
下面详细讲解该文件各字段功能以及配置方法。修改完成后记得保存文件。
当用户的磁盘用量达到软限制时,系统将给予用户提示,并且在宽限时间内允许用量最多增加到硬限制。
如果过了宽限时间,用户就必须释放磁盘空间来使磁盘用量降低到软限制以下。
3.2.2 全局宽限时间配置
命令用法
edquota -t
执行完该命令之后,系统会打开一个 vi 文本编辑器来编辑全局宽限时间配置文件。
文件内容大概是这样子的:
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/sda2 7days 7days
下面详细讲解该文件各字段功能以及配置方法。修改完成后记得保存文件。
3.3 关闭挂载点的配额功能
如果不再使用配额功能,可以关闭它。
命令用法
quotaoff <挂载点>
如果想清除配置,请自行删除挂载点上面的 aquota.group
和 aquota.user
这两个文件。
3.4 查询用户的配额参数
命令用法
quota <用户名>
3.5 用法举例
系统上有一个名为 yh1
的新用户,需要限制其使用不超过 250MB (宽限到 300MB)的存储空间和存储不超过 10000 个(宽限到 11000 个)文件或目录(挂载点为 /
,已经开启了配额功能)。配置完成后进行测试。
磁盘用量限制配置文件应为如下内容:
Disk quotas for user yh1 (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/sda2 3840 256000 307200 38 10000 11000
#存储空间需要转换为 KB
效果测试
以下的操作均以 yh1
用户的身份进行。
执行以下命令:
dd if=/dev/zero of=test #该命令的作用是创建一个名为 test 的文件来把磁盘填满
运行结果:
sda2: warning, user block quota exceeded. #提示已经超过软限制
sda2: write failed, user block limit reached. #提示已经超过硬限制
dd: 正在写入"test": 超出磁盘限额
记录了606705+0 的读入
记录了606704+0 的写出
310632448字节(311 MB)已复制,0.959923 秒,324 MB/秒
很明显,磁盘空间用量的限制已经生效了。我们先删掉 test
文件,再来测试一下 INDOE 的。
执行以下命令:
while :; do let i++; touch $i || break; echo $i; done #该命令的作用是不断地创建空文件
运行结果:
1
2
3
# <省略>
9962
sda2: warning, user file quota exceeded. #提示已经超过软限制
9964
# <省略>
10961
sda2: write failed, user file limit reached. #提示已经超过硬限制
touch: 无法创建"10963": 超出磁盘限额
很好,设置全部生效了!
四、限制系统资源用量
4.1 设置方法
请使用 vim 之类的文本编辑器打开 /etc/security/limits.conf
。
文件内容大概是这样子的(已省略掉一些内容):
#<domain> <type> <item> <value>
@faculty soft nproc 20
@faculty hard nproc 50
ftp hard nproc 0
@student - maxlogins 4
下面简要讲解该文件各字段功能以及配置方法。修改完成后记得保存文件。
由于该文件的配置比较简单,而且自带了配置说明,所以下面仅以限制进程数目为例。
如果需要配置限制其他系统资源,请参考自带的配置说明进行配置。
4.2 用法举例
系统上有一个名为 yh2
的新用户,需要限制其最多打开 16 个进程。配置完成后,使用 fork 炸弹进行测试。
应在 /etc/security/limits.conf
末尾添加如下内容:
yh2 hard nproc 16
效果测试
以下的操作均以 yh2
用户的身份进行。
.( ) { .|.& } ; . #引爆 fork 炸弹
运行结果:
[1] 45224
[yh2: ~]$ -bash: fork: retry: 资源暂时不可用
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
# <省略>
系统并不会卡死,说明限制生效了!