如何配置Ext4的磁盘配额?

Linux基础

1 基础知识

1.1 Disk Quota的概念

Disk Quota用于合理分配有限的磁盘使用空间

1.2 Disk Quota的配置方法

1.2.1 按空间和数量限额

– 用量配额(块配额),即限制可用空间量
– 文件配额(inode配额),即限制创建文件和目录的数量

1.2.2 按软硬限额

– 软配额,达到配额系统给予用户警告并不会采用限额行动
– 硬配额,达到配额系统拒绝用户保存数据
注:某些系统对硬配额有宽限时间(所以并非绝对)

1.2.3 限额的方式

– 根据项目ID限额
– 根据用户ID限额
– 根据用户组限额

1.2.4 项目或目录限额

– ext4、XFS、f2fs、ZFS、Lustre等文件系统支持目录定义块或inode限额
– 管理员首先需要向目录的文件添加项目ID以建立项目标识
– 管理员然后需要定义包含项目标识目录的配额以建立配额限制

1.3 支持配额的系统

– Unix系统,如AIX(使用JFS或JFS2文件系统)
– Linux系统(使用ext3、ext4、ext2、XFS文件系统)
– Solaris(使用UFS或ZFS文件系统)
– Windows 2000以后的系统

1.4 常见的Unix磁盘配额程序

– quota,显示与用户的文件系统用户配额
– edquota,编辑文件系统的用户配额
– setquota,为文件系统设置磁盘配额
– repquota,总览文件系统的配合
– quotacheck,文件系统配额一致性检查器
– /etc/fstab(Linux)或/etc/vfs/tab(Solaris),文件系统默认参数列表(包括配额状态)

2 最佳实践

2.1 安装Quota工具

dnf install -y quota

2.2 启用文件系统的配额

2.2.1 卸载文件系统

umount /dev/mapper/ds-data 

2.2.2 设置文件系统Quota

tune2fs -O quota /dev/mapper/ds-data
tune2fs -Q usrquota,grpquota,prjquota /dev/mapper/ds-data

另外,如果分区没有数据,可以直至使用如下命令格式化处理(可选操作且危险的操作,请谨慎选择使用),

mkfs.ext4 -O quota -E quotatype=usrquota:grpquota:prjquota /dev/mapper/ds-data 

2.2.3 测试系统挂载

mount -o prjquota /dev/mapper/ds-data /data/
umount /data

2.2.4 重新挂载文件系统以启用配额

blkid /dev/mapper/ds-data

可见如下显示,

/dev/mapper/ds-data: UUID="627ae760-3780-4357-8c14-fdb925cdf732" TYPE="ext4"

使用如下命令修改配置,

vim /etc/fstab

修改如下配置,

UUID=627ae760-3780-4357-8c14-fdb925cdf732 /data ext4 defaults,usrquota,grpquota,prjquota 0 0

然后,你需要重载服务使配置生效,然后挂载所有配置,

systemctl daemon-reload
mount -a

另外,以上挂载即已经在分区启用配额,因此如下命令无需再执行

quotaon -vugP /data
quotaon /data

2.3 设置项目配额

2.3.1 声明目录的对应项目ID

echo "00001:/data/ftp/ftpUser01" >> /etc/projects

需要注意的是,
– 冒号前面使用无符号长整型声明“project ID”即项目ID(取值范围0~4294967295)
– 冒号后面使用文件夹路径声明“IDprojected-controlled directory”即项目目录
根据上面的配置要求,你需要手动创建项目ID对应的目录,

mkdir -p /data/ftp/ftpUser01/myhome

2.3.2 声明项目ID的对应项目名称

echo "ftpUser01:00001" >> /etc/projid

需要注意的是,
– 冒号前面使用任意字符串声明“project name”即项目名称,本范例使用ftp的用户名称即“ftpUser01”作为项目名称
– 冒号后面声明“project ID”即项目ID
根据上面的配置要求,你需要手动创建项目ID对应的目录以及声明目录所属的项目ID,同时需要将用户上传目录标记为父目录,

chattr -p 1 /data/ftp/ftpUser01/myhome
chattr +P /data/ftp/ftpUser01/myhome
lsattr -p /data/ftp/ftpUser01

2.3.3 设置项目的配额

edquota -P ftpUser01

以下命令定义项目“ftpUser01”的配额,可见如下显示,

