经过前面配置好Slurm集群管理系统之后,经过和用户沟通,希望限制每次新建用户的磁盘使用量,由于之前是没有限制过的,所以导致很多老师和同学把服务器当成网盘在使用。上传文件后都不删除,导致原本充裕的磁盘后面都不够用了。数据多了,磁盘的读写速度也受到了一定的影响。
基于此,用户提出2个需求:
- 自动将NFS共享目录下超过3个月没有更新的文件删除。
- 将新建用户的磁盘使用量限定在1.5T内。
其中第1个需求比较简单,直接按照相应的逻辑写一个Shell
脚本,然后设定计划启动程序即可;第2个需求稍微繁琐一点,需要使用到quote
服务。
详细操作步骤如下所示:
删除/home目录下超过3个月未更新的文件
Shell脚本内容
脚本名称.delete3MonthsFile.sh
,放入root
目录下。
1 | !/bin/bash |
为了防止把相关配置文件也删除,在过滤文件时将隐藏文件剔除,加上了-not -path '*/\.*'
。
计划启动程序配置
输入以下命令设置cron
作业
1 | crontab -e |
输入以下内容:
1 | 0 0 * * * /root/.delete3MonthsFile.sh |
这样每天的凌晨00:00
就会自动检查/home
目录,当文件超过3个月未修改时就会自动删除。
但是经过测试,创建出来的用户目录相关的配置文件也会是很久之前的文件,该代码会导致第二天用户配置文件被删除,用户无法登录。(这个对自己的需求是否会有影响,建议自己衡量)
为新建用户的家目录设置磁盘使用上限为1.5T
关闭selinux
输入以下命令查看是否关闭
1 | getenforce |
如果返回Disabled
说明Selinux
是关闭状态;返回Enforcing
则说明未关闭。
打开文件/etc/selinux/config
,然后将Selinux
的值设置为disabled
。
1 | vim /etc/selinux/config |
注意:上述操作做完,重启后才可以关闭Selinux
,现在Selinux
已经是开启状态。
如果不想重启,可以执行以下命令,临时关闭Selinux
。
1 | setenforce 0 |
下载quota服务
输入以下命令下载quota
服务
1 | yum install -y quota |
配置要挂载的磁盘
由于我使用的是NFS
服务来共享目录,所以我需要在存储服务器下做下述操作。
首先输入以下代码查看需要设置的磁盘名称
1 | lsblk |
这里我之前挂载过,所以显示该磁盘已挂载在/home
目录下,为了不影响其他服务的使用,我在这里就不将其取消挂载再重新挂载,大家只要看到你自己要挂的磁盘NAME
名称,我这里是sdc
。所以磁盘路径为/dev/sdc
将目录格式化为ext4
格式
1 | mkfs.ext4 /dev/sdc |
接下来开始挂载磁盘,输入以下命令,编辑/etc/fstab
文件
1 | vim /etc/fstab |
在该文件最下方加入以下内容,这里我需要将磁盘挂载为/home
目录,你需要根据自己的需求进行修改:
1 | /dev/sdc /home ext4 defaults,usrquota,grpquota 0 0 |
注意:一定要将需要做磁盘配额的目录挂载为
ext4
格式。
接下来输入mount -a
使得修改的fstab
文件生效。
1 | mount -a |
输入mount
查看挂载的效果。
1 | mount |
成功挂载,并且有userquota
和grpquota
参数,表示支持用户配额
和组配额
。
设置磁盘配额
创建用户配额
和组配额
文件
1 | quotacheck -ug /home/ |
运行该代码后会自动再/home/
目录下生成两个文件
aquota.group
aquota.user
用户配额
接下来我们就可以做用户配额了,用户配额是指对某个具体的用户限制其磁盘使用。
为了演示方便,首先创建一个用户,接下来对该用户的家目录验证磁盘配额是否设置成功。
1 | useradd test |
然后对用户限制配额
1 | edquota -u test |
返回以下内容
在该配置文件中我们可以修改4个参数值。
首先是blocks
后面的soft
和hard
。
参数意义如下:
soft
:软限制。存储内容超过该参数数值(单位:kb)时,会向用户发出警告信息,表示即将超过磁盘限制,但是仍然可以写入文件。hard
:硬限制。存储内容超过该参数数值(单位:kb)时,会向用户发出报错,超出磁盘容量,并且超出次磁盘空间的内容将无法写入。
例如我将其设置为10240
和20480
时,表示当该用户在/home
目录下的磁盘使用量超过10M
时,将向用户发出警告信息;当超过20M
时将无法再继续写入磁盘。
启动磁盘配额,为了防止有时候无法启动quota
服务,在这里我们每次启动quota
服务时,都建议先将其关闭,再重新启动。
1 | quotaoff -a && quotaon -ug /home |
切换到test
用户并进入用户家目录,测试磁盘配额是否生效。
1 | su test && cd |
开始模拟数据写入,首先写入9M
内容。
1 | dd if=/dev/zero of=/home/test/1 bs=1M count=9 |
文件写入成功
再写入2M
看看返回结果
1 | dd if=/dev/zero of=/home/test/2 bs=1M count=2 |
文件内容超过10M
,产生警告。
继续向其中写入20M
。
1 | dd if=/dev/zero of=/home/test/3 bs=1M count=20 |
文件内容超过20M
,产生报错。并且超过20M
的内容无法写入。
查看当前文件夹内容
发现文件还是被创建出来了,只是由于磁盘容量的限制3
这个文件内容只存储了一部分,没有达到20M
。
然后是inodes
后面的soft
和hard
。
首先删除刚刚创建的1 2 3
文件,然后退出test
用户。
1 | rm -rf ~/1 ~/2 ~/3 && exit |
重新配置用户配额
1 | edquota -u test |
将刚刚配置的blocks
后面的soft
和hard
还原,然后设置inodes
后面的soft
和hard
为10
和15
。
重启quota
服务
1 | quotaoff -a && quotaon -ug /home |
然后进入test
用户并进入用户家目录,测试磁盘配额是否生效。
1 | su test |
首先再用户目录下创建4个文件
1 | touch 1 2 3 4 |
由于用户目录下会有一些隐藏文件,我们使用命令ll -a
进行查看
然后继续创建,所有的隐藏文件加当前目录.
一共有6个,均属于test
用户,然后加上刚刚创建的4个,现在在该目录下一共有10
个test
用户创建的文件。
继续创建一个
1 | touch 5 |
这个时候会产生警告信息,但是文件仍然可以创建。
继续创建5个文件。
1 | touch 6 7 8 9 10 |
这个时候返回内容如下,发生了报错,并且文件10
没有创建成功。
总结:
blocks
后面的soft
和hard
分别表示警告磁盘容量和磁盘容量上限。inodes
后面的soft
和hard
分别表示警告文件数量和文件数量上限。
组配额
组配额的功能是为某个组设置磁盘配额,该组中所有的用户共用这个磁盘配额,在后续内容中演示具体使用方法和使用特点。
为了演示组配额效果,首先还原test
用户配额
1 | edquota -u test |
重启quota
服务
1 | quotaoff -a && quotaon -ug /home |
进入test
用户,测试还原是否成功
1 | su test |
创建13
个文件。
1 | touch 1 2 3 4 5 6 7 8 9 10 11 12 13 |
创建成功,说明test
用户配额还原成功。
接下来演示组配额。
创建测试组test_group
。
1 | groupadd -g 660 testgroup |
为了方便在多台机器之间创建相同编号的group
,建议在安装时指定用户组GID
。多台机器指定同一个GID
可以相互之间识别。
将test
用户加入到test_group
。
1 | usermod test -g testgroup |
设置组配额
1 | edquota -g testgroup |
在这里仅演示存储空间磁盘配额,文件数磁盘配额同理,不再演示。
重启quota
服务
1 | quotaoff -a && quotaon -ug /home |
进入test
用户,然后创建文件看是否可以限制test
用户的磁盘使用。
直接创建一个30M
的文件,看是否可以创建成功。
1 | dd if=/dev/zero of=/home/test/1 bs=1M count=30 |
发现出现报错,并且磁盘使用量只有20M。
说明限制成功。
到这里有的读者可能会有一个疑问,这个组配额是限制组内用户共用一个配额,还是给组中所有的用户配置相同的配额。在这个具体的例子中就是:比如我又创建了一个用户test2
,并且将其放入testgroup
组中,那么这里的20M
的配额是test
和test2
一起的上限,还是test
和test2
各有20M
的配额。
接下来我们演示一下。
创建新用户test2
并将其放入testgroup
中。
1 | useradd test2 -g testgroup |
然后进入test2
中创建一个30M
的文件。
1 | dd if=/dev/zero of=/home/test2/1 bs=1M count=30 |
从返回的结果可以看出,文件创建失败,并且test2
用户目录只有20K
的占用。
从这个结论中可以说明这里组配额,是给组中所有的用户创建的一个共用配额,一旦达到或者超过这个配额,所有的用户都无法写入数据。
使用setquota命令进行磁盘配额管理
有时候需要使用shell
脚本进行自动化磁盘配额,这个时候再去打开配置文件进行修改就显得很繁琐,为了应对这个需求,quota
提供了setquota
进行磁盘配额管理,使用方法非常简单。
1 | setquota -u <username> blocks_soft blocks_hard inodes_sofe inodes_hard </filename> |
例如,我想将test
用户在/home
目录中磁盘使用软限制和硬限制分别设置为10M
和20M
。
1 | setquota -u test 10240 20480 0 0 /home |
这样设置完后用户的配置文件就会自动进行修改。
至此,磁盘配额讲解结束。