注意事项:确定好你的磁盘设备路径(/dev/sdx)。

xfs_quota

xfs_quota 参数:
	xfs_quota [系统] <文件系统>
	-x, --expert           以专家模式运行,允许执行所有命令。
	-c, --cmd=命令         执行指定的配额命令。
	-p, --print=命令       执行指定的打印命令。
	-d, --no-dquot         不显示配额信息。
	-l, --human-readable   以人类可读的格式显示数值。
	-v, --verbose          显示详细信息。
	-f, --foreground       在前台运行,不作为守护进程。
	-u, --user=用户名      指定要操作的用户。
	-g, --group=组名       指定要操作的组。
	-i, --interval=秒数    设置报告间隔时间。
	-t, --timeout=秒数     设置命令执行的超时时间。
	-n, --noheadings       不显示标题行。
	-j, --json             以 JSON 格式输出。
	-S, --state=文件       从指定文件加载配额状态。
	-V, --version          显示版本信息并退出。

  <文件系统>               指定要操作的 XFS 文件系统。

xfs_quota 示例:
   xfs_quota -x -c 'limit -u bsoft=100m bhard=200m user1' /mnt/xfs
   # 设置用户 user1 的磁盘空间软限制为 100MB,硬限制为 200MB。
   
   xfs_quota -x -c 'report' /mnt/xfs
   # 显示当前所有用户和组的配额状态。
   
   xfs_quota -x -c 'warn -u 90m user1' /mnt/xfs
   # 设置用户 user1 的磁盘空间使用警告阈值为 90MB。
   
   xfs_quota -x -c 'limit -g bsoft=500m bhard=1g group1' /mnt/xfs
   # 设置组 group1 的磁盘空间软限制为 500MB,硬限制为 1GB。
   
   xfs_quota -x -c 'off -u user1' /mnt/xfs
   # 关闭用户 user1 的磁盘空间配额限制。
   
   xfs_quota -x -c 'on -u user1' /mnt/xfs
   # 启用用户 user1 的磁盘空间配额限制。

注意:
   - 在执行 xfs_quota 命令之前,确保你有足够的权限,通常需要 root 权限。
   - 修改配额设置后,需要重新挂载文件系统才能生效。
   - 请谨慎使用配额设置,错误的配额可能会导致用户无法正常使用文件系统。

工作场景示例:例如我有两个用户一个user1用户一个user2用户,需要给 两个用户各分配8G的磁盘配额,而我现在有一块20G的磁盘该如何用xfs_quota做配额?

首先使用fdisk查看磁盘位置,这里我的是/dev/sda,大家以自己的磁盘位置为主

[root@nekohashizuku ~]# fdisk -l
Disk /dev/nvme0n1:30 GiB,32212254720 字节,62914560 个扇区
磁盘型号:VMware Virtual NVMe Disk
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x68f46797

设备           启动    起点     末尾     扇区 大小 Id 类型
/dev/nvme0n1p1 *       2048  2099199  2097152   1G 83 Linux
/dev/nvme0n1p2      2099200 62914559 60815360  29G 8e Linux LVM


Disk /dev/mapper/cs_bogon-root:26.98 GiB,28970057728 字节,56582144 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


Disk /dev/mapper/cs_bogon-swap:2.02 GiB,2164260864 字节,4227072 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3f39375f

使用fdisk创建磁盘分区(里面的内容我就不详细解读了详细步入Linux磁盘管理 | 喵喵的小窝 (maojiu.site)

 [root@nekohashizuku ~]# fdisk  /dev/sda

欢迎使用 fdisk (util-linux 2.37.4)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n
分区类型
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认  1):
第一个扇区 (2048-41943039, 默认 2048):
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +19G

创建了一个新分区 1,类型为“Linux”,大小为 19 GiB。
分区

命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。

[root@nekohashizuku ~]# fdisk -l /dev/sda
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3f39375f

设备       启动  起点     末尾     扇区 大小 Id 类型
/dev/sda1        2048 39847935 39845888  19G 83 Linux

使用mkfs命令对两个分区进行格式化(里面的内容我就不详细解读了详细步入Linux磁盘管理 | 喵喵的小窝 (maojiu.site)

[root@nekohashizuku ~]# mkfs -t xfs -f /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=524288 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=2097152, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

将usrquota和grpquota挂在参数写入/etc/fstab文件,这里我直接用echo命令写入了,不熟悉的也可以使用vim或nano编辑器写入。

[root@nekohashizuku ~]# echo "/dev/sda1 /user xfs defaults,uqota,gquota 0 0" >> /etc/fstab

使用systemctl daemon-reload这个命令重载fstab配置文件

[root@nekohashizuku ~]# systemctl daemon-reload

以支持磁盘配额的方式挂载磁盘,并且查看是否完成支持(查看是否存在usrquota,grpquota字样)

[root@nekohashizuku ~]# mount -o usrquota,grpquota /dev/sda1  /user
[root@nekohashizuku ~]# mount | grep /user
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=178500k,nr_inodes=44625,mode=700,uid=1000,gid=1000,inode64)
/dev/sda1 on /user type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota)

设置user1和user2用户的配额参数

[root@nekohashizuku ~]# xfs_quota -x -c 'limit -u bsoft=8G bhard=8G user1' /user
[root@nekohashizuku ~]# xfs_quota -x -c 'limit -u bsoft=8G bhard=8G user2' /user

切入user1用户进行测试配额是否生效

[root@nekohashizuku ~]# su user1
[user1@nekohashizuku root]$ cd /user
[user1@nekohashizuku user]$ touch test
[user1@nekohashizuku user]$ dd if=/dev/zero of=test bs=4M status=progress
7335837696字节(7.3 GB,6.8 GiB)已复制,4 s,1.8 GB/s
dd: 写入 'test' 出错: 超出磁盘限额
记录了2049+0 的读入
记录了2048+0 的写出
8589934592字节(8.6 GB,8.0 GiB)已复制,4.67902 s,1.8 GB/s

至此完成