Linux 磁盘配额实战:quota 用户与组配额的完整管理
多用户共用一台文件服务器或构建机时,总有人会把共享分区写满,拖垮所有人。事后清理只能救火,磁盘配额(quota)是把「每人最多用多少」变成系统级硬约束的事前手段:超过软限给警告和宽限期,超过硬限直接拒绝写入。本文把 ext4 与 xfs 两条技术路线的启用、设限、报表、排障一次讲清。环境以 Rocky Linux 9 为主,Ubuntu 差异主要在包名与默认文件系统,文中会注明。先说清适用口径:quota 是按文件系统、按用户/组统计的传统机制,适合多用户主机、教学与实验环境、老式文件服务器;单机个人使用没有必要折腾它。
前置条件
- 一个独立分区或逻辑卷用于实验(本文用 /data),不要直接拿系统根分区练手。
- 安装 quota 工具包:RHEL 系为 quota,Ubuntu 为 quota + quotatool(可选)。
- 两个测试用户(如 stu01、stu02)与一个测试组,用于验证用户配额与组配额的区别。
- root 权限与一次可控的重新挂载窗口(改挂载参数需要 remount 或重启)。
路线一:ext4 用户与组配额全流程
ext4 的配额靠挂载参数开启统计,配额数据库文件放在文件系统根目录。给 /data 加上 usrquota 与 grpquota 后重新挂载:
# /etc/fstab 中 /data 一行追加 usrquota,grpquota
# UUID=xxxx /data ext4 defaults,usrquota,grpquota 0 2
mount -o remount /data
# 生成配额数据库文件(首次启用时执行,会扫描全盘,盘大时安排窗口)
quotacheck -cug /data
ls -l /data/aquota.*
# 打开配额 enforcement
quotaon /data
quotaon -p /data
给用户设限用 edquota,它会调出编辑器修改四个核心数值(单位为 KiB,inode 数为个数):
edquota -u stu01
# Disk quotas for user stu01 (uid 1001):
# Filesystem blocks soft hard inodes soft hard
# /dev/sdb1 1024 900000 1000000 20 0 0
# 批量复制模板用户的配额给其他用户、查看报表
edquota -p stu01 stu02
repquota -a
软限、硬限与宽限期(grace)的语义必须分清:用量在软限以下随便用;超过软限进入宽限期(默认 7 天,用 edquota -t 调整),期间仍可写但会收到警告,宽限期结束还没降下来,软限按硬限执行;任何时候触及硬限立即拒绝写入,应用侧看到的就是 ENOSPC(No space left on device)——而 df 显示盘还有大把空间,这正是配额超限的典型症状。blocks 管容量、inodes 管文件个数,海量小文件场景后者比前者先爆,设限时两个维度都要给。
组配额的设法与用户配额对称,用 edquota -g 组名修改即可,但有个口径必须理解:组配额统计的是「组内所有成员写入的文件总和」,它约束的是集体而不是个人。典型用法是双层防护——给每个用户设个人硬限防单人失控,再给组设一个略低于分区容量的组硬限防集体写爆。还有一个常见误会要澄清:文件的归属按写入时的属主计算,用户把文件 chgrp 到别的组,占用就跟着转移到那个组名下,审计用量时要连同组归属一起看。另外,root 不受配额限制,用 root 身份跑的备份、同步任务写爆分区时配额是拦不住的,这类任务要靠分区隔离单独解决,不要指望 quota 兜底。
路线二:xfs 项目配额
xfs 的机制与 ext4 不同:用户/组配额不需要 quotacheck 建库,挂载时加 uquota/gquota 即生效;而 xfs 真正的特色是项目配额(project quota)——按目录树限额,这是 ext4 做不到的。挂载参数加 prjquota 后,用 xfs_quota 按目录管理:
# fstab: /data xfs defaults,uquota,prjquota 0 2,remount 后生效
# 给目录打项目号并初始化
echo '10:/data/project-a' >> /etc/projects
echo 'project-a:10' >> /etc/projid
xfs_quota -x -c 'project -s project-a' /data
# 设限与报表
xfs_quota -x -c 'limit -p bsoft=8g bhard=10g project-a' /data
xfs_quota -x -c 'report -pbh' /data
项目配额适合「按项目目录管总量」的场景:一个部门一个目录,限住总盘占用,用户维度则继续用组配额兜底。注意 project -s 要对目录执行一次初始化,子目录会继承项目号,新迁入的文件要在目录内产生才计入,用 mv 从别的文件系统挪进来的文件记得重新走一遍 project -s 校验。
验证
- quotaon -p 或 xfs_quota report 能看到配额处于开启状态、限额数值与预期一致。
- 用测试用户在 /data 里 dd 写出超过软限的文件:写入成功但 quota stu01 显示用量已过 soft、宽限期开始倒计时。
- 继续写到硬限:dd 返回 No space left on device,而 df -h 显示文件系统仍有剩余空间——两者对照成立即说明配额在真正拦截。
- 删除测试文件后用量回落,repquota 报表恢复正常。
常见问题
配额突然不生效了。先查挂载参数是否还在(findmnt 看 OPTIONS):很多人是临时 mount 命令加的参数,重启后 fstab 里没写、参数丢失,配额悄悄停摆。ext4 还要确认 aquota 文件没被删、quotaon 状态为 on。
quotacheck 报错或报表数字明显不对。配额数据库损坏或与实际用量脱节时,在文件系统卸载或只读状态下重跑 quotacheck -cug 重建;在线系统上强行 quotacheck 会得到不准的数,务必安排停写窗口。
用户用量统计比 du 看到的少。quota 按文件属主统计的是块占用,稀疏文件、被其他进程以 root 写入的文件都不记在这个用户名下;排查「谁在吃盘」时把 repquota 与按属主的 du 汇总交叉着看。
小结
放到今天看,配额的定位要摆正:云盘可以按需扩容、容器有自己的存储配额与镜像分层,很多新系统不再用传统 quota。但在多用户裸机、教学环境、遗留文件服务器这三类场景里,它仍是成本最低、行为最确定的限额手段。记住两条主线即可:ext4 靠挂载参数加 quotacheck 建库,xfs 的项目配额是按目录限额的独门能力;再叠加「软限预警、硬限拦截、宽限期倒计时」的语义,日常管理就不会出方向性错误。







