系统是否支持并启用quota需分三步确认:先检查内核模块(lsmod | grep quota),再验证挂载选项(mount | grep device含usrquota或uquota),最后确认配额已开启(quotaon或xfs_quota -x -c 'state')。

怎么确认系统是否支持并启用了 quota
Linux 的磁盘配额不是默认开启的,得先看内核有没有编译进 quota 支持,再看文件系统挂载时有没有带上 usrquota 或 grpquota 选项。最直接的验证方式是运行:
mount | grep " $(df . | tail -1 | awk '{print $1}') ",如果输出里没看到 usrquota,那即使你配了用户限额也完全不生效。
常见错误现象:跑完 setquota 没报错,但 repquota -u username 显示全是 0;或者 quota username 提示 “No filesystem mounted with quota support”。这时候八成是挂载选项漏了。
- ext4/xfs 都支持 quota,但 xfs 用的是
uquota/gquota(不是 usrquota),且必须在 mkfs 阶段就启用(mkfs.xfs -q)或通过xfs_quota管理 - 修改
/etc/fstab后别忘了执行mount -o remount /home(把/home换成你的目标挂载点) - 某些云主机或容器环境(比如 LXC、Docker)可能禁用了 quota 内核模块,
lsmod | grep quota返回空就说明没加载
怎么给单个用户设置硬限制和软限制
软限制(soft limit)允许用户短暂超限(比如宽限期 7 天),硬限制(hard limit)是绝对不能突破的上限。真正起作用的是硬限制,软限制只影响警告和宽限期逻辑。
以 ext4 上的 /home 为例,操作顺序固定:先关机或卸载 → 创建配额数据库 → 开启配额 → 设置限额。跳过任何一步都会导致配置不生效。
- 用
quotacheck -cug /home初始化数据库(-c创建、-u用户、-g组),生成aquota.user和aquota.group - 用
quotaon /home启用(不是quotaon -a,后者依赖 fstab 标记,容易漏) - 用
setquota -u username 10240 12288 0 0 /home设置:第 3 位是软块限制(10MB),第 4 位是硬块限制(12MB),后两个 0 是 inode 软/硬限制(一般不设) - 宽限期用
edquota -t修改,单位是秒,7 days就写604800
为什么 xfs 用户配额总不生效
xfs 的 quota 机制和 ext 完全不同:它不依赖 aquota.user 文件,也不走 setquota,而是靠 xfs_quota 工具直接操作文件系统元数据。混用 ext 工具会白忙活。
典型错误:在 xfs 分区上照着 ext 教程跑 quotacheck,结果提示 “cannot open quotafile”,或者 quota -u username 始终显示 “no quota”。
- 确认 xfs 是否启用了 quota:
xfs_info /home | grep -i quota,输出含uquota才行 - 设置用户限额必须用:
xfs_quota -x -c 'limit -u bsoft=10g bhard=12g username' /home -
xfs_quota -x -c 'report -u' /home查看真实配额状态,quota命令对 xfs 无效 - xfs 不支持 per-inode 限制(即无法限制文件数量),这点和 ext 不同
配额生效后用户为啥还能写入
配额只限制“块使用量”,不阻止创建空文件、硬链接、或向已有文件追加内容(只要不触发新块分配)。更关键的是:配额检查发生在 write 系统调用返回前,但很多程序(如 rsync、cp)会先 truncate 再写,导致瞬间超限被忽略。
另一个常被忽视的点:配额统计有延迟。xfs 默认每 30 秒同步一次用量,ext4 的 quotacheck 也不是实时的。刚设完限额马上测试,很可能看到“还能写”的假象。
- 用
dd if=/dev/zero of=/home/username/testfile bs=1M count=15这种明确分配新块的方式测试,比 touch 或 echo 更可靠 - 检查是否真超限:
repquota -u /home看blocks列是否标红(表示超过硬限制) - 用户 home 目录若在独立分区,配额才有效;如果只是
/home/username是子目录,而整个/home挂载在根分区,那配额对它无效
配额的边界很窄——它只管块数和 inode 数,不管文件大小字段、不拦截 mmap 写入、也不约束 tmpfs 或 /dev/shm。想靠它防爆盘,得先确认路径真落在配额控制的挂载点上。









