0%

Centos7磁盘配额管理

经过前面配置好Slurm集群管理系统之后,经过和用户沟通,希望限制每次新建用户的磁盘使用量,由于之前是没有限制过的,所以导致很多老师和同学把服务器当成网盘在使用。上传文件后都不删除,导致原本充裕的磁盘后面都不够用了。数据多了,磁盘的读写速度也受到了一定的影响。

基于此,用户提出2个需求:

  1. 自动将NFS共享目录下超过3个月没有更新的文件删除。
  2. 将新建用户的磁盘使用量限定在1.5T内。

其中第1个需求比较简单,直接按照相应的逻辑写一个Shell脚本,然后设定计划启动程序即可;第2个需求稍微繁琐一点,需要使用到quote服务。

详细操作步骤如下所示:

删除/home目录下超过3个月未更新的文件

Shell脚本内容

脚本名称.delete3MonthsFile.sh,放入root目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

directory="/home/" # 替换为目标目录的路径
log_file="/root/.cronLog"

# 计算三个月之前的时间戳
timestamp=$(date -d "3 months ago" +%s)

# 遍历目录中的文件
find "$directory" -type f -mtime +90 -not -path '*/\.*' -print0 | while IFS= read -r -d '' file; do
file_timestamp=$(stat -c %Y "$file") # 获取文件的修改时间戳
if [[ $file_timestamp -lt $timestamp ]]; then
rm "$file" # 删除文件
echo "$(date '+%Y-%m-%d %H:%M:%S') - Deleted file: $file" >> "$log_file"
fi
done

为了防止把相关配置文件也删除,在过滤文件时将隐藏文件剔除,加上了-not -path '*/\.*'

计划启动程序配置

输入以下命令设置cron作业

1
crontab -e

输入以下内容:

1
0 0 * * * /root/.delete3MonthsFile.sh

这样每天的凌晨00:00就会自动检查/home目录,当文件超过3个月未修改时就会自动删除。

但是经过测试,创建出来的用户目录相关的配置文件也会是很久之前的文件,该代码会导致第二天用户配置文件被删除,用户无法登录。(这个对自己的需求是否会有影响,建议自己衡量)

image-20230618175627373

为新建用户的家目录设置磁盘使用上限为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

image-20230618170819627

这里我之前挂载过,所以显示该磁盘已挂载在/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

image-20230618171953086

成功挂载,并且有userquotagrpquota参数,表示支持用户配额组配额

设置磁盘配额

创建用户配额组配额文件

1
quotacheck -ug /home/

运行该代码后会自动再/home/目录下生成两个文件

  • aquota.group
  • aquota.user

用户配额

接下来我们就可以做用户配额了,用户配额是指对某个具体的用户限制其磁盘使用。

为了演示方便,首先创建一个用户,接下来对该用户的家目录验证磁盘配额是否设置成功。

1
useradd test

然后对用户限制配额

1
edquota -u test

返回以下内容

image-20230618172805616

在该配置文件中我们可以修改4个参数值。

首先是blocks后面的softhard

image-20230618172843836

参数意义如下:

  • soft:软限制。存储内容超过该参数数值(单位:kb)时,会向用户发出警告信息,表示即将超过磁盘限制,但是仍然可以写入文件。
  • hard:硬限制。存储内容超过该参数数值(单位:kb)时,会向用户发出报错,超出磁盘容量,并且超出次磁盘空间的内容将无法写入。

例如我将其设置为1024020480时,表示当该用户在/home目录下的磁盘使用量超过10M时,将向用户发出警告信息;当超过20M时将无法再继续写入磁盘。

image-20230618173429447

启动磁盘配额,为了防止有时候无法启动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

文件写入成功

image-20230618175830226

再写入2M看看返回结果

1
dd if=/dev/zero of=/home/test/2 bs=1M count=2

image-20230618180002882

文件内容超过10M,产生警告。

继续向其中写入20M

1
dd if=/dev/zero of=/home/test/3 bs=1M count=20

image-20230618180112031

文件内容超过20M,产生报错。并且超过20M的内容无法写入。

查看当前文件夹内容

image-20230618180213182

发现文件还是被创建出来了,只是由于磁盘容量的限制3这个文件内容只存储了一部分,没有达到20M

