xfs文件系统根分区磁盘配额
问题:个别用户的作业在计算节点产生的临时文件过大,造成根分区存储达到100%占用,造成slurm作业系统服务异常(节点显示drain或drng状态),且定时清理脚本也无法运行。
分析及解决方法:我们的集群没有大的存储,目前是让作业的临时存储写在/tmp目录下的。计算节点不需要安装软件和划分/home分区,用管理节点NFS共享的就行,因而把根分区设置最大,但这样也会由于临时文件过大达100%造成服务异常。为了使根分区不达到100%,现需要对其进行磁盘限额。集群所有用户都给属于chem组,所以这里设置组用户磁盘限额,对于根分区的容量软限制为92%,容量硬限制为98%。
环境:系统版本是Rocky Linux 8.x,根分区文件系统是xfs。
根分区启用磁盘配额¶
grub配置文件添加rootflags¶
使用mount命令检查配额是否被禁用
[root@cu01 ~]# mount |grep rl-root
/dev/mapper/rl-root on / type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
根分区启用磁盘配额,grub配置文件添加usrquota和grpquota的rootflags
sed -i 's/rhgb quiet/rootflags=usrquota,grpquota rhgb quiet/g' /etc/default/grub
备份grub配置文件,并生成新的grub配置文件¶
-
有EFI分区引导(有/sys/firmware/efi目录)
cp /boot/efi/EFI/rocky/grub.cfg /boot/efi/EFI/rocky/grub.cfg-org grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
-
没有EFI分区引导(没有/sys/firmware/efi目录)
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg-org grub2-mkconfig -o /boot/grub2/grub.cfg
重启并检查根分区磁盘配额是否启用¶
reboot重启后,再次进入系统,检查根分区磁盘配额是否启用
[root@cu01 ~]# mount |grep rl-root
/dev/mapper/rl-root on / type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota)
根分区磁盘配额设置¶
配额命令选项及限制项¶
-u 限制用户
-g 限制组
-x 专家模式(非交互模式)
-c 直接调用管理命令‘’部分
bsoft 容量软限制
bhard 容量硬限制
isoft 文件数软限制
ihard 文件数硬限制
查看根分区大小,判断容量限制¶
[root@cu01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 447.1G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 445.6G 0 part
├─rl-root 253:0 0 441.6G 0 lvm /
└─rl-swap 253:1 0 4G 0 lvm [SWAP]
[root@cu01 ~]# lsblk |grep rl-root |awk '{print $4}'
441.6G
为组用户设置容量限制¶
[root@cu01 ~]# xfs_quota -x -c 'limit -g bsoft=406G bhard=432G chem' /
[root@cu01 ~]# xfs_quota -x -c 'report -gbih' / |egrep "Group|Blocks|chem"
Group quota on / (/dev/mapper/rl-root)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
chem 0 406G 432G 00 [------] 40 0 0 00 [------]
测试验证¶
[root@cu01 ~]# su - userA
[userA@cu01 ~]$ id
uid=1001(userA) gid=1000(chem) groups=1000(chem)
[userA@cu01 ~]$ cd /tmp/
[userA@cu01 tmp]$ dd if=/dev/zero of=/tmp/tt.txt bs=1G count=433
dd: error writing '/tmp/tt.txt': Disk quota exceeded
432+0 records in
431+0 records out
463853256704 bytes (464 GB, 432 GiB) copied, 960.355 s, 483 MB/s
批处理设置¶
集群有很多计算节点,每个计算节点都按上面执行一遍太费时间了。由于中间需要涉及到计算节点的重启,这里写2个shell脚本,借助pdsh并行远程命令批处理执行即可。
root-partition-disk-quota-pre.sh
把root-partition-disk-quota-pre.sh脚本放在/opt/temp目录下,添加可执行权限后,再用pdsh并行远程命令批处理执行:
#!/bin/bash
# 根分区启用磁盘配额,添加usrquota和grpquota的rootflags
sed -i 's/rhgb quiet/rootflags=usrquota,grpquota rhgb quiet/g' /etc/default/grub
# 备份grub配置文件,并生成新的grub配置文件
if [ -d /sys/firmware/efi ]; then
# 有EFI分区引导
cp /boot/efi/EFI/rocky/grub.cfg /boot/efi/EFI/rocky/grub.cfg-org
grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
else
# 没有EFI分区引导
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg-org
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
# 重启计算节点
reboot
[root@quantum ~]# chmod +x /opt/temp/root-partition-disk-quota-pre.sh
[root@quantum ~]# pdsh -a /opt/temp/root-partition-disk-quota-pre.sh
root-partition-disk-quota-post.sh
把root-partition-disk-quota-post.sh脚本放在/opt/temp目录下,添加可执行权限后,再用pdsh并行远程命令批处理执行:
#!/bin/bash
# 获取根分区的大小及其单位
ROOT_SIZE=$(lsblk | grep rl-root | awk '{print $4}')
ROOT_SIZE_UNIT=${ROOT_SIZE: -1} # 获取单位 (最后一个字符)
ROOT_SIZE_VALUE=${ROOT_SIZE%?} # 获取数值部分
# 将大小统一转换为 GiB
if [[ "$ROOT_SIZE_UNIT" == "T" ]]; then
ROOT_SIZE_GB=$(echo "scale=0; $ROOT_SIZE_VALUE * 1024 / 1" | bc) # T -> G
elif [[ "$ROOT_SIZE_UNIT" == "G" ]]; then
ROOT_SIZE_GB=$ROOT_SIZE_VALUE
else
echo "未知的根分区大小单位: $ROOT_SIZE_UNIT"
exit 1
fi
# 计算软限制和硬限制并四舍五入
BSoft=$(echo "scale=0; $ROOT_SIZE_GB * 0.92 / 1" | bc)
BHard=$(echo "scale=0; $ROOT_SIZE_GB * 0.98 / 1" | bc)
# 设置配额(请替换 <groupname> 为实际的用户组名)
GROUP_NAME="chem"
xfs_quota -x -c "limit -g bsoft=${BSoft}G bhard=${BHard}G $GROUP_NAME" /
echo "Soft limit set to: ${BSoft}G"
echo "Hard limit set to: ${BHard}G"
[root@quantum ~]# chmod +x /opt/temp/root-partition-disk-quota-post.sh
[root@quantum ~]# pdsh -a /opt/temp/root-partition-disk-quota-post.sh
参考¶
本文阅读量 次本站总访问量 次