xfs下限制单个目录大小必须用project配额,不能用user或group配额——因后者按uid/gid统计全挂载点用量,与路径无关;project配额基于inode的projectid属性强制检查路径归属,需启用prjquota、配置/etc/projects和/etc/projid、执行project -s扫描并设bhard硬限。

Linux 下限制单个文件夹最大容量,不能靠 <code>ulimit -f 或普通用户配额(-u)实现——前者只管进程能创建多大单个文件,后者按 UID 统计全挂载点用量,和路径无关。
必须用 XFS 的 project 配额,且挂载点需启用 prjquota
XFS 是目前唯一原生支持目录级容量硬隔离的主流文件系统。关键不是“能不能”,而是“怎么配才不白忙”:
-
prjquota必须加在/etc/fstab的挂载选项里,例如:/dev/sdb1 /data xfs defaults,prjquota 0 0;只改 fstab 不 remount,配置不生效 - 挂载后运行
mount | grep /data,输出中必须含prjquota字样,否则后续所有xfs_quota命令都会失败 - 同一个挂载点上,
usrquota、grpquota、prjquota互斥——开了prjquota就别混用-u或-g参数,内核会直接拒绝
/etc/projects 和 /etc/projid 缺一不可
project 配额靠内核扫描目录树打 projectid 标签来识别归属,不是靠路径字符串匹配。没这两份文件,xfs_quota 连“哪个目录属于哪个项目”都搞不清:
-
/etc/projects格式严格为ID:PATH,例如101:/data/app1;PATH必须是挂载点下的绝对路径,且该目录必须已存在 -
/etc/projid是可选但强烈推荐的别名映射,例如app1:101,让命令里能写app1而非数字101,避免手误 - 改完这两个文件后,必须运行
xfs_quota -x -c 'project -s app1' /data才会真正遍历/data/app1下所有 inode 并打上标签;跳过这步,已有文件不算配额,新文件才受限——这是最常被忽略的“看似没生效”原因
limit -p 立即生效,但 report 有延迟
执行 xfs_quota -x -c 'limit -p bhard=5g app1' /data 后,超出容量的 write() 系统调用会立刻返回 EDQUOT 错误(应用层表现为“磁盘空间不足”),但统计值不会实时刷新:
-
xfs_quota -c 'report -h' /data显示的用量可能滞后几秒到几十秒,这是 XFS 内核配额统计的异步刷新机制,不是配置失败 - 如需强制同步统计(仅用于排查或验证),运行
xfs_quota -x -c 'sync' /data;它不影响 enforcement,只刷缓存 - 注意:
bsoft(软限制)在 XFS project 配额中实际效果有限,因为无宽限期(grace period)概念,建议直接设bhard,避免混淆
真正难的不是命令怎么敲,而是理解 projectid 是内核在每次 write 时检查的 inode 属性,不是用户态路径规则——一旦目录树结构变动(比如 mv 移入文件),必须重新 project -s 扫描,否则新位置的文件不会被计入配额。











