资讯动态

Linux磁盘配额实战:ext4与XFS下的软限制、硬限制配置与管理

发布时间:2026/10/22 8:40:20 来源:尧图企业网站定制
前阵子我拿一台离线测试服务器练手折腾到一半系统突然开始疯狂报错所有写磁盘的操作全部失败。登录一看/home 分区可用空间已经是 0%。排查完才发现这台机器没有做任何磁盘配额管理所以一个失控进程就能把整个分区写爆。在那之后我把配额quota机制从“听过但没细研究”变成了生产环境的必备项。这篇文章我想把手上的完整思路梳理清楚磁盘配额到底解决什么问题、软限制和硬限制怎么理解、ext4 和 XFS 两套操作方式有什么区别、多人环境下怎么批量配置和监控以及我在实际使用中踩过的那些坑。如果你维护的是多用户服务器、公共文件存储、CI 构建机或者各种共享开发环境这篇文章应该能直接拿去落地。1. 一次写满磁盘的复盘配额到底是解决什么问题的1.1 事故现象所有写入瞬间失败那台服务器原本跑得挺正常直到某天我在上面做文件同步实验突然发现 rsync 报 “No space left on device”。一开始我以为是磁盘真的满了df 一看/home 确实 100% 占满。可奇怪的是系统盘 / 还有不少空间。问题出在 /home 这个独立分区上。这时候最麻烦的事情出现了因为 /home 被写满所有需要生成临时文件的程序都开始报错连我登录后想创建个排查用的脚本都写不进去。整个分区变成一个“只读”状态——不是权限只读而是物理上没有任何空闲块。找到元凶之后我更是哭笑不得是一个测试账号下跑崩的模拟任务日志文件没做轮转一个进程写了 40 多 GB 的 log直接把分区灌满了。1.2 排查链路从“磁盘满”到“谁写满了磁盘”当时排查的思路其实不难但每一步都耗时先用df -h确认是哪个挂载点满了再用du -sh /home/*逐个目录统计找到占用最大的目录然后进目录里用du -sh * | sort -rh定位到大文件最后找到对应进程kill 掉清理文件系统才恢复正常。这个过程看起来简单但如果生产环境里有几百个用户、几十个服务靠 du 一个个翻是很痛苦的。更重要的是清理完之后问题还会复发——只要没有限制机制任何用户随时都可能把磁盘再次写满。那次事故之后我做的第一件事就是把磁盘配额打开。1.3 为什么不能靠“手动清理”过日子有人说那我可以写个巡检脚本每天扫描超过阈值的目录然后报警。这种思路不是不行但它是事后补救脚本扫描时磁盘可能已经满了服务已经挂了。配额机制的优势在于它是 Linux 内核层的限制用户写入时系统直接拦截不需要额外的守护进程也不会出现“先破坏再发现”的时间差。配额能管两件事限制用户可以占用的磁盘空间比如每个人最多 10GB限制用户可以创建的文件数量比如每个人最多 5 万个文件。它适合的场景非常明确多用户共享一台机器的盘、FTP/文件服务、邮件服务器、CI 构建节点、挂载了公共存储的测试环境。而对于单用户个人电脑配额的意义不大反而添麻烦。另外要明确一个边界配额管不了 CPU、内存这些资源那是 cgroup 和 systemd 管理的领域。配额只管“这块盘上谁能写多少”。2. 配额机制拆解软限制、硬限制、宽限期以及两层记账维度2.1 用户配额与组配额限制对象不同先理清两个基本概念用户配额和组配额。用户配额是对单个 Linux 用户生效的限制最常见的用法。比如给testuser配置 5GB 上限那么无论他写什么都受这个限制。组配额则是对一个用户组整体的限制适合团队协作场景——比如一个项目组的几个人共享 20GB 空间不管组里谁写总量不能超过。两者可以同时启用也可以只启用其中一个。我在实际使用中的习惯是优先做用户配额因为用户配额语义最简单用户之间互不影响。组配额适合那种“一个组共用目录”的场景但如果组内成员很多又需要细分个人空间靠组配额就不够灵活了还得叠加用户配额。2.2 软限制、硬限制与宽限期阶梯式管控配额不是简单设一个“最多用多少”就完了内核把它拆成了三个概念软限制soft limit用户可以超过这个值但不能长期超过硬限制hard limit绝对上限超过就不让写宽限期grace period用户超过软限制后内核开始倒计时默认是 7 天。整个流程可以这样理解使用量小于软限制时一切正常超过软限制但没到硬限制时系统允许继续写但宽限期开始计时如果宽限期到了还没把使用量降回软限制以下内核就开始拒绝新增写入如果超过了硬限制那不用等宽限期直接拒绝。这个设计其实很像生活中的“缓冲期”给用户一个临时超限的处理窗口避免硬性一刀切导致业务中断。我个人的建议是软限制设成正常使用量的 1.2 倍左右硬限制再留 20%-30% 的余量给用户充分的周转空间。2.3 块配额与 inode 配额空间和数量的双重约束配额还有两个维度块配额和 inode 配额。块配额限制的是磁盘空间大小内核按数据块记账配额工具里看到的blocks字段单位通常是 1KBinode 配额限制的是文件数量每一个文件或目录都会占用一个 inode所以它管的是“你能创建多少文件”。为什么不只管空间因为很多服务被“写满”不一定是因为空间大而是文件数量爆炸。典型例子是邮件服务器如果有用户无限创建小文件每个文件哪怕只有 1KB几百万个文件也能把 inode 表耗尽导致整个分区无法再创建任何新文件即使空间还有几十 GB。所以我在给文件服务类服务器做配额时两个维度都会设置。2.4 底层记账配额数据库与文件系统元数据传统 ext4 系列的记账方式是内核在写入时检查当前用户或组的用量把结果记录到配额数据库文件中通常位于挂载点根目录文件名是aquota.user和aquota.group。这些文件本质上是索引化的用量记录表quotacheck用来扫描文件系统并重建它们quotaon则是告诉内核“从现在开始启用配额限制”。而 XFS 文件系统的实现方式不一样。XFS 把配额信息直接写进文件系统的元数据中不需要外部数据库文件所以它的命令体系也完全不同后面我会专门讲。理解这个差别很重要很多人拿着 ext4 的流程去操作 XFS结果一无所获。2.5 ext4 与 XFS 的配额实现差异先有个概念现代主流发行版里XFS 的使用率越来越高xfs_quota 和传统 quota 工具是两套完全不同的操作体系。我建议你在动任何分区之前先确认文件系统类型不然很容易在错误的命令上浪费大量时间。下表是我整理的核心差异对比项ext4XFS启用选项usrquota, grpquotausrquota, grpquota, prjquota用量数据库aquota.user / aquota.group元数据内嵌无独立文件初始化操作quotacheck不需要启用命令quotaonxfs_quota -x -c enable -u主要管理命令edquota / setquotaxfs_quota是否支持项目配额不原生支持支持prjquota 方式3. 开始前先确认环境文件系统、挂载选项与工具安装3.1 检查当前的挂载参数不管用哪套工具第一步都是确认目标分区的文件系统类型和当前挂载参数findmnt /home df -T /homefindmnt 的输出里会直接显示 FSTYPE 和 OPTIONS。比如ext4或者xfs挂载选项里有没有usrquota、grpquota。第一次检查时多半是没有的不用慌接下来我们去加。为什么要确认文件系统类型因为后面是否启用 XFS 的 prjquota、是否运行 quotacheck都取决于这一步。我踩过的最典型的坑就是在 XFS 分区上跑了传统 quotacheck结果工具直接报“无法处理该文件系统”白白折腾了半天才发现系统默认根分区就是 XFS。3.2 修改 fstab 并重新挂载配额要生效必须让文件系统在挂载时带上配额选项。最稳妥的方式是修改/etc/fstabUUIDxxxx-xxxx-xxxx /home ext4 defaults,usrquota,grpquota 1 2注意几点如果还要限制组就加grpquota不然加usrquota就够根分区/也可以启用配额fstab 对应行加上即可改完先执行mount -a或者mount -o remount /home让配置生效但fstab 一定要改好否则下次重启就恢复到无配额状态。改完之后再执行一次findmnt /home看到 OPTIONS 里已经有usrquota就说明挂载参数生效了。此时先别急着操作接下来装工具。3.3 安装 quota 工具集Debian/Ubuntu 系sudo apt update sudo apt install quotaRHEL/CentOS/Fedora 系sudo dnf install quota装完后可以用quota --version验证。这个包通常还带quotacheck、edquota、setquota、repquota、warnquota等配套命令。如果是 XFS包里面同样带了xfs_quota不需要额外装别的东西。3.4 确认内核配额模块现代发行版的内核默认都编译了配额支持一般情况下不需要额外加载模块。不过我习惯性检查一下因为个别精简内核可能没有grep CONFIG_QUOTA /boot/config-$(uname -r)如果输出里有CONFIG_QUOTAy或者CONFIG_QUOTAm就说明内核支持配额。万一没找到可以考虑换内核或确认当前内核是否适合生产用途这属于比较极端的情况。4. ext4 文件系统启用配额完整命令链路与验证4.1 初始化配额数据库quotacheck确认挂载选项已经包含usrquota后对 ext4 系文件系统第一步是生成配额数据库sudo quotacheck -avugm /home参数拆开解释-a扫描所有启用了配额的文件系统-u检查用户配额-g检查组配额-v输出详细信息-m即使文件系统以读写方式挂载也强制重建配额文件。这里-m很关键。默认情况下 quotacheck 会建议你把文件系统以只读方式挂载再扫描但在生产环境里你不太可能为了扫一遍配额就去卸载分区。-m就是跳过这个限制直接扫描。扫描完成后到挂载点下面确认一下ls -la /home | grep aquota如果看到aquota.user和aquota.group说明数据库已经生成。这两个文件是隐藏性质的普通文件对应系统的配额记账底表。4.2 编辑配额限制edquota 与 setquota接下来给用户设置配额值最直观的工具是edquotasudo edquota -u testuser命令会打开一个文本编辑器内容类似Filesystem blocks soft hard inodes soft hard /dev/sda1 1204 20480 24576 10 0 0需要修改的是soft和hard列。注意这里的 blocks 单位是 1KB所以如果我想给 testuser 设 2GB 软限制、2.5GB 硬限制那么 soft 写2097152hard 写2621440。inodes 列则设置文件数量上限。如果你不喜欢在编辑器里改也可以用setquota一行搞定sudo setquota -u testuser 2G 2.5G 10000 15000 /home参数顺序是用户、软块、硬块、软 inode、硬 inode、挂载点。setquota支持K、M、G这样的单位后缀写起来非常方便。这个命令最大的价值在于批量脚本化后面会专门讲。4.3 启用配额并查看结果quotaon 与 quota数据库建好、限制设好之后启用配额sudo quotaon -avug-a表示启用所有支持配额文件系统上的配额-u用户-g组。如果你只想启用某个挂载点也可以明确指定sudo quotaon /home启用后用quota命令查看具体用户的用量quota -s testuser-s表示 human-readable 输出会直接显示成2.0G这样的形式不用自己换算 KB。如果显示Disk quotas for user testuser (uid 1003)下面列出了当前用量和限制值就说明配额已经在管这个用户了。4.4 用 dd 写满测试验证硬限制是否真的硬配额配完之后一定要实测不能看了配置就认为万事大吉。我的验证方式很简单创建一个测试用户设软限制 200M、硬限制 300M然后用 dd 向他的目录写入sudo dd if/dev/zero of/home/testuser/testfile bs1M count100这步会正常完成因为 100M 低于软限制。继续写sudo dd if/dev/zero of/home/testuser/testfile2 bs1M count200如果配额生效这条命令应该在写满硬限制时中断并出现Disk quota exceeded的提示。如果它一路写完了那说明配额没生效需要按后面的排查链路重新检查。还有一种情况写入大小卡在软限制和硬限制之间比如继续写 50M内核会允许写入但这会触发宽限期计时。我在测试时会专门写一个超过软限制但不到硬限制的文件来验证宽限期状态确保后续用户超限时系统能做出正确响应。4.5 查看全盘配额报表repquota当用户多了以后一个个看 quota 效率太低。用repquota可以输出整个文件系统的配额汇总表sudo repquota -s /home它会列出所有用户的当前用量、软限制、硬限制、剩余宽限期等。这个命令是日常巡检的主力。我一般配合 cron 定期把它输出到日志目录方便回溯。4.6 宽限期调整edquota -t默认宽限期是 7 天如果你的业务场景不允许用户超限几天也可以调短sudo edquota -t -u /home同样会打开编辑器把grace period改短比如 1 天。组配额的宽限期用-g调整。注意宽限期是针对“超过软限制”的状态计时的用户一降回软限制以下计时就会重置。5. XFS 文件系统走进 xfs_quota 的世界5.1 XFS 配额与传统工具有何不同XFS 在现代发行版里非常常见很多系统的根分区默认就是 XFS。XFS 与传统 ext4 配额的最大区别是配额信息随文件系统元数据管理不需要单独的 aquota 文件也不需要 quotacheck。你如果在 XFS 分区上跑quotacheck要么报错要么什么都扫不出来。XFS 挂载选项同样是在 fstab 中加usrquota和grpquota也可以加上prjquota来支持项目配额。修改挂载方式跟 ext4 差不多但后续管理命令完全不同要靠xfs_quota。5.2 xfs_quota 核心命令limit / report / disable设置用户配额sudo xfs_quota -x -c limit -u bsoft2g bhard2.5g testuser /home这里的-x是进入专家模式-c后面跟具体命令。limit -u表示限制用户bsoft和bhard分别指软、硬块限制。如果还要限制 inode 数sudo xfs_quota -x -c limit -u isoft10000 ihard15000 testuser /home查看用量报表sudo xfs_quota -x -c report -u /home临时停用/重新启用配额sudo xfs_quota -x -c disable -u /home sudo xfs_quota -x -c enable -u /home注意不要在业务高峰随便 disable一旦禁用用户超限写入就不会被拦截空间很快会被填满。5.3 项目配额针对目录树而不是用户的管控XFS 还有一个 ext4 没有的能力项目配额prjquota。它允许你给某个目录树设定独立上限而不是按用户或组。比如/srv/data/project1这个目录最多给 20GB不管谁往里写。大致流程是先给目录分配项目 ID再通过 xfs_quota 设置项目配额sudo xfs_quota -x -c project -s project1 /srv/data sudo xfs_quota -x -c limit -p bsoft18g bhard20g project1 /srv/data这属于进阶用法适合共享目录、多租户业务目录这类场景。项目配额需要挂载时带prjquota选项并且给目录设置项目标签理解起来比用户配额稍复杂但确实很实用。5.4 与 ext4 配额的对照我用一个简单的对照总结两套操作的核心差异操作ext4XFS生成/重建配额数据quotacheck -avugm不需要设置用户限制edquota -u 或 setquotaxfs_quota -x -c limit -u ...查看用户用量quota -u testuserxfs_quota -x -c report -u查询全盘报表repquota /homexfs_quota -x -c report -u /home启用配额quotaon -avugxfs_quota -x -c enable -u /home写到这里必须多说一句不要凭记忆硬套命令。XFS 专家模式下命令语法非常灵活不同发行版的xfs_quota版本也有细微差别配置前先xfs_quota -x -c help看一眼当前版本支持的关键字。6. 多人环境下批量落地模板复制、脚本批量 setquota 与自动监控6.1 edquota -p 复制模板给一个用户配好配额后其他人员可以直接复制他的配置。最方便的方式是用edquota -psudo edquota -p testuser user1这会把 testuser 的配额模板原样复制给 user1。如果一批新人入职可以一次指定多个sudo edquota -p testuser user1 user2 user3这个命令省去了手工编辑的麻烦但它的局限在于所有被复制的人拿到的是完全一致的配额如果每人需求不同还需要再微调。6.2 setquota 配合循环脚本批量配置当你需要给一批人设置不同配额时setquota配合脚本是最灵活的。我常用的做法是准备一个用户列表文件每行格式是“用户名 软块 硬块 软inode 硬inode”然后用循环去设置while read user softB hardB softI hardI; do sudo setquota -u $user $softB $hardB $softI $hardI /home echo quota set for $user done /tmp/quota_list.txt注意这里的softB和hardB如果写5G、6G这样的带单位值setquota 是可以直接识别的。这个脚本还有个好处你可以在执行前加一个quotaoff再统一quotaon避免用户量大的时候某些配置还没来得及生效。6.3 自动配额报表生成方案配额配好只是开始日常监控才重要。我通常用 cron 每天生成一次磁盘配额报表sudo crontab -e加入一行0 1 * * * /usr/sbin/repquota -s /home /var/log/quota_report_$(date \%F).txt 21这样每天凌晨 1 点自动生成一份带日期的报表文件。想更省事的话还可以加个半分钟扫描逻辑用脚本判断某些用户的使用率是否超过 90%达到阈值就往管理邮箱发通知。这种告警脚本的粒度可以根据业务需要调整但有个原则是告警要早于硬限制别等用户已经写不进去了才通知。6.4 配额告警与人工介入的边界自动报表能告诉你“谁用了多少”但真正的清理动作往往还是需要人工介入。配额机制本身不会帮用户删除任何文件它只是在用户写入时给予拦截。所以我在团队里制定了简单规则用户被硬限制挡住后优先自己清理旧文件如果确定是临时需求管理员可以临时把硬限制调高一档几小时后还原。这个操作流程既保证了磁盘可控也避免了频繁向管理员求助。7. 实测踩坑记录配额不生效、宽限期失效等问题的排查链路7.1 配额未生效的排查步骤如果你设置了配额但测试发现用户照样可以写爆按这个顺序排查确认文件系统类型ext4 还是 XFS命令是否用对确认挂载选项findmnt看有没有usrquota/grpquota或prjquota确认配额数据库存在ext4 检查aquota.userXFS 不用管这步确认配额已启用XFS 用xfs_quota -x -c state -uext4 用quotaon -p确认用户 quota 值不是 0如果 soft 和 hard 都是 0表示没有限制实测写入而不是只盯着配置文件看。有一次我在某开发环境上折腾了半天最后发现是挂载选项只在命令行 remount 了fstab 没改。表面看配额已经在工作但设备一重启就全部失效。这种“看起来有效重启原形毕露”的坑比直接没生效更隐蔽。7.2 重启后配额失效的真相配额失效重启后的原因几乎都是同一个/etc/fstab里缺少配额挂载选项。mount -o remount,usrquota只对当前运行时有效重启后内核还是会按 fstab 里的参数重新挂载。正确做法就是改 fstab然后mount -a验证。另外部分老旧的系统脚本里会靠quotaon -avug的开机自启但新一点的 systemd 环境下quota 包本身就带了 quotaon.service。如果你发现开机后配额没有自动启用可以执行systemctl status quotaon如果服务不是 enabled 状态就启用它sudo systemctl enable --now quotaon7.3 XFS 上跑 quotacheck 的无效操作这个问题真的很常见。看到服务器 /home 是 XFS还习惯性执行quotacheck -avugm结果报错或者卡住。记住XFS 不需要、也不支持传统 quotacheck。它的配额数据靠挂载选项和 xfs_quota 管理。你只需要确认挂载选项里带了usrquota然后用xfs_quota -x -c state查看状态即可。7.4 配额数据库文件丢失与重建ext4 系列的 aquota 文件如果被人删了或者系统异常重启导致配额文件损坏quotaon会提示找不到配额文件。解决办法是重建sudo quotaoff -avug sudo rm -f /home/aquota.user /home/aquota.group sudo quotacheck -avugm sudo quotaon -avug注意顺序是先停用再删除最后重建。重建后所有用户的软硬限制配置是无的需要重新设置所以生产环境最好把配额模板用脚本保存下来比如在注释里写明每个用户的配额值。7.5 根分区启用配额的特殊性根分区/也可以启用配额但在操作时有几个细节需要注意根分区不能随便卸载所以 remount 要特别小心如果根分区是 ext4建议先确保系统有足够空间再执行quotacheck -m如果是 XFS确认内核和工具版本支持即可。另外root 用户的配额默认不受限制uid 0 绕过配额检查这是内核设计上的保护机制不用觉得奇怪。做根分区配额时我还遇到过一个问题根挂载点下的aquota.user文件在后续系统升级或日志写入中容易被改动导致配额状态异常。所以我现在的习惯是能不做根分区就尽量不做根分区只对/home、/srv、/data这样的数据分区做配额既满足管理需求又降低了系统层被误伤的风险。最后再分享一个小技巧在群组协作环境里我习惯把所有配额配置写成一份可执行的 shell 脚本放在管理员 home 目录下脚本里包含用户名列表和对应的 soft/hard 值。这样不管是新机器搬迁、还是磁盘扩容后重新初始化都能在几分钟内把配额策略完整还原而不是靠记忆一个个手敲。配额管理这东西配置一次不难难的是可重复、可维护。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