跳转至

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)
noquota表明没有启用,如果启用是会有usrquota和grpquota。

根分区启用磁盘配额,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)
屏幕输出有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
cu01节点的根分区大小为441.6G,那么我们要限制组用户chem所使用的容量软限制为92%(即406G),容量硬限制为98%(即432G,去掉小数点后面的值)。

为组用户设置容量限制

[root@cu01 ~]# xfs_quota -x -c 'limit -g bsoft=406G bhard=432G chem' /
查看磁盘配额,report的选项: -u, 对用户配额进行查看; -g, 对组配额进行查看; -b, block即块设备容量; -i, innode即节点限制情况; -h, 以易于人类可读的格式显示配额(如G或T)。
[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 [------]
可看到屏幕输出,chem组用户在根分区容量的软限制是406G,硬限制是432G。

测试验证

[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
userA想写入433G的数据,屏幕提示“Disk quota exceeded”,最后只能写入432G数据,代表根分区磁盘配额对组用户设置生效。

批处理设置

集群有很多计算节点,每个计算节点都按上面执行一遍太费时间了。由于中间需要涉及到计算节点的重启,这里写2个shell脚本,借助pdsh并行远程命令批处理执行即可。

root-partition-disk-quota-pre.sh
#!/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-partition-disk-quota-pre.sh脚本放在/opt/temp目录下,添加可执行权限后,再用pdsh并行远程命令批处理执行:
[root@quantum ~]# chmod +x /opt/temp/root-partition-disk-quota-pre.sh
[root@quantum ~]# pdsh -a /opt/temp/root-partition-disk-quota-pre.sh
pdsh批处理执行后,所有计算节点重启。重启好后,再执行第2个脚本root-partition-disk-quota-post.sh
root-partition-disk-quota-post.sh
#!/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-partition-disk-quota-post.sh脚本放在/opt/temp目录下,添加可执行权限后,再用pdsh并行远程命令批处理执行:
[root@quantum ~]# chmod +x /opt/temp/root-partition-disk-quota-post.sh
[root@quantum ~]# pdsh -a /opt/temp/root-partition-disk-quota-post.sh

参考

  1. Linux:为xfs文件系统卷 设置磁盘配额
  2. 如何在 XFS 或 Ext4 Linux 系统上启用磁盘配额
  3. 好好学Linux:基于 xfs_quota 限制目录大小
本文阅读量  次
本站总访问量  次