
接手一台多用户服务器最先遇到的头疼问题十有八九是磁盘被某个人塞满。前阵子帮朋友整理一台开发测试机/home 分区 500G结果某位同事把打包好的日志、镜像一股脑往里丢三天不到就爆了其他账号开始报 No space left on device连排查都费劲。磁盘配额quota就是专门解决这类问题的机制给用户、组甚至某个目录设定使用上限超了就不准写或者警告后限时清理。这篇文章我不会堆理论而是按我在 ext4 和 XFS 两类文件系统上实际配过的流程把从挂载参数到限额设置、再到常见报错排查的完整路径讲清楚。适合刚接手 Linux 服务器维护的读者也适合配额配了但没生效、想看懂原理的运维同学。1. 先理解磁盘配额的核心概念软限制、硬限制和宽限期1.1 软限制与硬限制一张信用卡额度的两种含义配额机制里最基础的两个概念是软限制和硬限制很多人一开始被这两个词绕晕其实拿信用卡来类比就非常直观。软限制soft limit相当于信用卡的“建议额度”你刷到这条线之后银行不会立刻停卡而是发个通知告诉你“该收敛一点了”。在配额体系里用户可以继续写入但系统会开始记录宽限期grace period。如果用户在宽限期内没有把占用降回软限制以下系统就不再给面子了后续写入直接拒绝。硬限制hard limit就是“绝对上限”类似信用卡的固定额度到了这个数一分钱都刷不出去。对磁盘来说一旦硬限制被触碰正在写入的进程会收到“Disk quota exceeded”错误文件写入立即中断。这也是为什么硬限制一定要设置得比软限制更宽松一些给用户留出从“被警告”到“被拦截”之间的缓冲时间。我用数字举个例子给某个账号设置软限制 200MB、硬限制 250MB、宽限期 7 天。用户先把目录填到 200MB此时一切正常继续写到 200MB 以上之后进入宽限期倒计时7 天内如果没清理掉多余文件第 8 天开始系统强制拦截新写入直到他删掉文件回到 200MB 以下。这里有个容易被忽略的点软限制是“平均值意义上的控制线”它不等于立刻断网很多新手配完发现超过软限制居然还能写于是以为配额没生效其实只是宽限期还在倒计时。1.2 空间配额与 inode 配额不只是限制大小配额除了管“容量大小”还能管“文件数量”这就是块配额block quota和 inode 配额的区别。块配额限制的是磁盘块blocks数量单位通常按 1KB 计算日常说的“给用户 5GB 空间”就是改块配额。inode 配额限制的是索引节点数量简单理解就是文件加目录的总个数。为什么要单独限制文件数因为小文件撑爆磁盘的方式不是“占满空间”而是“耗尽 inode”。一台跑邮件服务的机器里某个用户收了上万封几十 KB 的小邮件空间可能才占几百 MB但 inode 已经被吃光了整个文件系统会出现“空间还剩很多但无法新建任何文件”的怪现象。所以给目录服务、邮件服务、对象存储类应用的用户设配额时记得把 inode 软硬限制一并设上一般设 5 万到 10 万就足够普通用户使用了。edquota 命令打开的编辑器里有两组列前面是 blocks 相关后面是 inodes 相关很多人只改前面后面的 0 一直留着。0 在配额里的含义是“不限制”如果希望限制用户创建海量小文件就把 inode 的 soft 和 hard 也填上。1.3 用户配额、组配额与项目配额怎么选配额的作用对象有三种用户user、组group和项目project。用户配额最常用直接按账号隔离适合多用户共用一台服务器、每个人都有自己家目录的场景。组配额适合按团队分配共享资源比如一个开发组 10 个人共用 /data/shared单独限制某个人没有意义因为大家都能往里写这时给这个组设一个总上限更合理。项目配额是近年用得越来越多的方式它的对象是“某个目录树”不管哪个用户写的只要落在这个目录里的文件都计入同一份额度。典型场景是临时项目目录、备份目录、客户隔离目录。日常选型我给个粗糙的判断标准家目录按用户配额共享目录按组配额面向目录树的隔离需求直接上项目配额。需要提前提醒的是ext4 虽然内核层面也支持项目配额但工具链和易用性都不如 XFS 顺手所以如果真的需要按目录树隔离我更推荐直接规划一个 XFS 分区后面有完整实操。三种配额不是互斥的可以同时启用用户配额和组配额甚至再叠加项目配额配额系统会分别计算并同时生效谁先撞线就拦谁。2. 动手前的准备工作确认文件系统、安装工具、改挂载参数2.1 先搞清楚目标分区是什么文件系统配额不是所有文件系统一把梭。我建议开工前先用三条命令把目标分区的底细摸清楚df -hT /home lsblk -f blkid /dev/sdb1df -hT 的 TYPE 列能直接看出文件系统类型lsblk -f 能看到设备、UUID 和挂载点blkid 则适合查某个具体设备的信息。为什么要先看因为 ext4 和 XFS 的配额操作完全不同ext4 需要 quotacheck 生成配额数据库文件XFS 直接用 xfs_quota 管理不需要独立的数据库文件。如果你拿到的是 btrfs 或其它文件系统思路又不一样。我曾见过有人在 XFS 分区上按 ext4 的流程执行 quotacheck结果命令直接报“Quota format not supported”这就是没分清文件系统类型导致的。提示配额作用于“挂载点”不是“设备”。修改配额前要确认这个挂载点是否真的对应你想限制的分区别在临时挂载的 USB 盘上折腾半天才发现找错了对象。2.2 安装 quota 工具集检查内核模块绝大多数最小化安装的 Linux 不会自带配额工具。安装方式按发行版选一种# Debian / Ubuntu apt update apt install quota # CentOS / RHEL / Rocky yum install quota # 新版系统也可以 dnf install quota装完之后顺手检查内核模块有没有加载lsmod | grep quotaquota_v1、quota_v2 是传统配额格式的内核模块vfsv1 是当前主流的 v2 格式。如果 lsmod 里没有可以手动加载一下modprobe quota_v1、modprobe quota_v2。大多数情况下安装 quota 包之后模块会自动带上但碰到定制内核或容器环境时手动加载这一步不能跳过。另外有些系统自带 quotaon 服务检查一下开机自启状态systemctl status quotaon.service systemctl enable quotaon.service这个服务的作用是在开机挂载文件系统后自动执行 quotaon避免每次重启后配额处于关闭状态。2.3 修改 /etc/fstab挂载参数加 usrquota、grpquota配额的核心开关在挂载参数里。以 ext4 为例用户配额对应 usrquota组配额对应 grpquota。编辑 /etc/fstab找到目标分区那一行在 defaults 后面追加/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2XFS 的写法不一样用的是 uquota 和 gquota/dev/sdc1 /data xfs defaults,uquota,gquota 0 2这里有两个经验必须说。第一改 fstab 之前先备份cp /etc/fstab /etc/fstab.bak。fstab 写错会导致重启后进不了系统尤其在生产服务器上这个备份是最后的救命稻草。第二挂载参数里千万不要手滑删掉 defaults 或原有的其它参数比如 noatime否则可能改变文件系统原有挂载行为。修改完可以先用mount -a测试一遍如果没有任何输出说明 fstab 语法基本没问题。3. ext4 文件系统完整开启配额从 quotacheck 到 edquota3.1 重新挂载分区并确认参数生效fstab 改完后不需要重启直接重新挂载即可mount -o remount /home如果分区比较忙remount 失败可以显式带上配额参数重试mount -o remount,usrquota,grpquota /home挂载成功后务必验证别急着做下一步mount | grep /home输出里应该能看到rw,relatime,quota,usrquota,grpquota之类的字样出现 quota 说明内核已识别配额特性。如果重新挂载后看不到 usrquota多半是 fstab 里没写对或者该文件系统内核模块没加载。这一步验证很重要因为后续所有 quotacheck 报错至少有一半根因都是挂载参数没生效。3.2 quotacheck 创建配额数据库传统 ext4 配额需要一个数据库文件记录每个用户、每个组的当前使用量这个文件由 quotacheck 生成。首次开启配额的分区必须先执行quotacheck -cug /home参数含义-c 表示创建配额文件-u 生成用户配额数据库 aquota.user-g 生成组配额数据库 aquota.group。生成的文件位于分区根目录默认是隐藏文件用ls -la /home应该能看到。生产环境更稳妥的写法是加 -m 参数quotacheck -cugm /home为什么要加 -mquotacheck 默认会尝试把文件系统以只读方式重新挂载以保证扫描时数据不被修改得到准确的使用量。但如果文件系统正处于繁忙状态这次只读重挂会失败整个命令直接报错。加了 -m 之后 quotacheck 不会强制重新挂载而是直接在线扫描代价是数据可能有一点不稳定但对运行中的服务器来说这个是“能把活干完”的妥协方案。注意如果之前已经配过配额分区根目录已经有 aquota.user 和 aquota.group再跑 quotacheck -c 会尝试重建。建议先确认这两个文件是否已被 quotaon 打开配额在运行中时重建文件很容易导致使用量统计错乱。3.3 quotaon 开启配额服务quotacheck 只是“建账”真正生效要靠 quotaon 打开quotaon -avug-a 表示扫描所有开启了配额挂载参数的分区-v 输出详细过程-u、-g 表示同时启用用户和组配额。执行后应该看到每个分区提示 quota turned on。也可以用单个挂载点精确开启quotaon /home quotaon -p /home # -p 查看状态quotaon -p 的输出会明确告诉你这个分区上 user quota 是 on 还是 off这是后面排查“配额不生效”时最趁手的检查命令。如果 quotaon 报错优先检查 aquota.user 文件是否存在以及格式是否正确。3.4 edquota 与 setquota 设置用户限额配额开启后开始给具体用户设额度。交互式修改用 edquotaedquota -u zhangsan命令会打开默认编辑器通常是 vi内容类似Disk quotas for user zhangsan (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sdb1 6480 204800 256000 179 0 0这里的 blocks 是用户当前已用空间单位是 1KB 块所以 204800 就是 200MB256000 就是 250MB。修改 soft 和 hard 两列的值保存退出即可。inodes 列同理soft/hard 填 0 表示不限制。不想进交互编辑器的话用 setquota 一行搞定setquota -u zhangsan 204800 256000 0 0 /home四个数字依次是块软限制、块硬限制、inode 软限制、inode 硬限制。setquota 的优势是脚本友好批量给几百个用户设配额时写个循环非常方便。组配额的操作方式一模一样edquota -g devgroup setquota -g devgroup 1048576 1310720 0 0 /home3.5 现场验证造一个大文件试一下配完不验证等于白配。用用户的身份真实写一次大文件su - zhangsan -c dd if/dev/zero of/home/zhangsan/test.img bs1M count300以刚才 250MB 硬限制为例dd 写到 250MB 左右会报Disk quota exceeded并留下一个残缺文件。注意这个失败的残缺文件也占用配额空间用户需要手动删除才能继续写入。看到报错说明硬限制生效了再检查一下当前用量quota -u zhangsan输出会显示当前占用、软限制、硬限制和宽限期剩余天数。全局看所有用户的使用情况用 repquotarepquota -a repquota -us /home # -s 以人类可读的大小显示4. XFS 文件系统配额实操xfs_quota 一条命令搞定4.1 挂载参数与 XFS 配额的几个特性XFS 是很多生产环境默认选择的文件系统它在配额管理上和 ext4 有个本质区别不需要 quotacheck 生成数据库也没有独立的 aquota 文件配额信息直接写在文件系统内部并由内核维护。这让整体流程清爽很多但也带来一个使用习惯上的变化配额管理统一走 xfs_quota 命令。XFS 的挂载参数有三种uquota用户配额、gquota组配额、pquota项目配额。注意 XFS 没有 usrquota 这种写法只认 uquota 和 gquota习惯 ext4 写法的人很容易在这里踩坑。# /etc/fstab 示例 /dev/sdc1 /data xfs defaults,uquota,gquota 0 2修改后同样 remountmount -o remount /data mount | grep /data4.2 给用户和组设置软硬限制XFS 配额的核心操作都通过 xfs_quota 的 -c 参数传子命令完成。给用户设限额xfs_quota -x -c limit -u bsoft200m bhard250m zhangsan /data-bsoft 和 bhard 分别对应软硬限制直接写人类可读的 m、g 单位不需要换算成 KB这点比 edquota 方便太多。组配额换成 -gxfs_quota -x -c limit -g bsoft1g bhard1.2g devgroup /data查看使用情况xfs_quota -x -c report -h /data # 所有用户 xfs_quota -x -c report -h -u zhangsan /dataXFS 对“已用空间”的统计非常及时不需要像 ext4 那样周期性地跑 quotacheck开箱即是实时数据。这也是我在新项目里更倾向选 XFS 的原因之一。XFS 调整宽限期的命令和 ext4 也很不一样xfs_quota -x -c timer -u -d 7 /data-d 7 表示用户配额的宽限期是 7 天。4.3 项目配额给一个目录树上锁XFS 的杀手锏是项目配额project quota可以直接对一个目录树设总上限不管文件是谁建的都算在这个项目的账上。启用前先确认挂载参数里有 pquotamount -o remount,pquota /data然后做三件事。第一注册项目 ID 和路径echo 100:/data/project_a /etc/projects echo project_a:100 /etc/projid/etc/projects 记录“项目 ID 与目录路径”的对应关系/etc/projid 记录“项目名与项目 ID”的对应关系两套文件配合使用。第二初始化项目目录xfs_quota -x -c project -s project_a /data这一步会把里 directory tree 递归打上项目 ID 标记相当于给这个目录“认领”到一个项目名下。第三设配额xfs_quota -x -c limit -p bsoft50g bhard60g project_a /data xfs_quota -x -c report -p /data之后只要往 /data/project_a 里写文件无论哪个用户写的实际占用都计入 project_a 的 50G/60G 额度。这个能力在做客户隔离、项目隔离时太好用了比逐用户、逐组设配额都省心因为不需要预先知道谁会往目录里写东西。5. 常见问题与排查实录5.1 quotacheck 报错的几种典型情况“quotacheck: Cannot find quotafile for /home”是我被问到最多的报错。这个信息其实在告诉你当前挂载参数里没有启用配额。先跑mount | grep /home看有没有 usrquota没有的话回去改 fstab 再 remount。另一个高频报错是“quotacheck: Quota format is not supported”。这通常是文件系统本身不支持或者内核 quota 模块没加载。先modprobe quota_v2加载模块再重新执行。如果分区是 XFS直接放弃 quotacheck改用 xfs_quota。初次执行 quotacheck 还容易遇到“Cannot remount filesystem read-only”的报错原因是分区正在被频繁读写。生产环境不用纠结直接quotacheck -m在线扫描即可我实际用下来统计误差极小。5.2 配额明明开了却不生效配额开了、命令也没报错但用户照样超限写入这个问题我在不同机器上遇到过四种原因。第一种quotaon 没启动或重启后没自动启动。用quotaon -p /home确认开关状态再检查 quotaon.service 是否 enable。第二种用户当前已经超过了硬限制的“存量溢出”场景。配额限制的是后续写入用户超限后系统不会自动删除已有文件即使你把硬限制调低已存在的文件也不会消失。所以给存量用户设配额时不要让硬限制低于当前已用空间否则用户会莫名其妙“什么都写不进去”。第三种root 账号不受配额约束。root 写入不计入任何配额这是设计如此别在 root 身上测配额。第四种文件所有者与配额对象不匹配。组配额只统计“该组文件”的大小如果用户把自己的文件 chown 到其它组或者文件由 root 创建但放在用户家目录里面组配额就不会触发。检查配额不生效时先ls -l看清楚文件归属再下结论。5.3 宽限期怎么调、soft 超了却不拦宽限期是配额体系里最容易让人困惑的部分。前面说过soft 超限后用户还能写是因为宽限期还“没到期”。查看当前宽限期设置edquota -t这个命令打开的界面里可以分别调整用户和组的宽限天数默认通常是 7 天。想改成 3 天就把天数改成 3 保存即可。宽限期从“第一次超过 soft 的那一刻”开始倒计时之后用户只要把用量降回 soft 以下计时器会重置。如果希望超了 soft 立即拦截可以把宽限期设为 0。这种情况下 soft 和 hard 的区别就消失了实际体验等同于直接设了 hard。反过来如果你根本不想警告只想给一个绝对上限可以把 soft 和 hard 设成同一个值。5.4 配额的日常监控与自动化配额配好不等于一劳永逸。我个人的习惯是把 repquota 做成定时任务每天出一份报告repquota -a /var/log/quota-$(date %F).log再配合 warnquota 给超限用户发提醒邮件。warnquota 的配置文件在 /etc/warnquota.conf里面有邮件主题、发件人、提醒阈值等字段按需改一下再配合 crontab 每天跑一次即可。对 XFS 分区监控命令换成xfs_quota -x -c report -h /data在实际运维中我更推荐关注“距离 hard 还剩多少”而不是“当前用了多少”。用脚本把 repquota 输出处理一下凡是使用量超过 hard 的 80% 的用户单独列出来提前一周介入就能避免临时求人删数据的尴尬。6. 我的一点运维体会配额这件事工具和命令都简单真正难的是规划。我踩过最大的坑就是把 soft 和 hard 设得太接近。比如某次给一个备份账号设 soft 190G、hard 200G用户平时跑到 195G 左右宽限期一到就被 200G 卡死连删临时文件的余量都没有最后还是我去清理。现在我的习惯是 soft 控制在 hard 的 70% 到 80%宽限期按业务紧急程度给普通用户 7 天临时任务目录 2 天。还有一个小细节配完配额之后不要立刻删掉 aquota.user 或者盲目重新 quotacheck否则可能导致统计归零用户瞬间变成“超限但系统没记录”的诡异状态。我一般在修改配额策略前会先quotaoff改完再quotaon顺序对了后面的麻烦能少一大半。如果你刚上手建议先拿一台测试机完整走一遍 ext4 流程再在 XFS 分区上对比一遍两种文件系统的手感差别很大。真正理解配额之后你会发现它不仅是“限制用户的工具”更是帮你把磁盘容量可视化、可控化的基础设施。配额数据本身也能反映业务变化比如某个项目目录突然暴涨往往意味着日志策略要调整了。