然后是inodes后面的softhard

首先删除刚刚创建的1 2 3文件,然后退出test用户。

1
rm -rf ~/1 ~/2 ~/3 && exit

重新配置用户配额

1
edquota -u test

将刚刚配置的blocks后面的softhard还原,然后设置inodes后面的softhard1015

image-20230618181955093

重启quota服务

1
quotaoff -a && quotaon -ug /home

然后进入test用户并进入用户家目录,测试磁盘配额是否生效。

1
2
su test
cd ~

首先再用户目录下创建4个文件

1
touch 1 2 3 4

由于用户目录下会有一些隐藏文件,我们使用命令ll -a进行查看

image-20230618182136503

然后继续创建,所有的隐藏文件加当前目录.一共有6个,均属于test用户,然后加上刚刚创建的4个,现在在该目录下一共有10test用户创建的文件。

继续创建一个

1
touch 5

这个时候会产生警告信息,但是文件仍然可以创建。

image-20230618182351388

继续创建5个文件。

1
touch 6 7 8 9 10

这个时候返回内容如下,发生了报错,并且文件10没有创建成功。

image-20230618182455504

总结:

  • blocks后面的softhard分别表示警告磁盘容量和磁盘容量上限。
  • inodes后面的softhard分别表示警告文件数量和文件数量上限。

组配额

组配额的功能是为某个组设置磁盘配额,该组中所有的用户共用这个磁盘配额,在后续内容中演示具体使用方法和使用特点。

为了演示组配额效果,首先还原test用户配额

1
edquota -u test

image-20230618202656414

重启quota服务

1
quotaoff -a && quotaon -ug /home

进入test用户,测试还原是否成功

1
2
su test
cd ~

创建13个文件。

1
touch 1 2 3 4 5 6 7 8 9 10 11 12 13

image-20230618203219908

创建成功,说明test用户配额还原成功。

接下来演示组配额。

创建测试组test_group

1
groupadd -g 660 testgroup

为了方便在多台机器之间创建相同编号的group,建议在安装时指定用户组GID。多台机器指定同一个GID可以相互之间识别。

test用户加入到test_group

1
usermod test -g testgroup

设置组配额

1
edquota -g testgroup

在这里仅演示存储空间磁盘配额,文件数磁盘配额同理,不再演示。

image-20230618202505061

重启quota服务

1
quotaoff -a && quotaon -ug /home

进入test用户,然后创建文件看是否可以限制test用户的磁盘使用。

直接创建一个30M的文件,看是否可以创建成功。

1
dd if=/dev/zero of=/home/test/1 bs=1M count=30

发现出现报错,并且磁盘使用量只有20M。

image-20230618203650867

说明限制成功。

到这里有的读者可能会有一个疑问,这个组配额是限制组内用户共用一个配额,还是给组中所有的用户配置相同的配额。在这个具体的例子中就是:比如我又创建了一个用户test2,并且将其放入testgroup组中,那么这里的20M的配额是testtest2一起的上限,还是testtest2各有20M的配额。

接下来我们演示一下。

创建新用户test2并将其放入testgroup中。

1
useradd test2 -g testgroup

然后进入test2中创建一个30M的文件。

1
dd if=/dev/zero of=/home/test2/1 bs=1M count=30

image-20230618204647256

从返回的结果可以看出,文件创建失败,并且test2用户目录只有20K的占用。

从这个结论中可以说明这里组配额,是给组中所有的用户创建的一个共用配额,一旦达到或者超过这个配额,所有的用户都无法写入数据。

使用setquota命令进行磁盘配额管理

有时候需要使用shell脚本进行自动化磁盘配额,这个时候再去打开配置文件进行修改就显得很繁琐,为了应对这个需求,quota提供了setquota进行磁盘配额管理,使用方法非常简单。

1
setquota -u <username> blocks_soft blocks_hard inodes_sofe inodes_hard </filename>

例如,我想将test用户在/home目录中磁盘使用软限制和硬限制分别设置为10M20M

1
setquota -u test 10240 20480 0 0 /home

这样设置完后用户的配置文件就会自动进行修改。

image-20230618173429447

至此,磁盘配额讲解结束。

-------------本文结束感谢您的阅读-------------