Disk quotas for user will (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/ds-data             816    1030000    1031711        102  1030000  1031711

以上配置解析如下,
– 列“Filesystem”声明启用配额的文件系统名称
– 列“blocks”声明当前用户使用的块数目
– 列“soft”声明该用户的blocks软限制(“0”则无限制)
– 列“hard”声明该用户的blocks硬限制(“0”则无限制)
– 列“inodes”声明当前用户使用的块数目
– 列“soft”声明该用户的inodes软限制(“0”则无限制)
– 列“hard”声明该用户的inodes硬限制(“0”则无限制)
另外,快捷的设置方法范例如下,

setquota -P ftpUser01 1030000 1031711 1030000 1031711 /dev/mapper/ds-data

2.3.4 验证项目配额

quota -vP ftpUser01

2.3.5 查看配额

quota -s -P ftpUser01
repquota -P /data/

2.4 设置用户配额

2.4.1 根据用户名称设置配额

edquota -u will

以下命令定义用户“will”的配额,可见如下显示,

Disk quotas for user will (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/ds-data             816    1030000    1031711        102  1030000  1031711

以上配置解析如下,
– 列“Filesystem”声明启用配额的文件系统名称
– 列“blocks”声明当前用户使用的块数目
– 列“soft”声明该用户的blocks软限制(“0”则无限制)
– 列“hard”声明该用户的blocks硬限制(“0”则无限制)
– 列“inodes”声明当前用户使用的块数目
– 列“soft”声明该用户的inodes软限制(“0”则无限制)
– 列“hard”声明该用户的inodes硬限制(“0”则无限制)
另外,快捷的设置方法范例如下,

setquota -u will 1030000 1031711 1030000 1031711 /dev/mapper/ds-data

另外,如果需要查询当前分区的Inode数量,请使用如下命令,

df -i

可见如下显示,

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
#...
/dev/mapper/ds-data  2621440      13 2621427    1% /data

另外,如果需要查询当前分区的block数量,请使用如下命令,

df -a

可见如下显示,

Filesystem           1K-blocks      Used Available Use% Mounted on
#...
/dev/mapper/ds-data   20634236    176220  19409852   1% /data

另外,如果需要查询当前分区的大小,请使用如下命令,

df -h

可见如下显示,

Filesystem            Size  Used Avail Use% Mounted on
#...
/dev/mapper/ds-data    20G  173M   19G   1% /data

所以,根据以上命令的结果,大概1G的block数量是“20634236block/20G=1031711.8block”

2.4.2 查询用户配额

quota -u will

可见如下显示,

Disk quotas for user will (uid 500):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/ds-data
                 354872  1030000 1031711           44166  1030000 1031711

2.4.3 测试配额(仅供参考,请根据实际情况修改)

mkdir /data/will
cp /var/log/messages /data/will/
chown will:will -R /data/will

以上创建文件后,使用如下命令循环复制测试文件,

su - will
cd /data/will
for i in `seq -w 1 1000000`; do cp -rp messages copy-test-$i; done

另外,由于创建的文件比较多,可使用如下命令浏览和清除,

cd /data/will
find . -name \*copy-test-\* -exec ls -l {} \;
find . -name \*copy-test-\* -exec rm -f {} \;

2.5 设置用户组配额

2.5.1 根据组名称设置配额

edquota -g will

以下命令定义组“will”的配额,可见如下显示,

Disk quotas for group will (gid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/ds-data          769280   20630000   20634236      95732  2620000  2621440

以上配置解析如下,
– 列“Filesystem”声明启用配额的文件系统名称
– 列“blocks”声明当前组使用的块数目
– 列“soft”声明该组的blocks软限制(“0”则无限制)
– 列“hard”声明该组的blocks硬限制(“0”则无限制)
– 列“inodes”声明当前组使用的块数目
– 列“soft”声明该组的inodes软限制(“0”则无限制)
– 列“hard”声明该组的inodes硬限制(“0”则无限制)
另外,快捷的设置方法范例如下,

setquota -g will 20630000 20634236 2620000 2621440 /dev/mapper/ds-data

2.5.2 查询组配额

quota -g will

可见如下显示,

Disk quotas for group will (gid 500):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/ds-data
                 827200  20630000 20634236          102947  2620000 2621440

参阅文档
=======================
https://en.wikipedia.org/wiki/Disk_quota

没有评论

发表回复

Linux基础
如何熟悉Linux的PAM模块

1 PAM的简介 1.1 PAM的概念 – PAM即Pluggable Authenti …

Linux基础
如何配置RHEL 8.x OpenSSH客户端登录自动过期?

1 前言 一个问题,一篇文章,一出故事。 基于服务器安全,笔者需要让OpenSSH客户端在10分钟内 …

Linux基础
如何安装部署SentinelOne EDR?

1 基础知识 1.1 软件公司介绍 SentinelOne,Inc.是一家在纽约证券交易所上市的美国 …