最可靠、原生支持的方式是xfs文件系统的project quota;它专为目录级配额设计,需挂载时启用prjquota、注册project id、初始化并设置bhard限制,三者缺一不可。

Linux 中限制某个目录的大小,最可靠、原生支持的方式是使用 XFS 文件系统的 project quota(项目配额)。它专为“按目录设限”而设计,比挂载 loop 设备或用 cgroup 等间接方法更轻量、稳定且内核级生效。
为什么选 XFS + project quota?
- ext4 不支持对单个目录设配额,只能按用户/组或整个挂载点限制;
- XFS 的
prjquota模式允许你把任意子目录绑定为一个“project”,然后独立限制其磁盘用量; - 无需额外分区或镜像文件,直接复用现有存储,运维成本低;
- 限制精确到字节级,硬限制触发后写入立即失败(如
No space left on device),行为可预测。
关键步骤:四步完成目录配额
-
确保目标目录所在文件系统是 XFS,且挂载时启用了
prjquota# 查看挂载选项(必须含 prjquota) mount | grep "$(df /var/lib/docker | tail -1 | awk '{print $1}')" # 输出示例:/dev/rbd0 on /var/lib/docker type xfs (rw,relatime,prjquota)若未启用,编辑
/etc/fstab,在对应行挂载参数中添加prjquota,再重挂载:# 示例 fstab 行(末尾加 prjquota) /dev/rbd0 /var/lib/docker xfs defaults,prjquota 0 0 sudo mount -o remount /var/lib/docker
-
为要限制的目录注册 project ID 并命名
创建两个配置文件(仅需一次):
echo "123:/var/lib/docker/cone" | sudo tee -a /etc/projects echo "cone:123" | sudo tee -a /etc/projid
注意:ID(如
123)不能为0;路径必须是绝对完整路径,且目录需已存在。 -
初始化 project 并设置大小限制
# 扫描并激活该 project sudo xfs_quota -x -c 'project -s cone' /var/lib/docker # 设置硬限制(例如 1GB),软限制可选(如 900MB) sudo xfs_quota -x -c 'limit -p bhard=1g bsoft=900m cone' /var/lib/docker
-p表示 project 模式;bhard是块(空间)硬限制,单位支持k/m/g/t。 -
验证与监控
# 查看所有 project 配额状态 sudo xfs_quota -x -c 'report -h -P' /var/lib/docker # 查看指定 project 详情 sudo xfs_quota -x -c 'report -h -P -p cone' /var/lib/docker # 查看 project 是否已注册 sudo xfs_quota -x -c 'print' /var/lib/docker
补充说明
- 配额只统计该目录下所有文件和子目录占用的空间(包括硬链接,不重复计),但不包含挂载点、符号链接目标;
- 新建文件时若超出
bhard,会返回Disk quota exceeded错误,应用层可据此做降级处理; - 修改限制只需再次执行
limit命令,无需重启服务; - 若目录被
mv或cp移动,project 关联不会自动继承——新位置需重新注册。
不复杂但容易忽略:project 配额依赖内核支持(现代发行版默认开启)、XFS 格式、以及挂载参数三者同时满足。只要这三点齐备,限制目录大小就是一条命令的事。











