ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux磁盘配额实战:XFS与Ext4的用户和目录限额配置指南

Linux磁盘配额实战:XFS与Ext4的用户和目录限额配置指南 最近在巡检一台多用户开发服务器的存储时发现/data分区直接满了 100%。顺手查了一下占用排行最大的一个普通用户的 home 目录吃了 1.2TB而这块盘总共才 1.5TB。更麻烦的是同一个物理卷上还跑着 Jenkins 的构建任务和数据库备份脚本盘一满整个 CI 链路全崩了。这种一颗老鼠屎坏一锅汤的场景就是 Disk Quota 存在的意义。在 Linux 系统里XFS 和 Ext4 是最常见的两种本地文件系统启用手配额的方式有相通之处也有各自的脾气。这篇文章按我实际操作的顺序把 XFS 和 Ext4 的配额启用过程、常用命令和踩坑点完整过一遍适合正在管理多用户服务器、共享存储目录或者打算给目录做容量上限的运维同学参考。1. 磁盘配额不是限速而是给每个用户的磁盘空间装上闸门1.1 配额解决什么问题很多人第一次接触 Disk Quota 时会把配额理解成限制某块盘的读写带宽其实完全不是一回事。磁盘配额限制的不是速度而是空间占用总量。类比一下小区停车场每个车位都有一个固定大小你停一辆车没问题但你要是把自己的车、老婆的车、亲戚的车全停进去物业就得管了。配额就是物业给每个住户画的最多能停几辆车的红线。实际运维中配额最典型的场景有三个多用户开发服务器几十个开发人员的 home 目录放在同一个物理分区上没人管的话随便一个同事的构建产物就能把盘塞满其他人全部遭殃连登录都费劲。共享上传目录 / NAS 挂载目录用户上传大文件或者程序跑出异常日志循环写盘导致共享目录空间耗尽。临时目录和备份目录/tmp、备份脚本的输出目录如果不设上限一次写满之后连系统日志都写不进去。这三类场景的共同点是你没法信任所有人都自觉这条假设。配额就是那个不用说话就能强制执行的空间管理员。1.2 软限制、硬限制与宽限期Linux 配额体系中每个配额维度用户、组、项目都可以设置两个数值软限制soft limit和硬限制hard limit单位默认是 KB但在 XFS 的xfs_quota里可以直接写 5m、5g 这种人类可读单位。这两者的区别我用一句话概括软限制是警告线硬限制是闸门。当用户占用量超过软限制但没有超过硬限制时系统仍然允许继续写入但会在用户每次登录或者执行quota命令时给出超过限额的警告。如果你设置了宽限期grace period那么超过软限制后还有一个倒计时比如 7 天。当用户占用量达到硬限制或者超过了软限制且在宽限期内没有清理系统就会直接拒绝写入返回 Disk quota exceeded 错误。宽限期只对软限制有效对硬限制来说没有商量余地。举个例子我给某个用户设置软限制 5GB、硬限制 6GB、宽限期 7 天。用户在写了 5GB 之后开始收到警告但他还是能继续写最多写到 6GB。如果在 7 天宽限期结束后仍然高于 5GB那么 6GB 这个硬限制才会真正生效此刻哪怕只写一个文件也会被拒绝。硬限制是绝对上限一般不会因为宽限期而改变。1.3 为什么选择 XFS 或 Ext4 作为配额落地方案很多云服务器默认文件系统就是 Ext4传统数据库服务器、NFS 服务端也大量用它而 XFS 在 RHEL/Rocky 等系统上被选为默认文件系统尤其适合大容量存储和大量小文件的并发写场景。配额这块两者各有各的玩法先看下表对比项Ext4XFS配额数据库独立配额文件aquota.user / aquota.group无独立文件配额信息由文件系统自身维护首次启用需要 quotacheck 扫描生成配额文件挂载选项加上后自动跟踪无需扫描用户/组配额挂载选项usrquota, grpquotauquota, gquota也兼容 usrquota/grpquota 写法项目配额挂载选项prjquota内核 4.5配置较繁琐pquota / prjquota原生支持管理命令quotaon / quotaoff / edquota / setquota / repquotaxfs_quota 一站式管理在线关闭quotaoff 即可xfs_quota -x -c off -u 或 remount我的建议是如果是管理老设备上的 Ext4 分区按传统方式走 quotacheck quotaon如果是新装生产服务器且明确要做目录级限额优先把该分区格式化成 XFS用项目配额一步到位。2. 动手前先把文件系统类型和挂载状态看清楚2.1 确认文件系统类型和当前挂载状态很多人上来直接改/etc/fstab结果 remount 报错根源就是搞错了文件系统类型。开始操作前至少用下面三条命令确认现状lsblk -f df -hT blkid /dev/sdb1lsblk -f能列出每个分区的文件系统类型和 UUIDdf -hT能看到当前挂载点用的文件系统以及已用空间blkid拿到分区的具体 UUID 和设备路径后面写 fstab 时要用。这里有个容易忽略的点如果分区已经挂载且当前使用量接近 100%启用配额后历史文件也会立刻被计入占用。比如某个用户已经用了 7GB你给他设置硬限制 6GB那配额一生效他马上写不进任何文件还会一脸懵。所以配额上限的设定要充分考虑存量占用别只看以后。2.2 修改 /etc/fstab 挂载选项的正确姿势无论 Ext4 还是 XFS最稳定的方式都是先把配额挂载选项写进/etc/fstab然后 remount。直接改 fstab 的好处是重启后配额不会消失对服务器这种常年不关机但最怕重启后配置丢失的场景来说这是基本要求。Ext4 的 fstab 写法UUID3d5a1234-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults,usrquota,grpquota 1 2XFS 的 fstab 写法UUIDab987654-xxxx-xxxx-xxxx-xxxxxxxxxxxx /srv/data xfs defaults,uquota,gquota 0 0注意两个细节Ext4 的 fstab 最后两列是 dump 和 fsck 检查顺序保持原来的值即可一般不因为加配额就改动。XFS 的 dump 和 fsck 字段固定写 0 0因为 XFS 不需要也不支持传统 fsck 顺序检查这个别照抄 Ext4 的写法。如果不希望用 UUID也可以写/dev/sdb1 /data ext4 defaults,usrquota,grpquota 1 2但生产环境建议优先 UUID避免内核识别盘符顺序变化后挂错设备。提示修改/etc/fstab之前先备份一份cp /etc/fstab /etc/fstab.bak.$(date %F)。改完后用mount -a做一次语法验证确认没有拼写错误再执行 remount。2.3 操作前的安全检查清单以下几件事我每次都会做省掉任何一步都可能演变成事故确认分区不是根分区/。在根分区上启用配额不是不行但一旦软限制或硬限制设置失误可能会影响系统本身写日志、写临时文件甚至导致服务起不来。第一次试验建议挑独立挂载点。确认当前空间余量充足。quotacheck 在 Ext4 上需要额外空间写配额文件虽然 aquota.user 通常只有几 KB但如果盘已 100% 满扫描过程可能出现异常XFS 无此问题但也要留操作余量。确认要限制的用户名单。配额是按 UID/GID 或项目 ID 计数的不是按目录计数的。你如果想要某个目录最多放多少那属于项目配额普通用户配额不适用。开通 SSH 带外管理。万一配额设置过于激进把用户锁死你需要能用 root 登进去改别把自己也挡在外面。3. Ext4 配额全流程quotacheck、quotaon 与 edquota 的组合拳3.1 修改挂载参数并重新挂载分区假设 Ext4 分区/dev/sdb1挂载在/data我已经把/etc/fstab改成了带usrquota,grpquota的配置。接下来执行mount -o remount /data然后确认配额选项是否真正生效mount | grep /data cat /proc/mounts | grep /data 如果/proc/mounts里能看到usrquota,grpquota说明挂载选项加载成功。这里有个坑有些发行版或容器环境里单纯执行mount -o remount /data时 fstab 中新增的选项不一定被重新解析保险做法是显式指定mount -o remount,usrquota,grpquota /dev/sdb1 /data如果分区当前正在被大量进程使用remount 不会中断读写这个不用担心。但如果你在/etc/fstab里的挂载选项跟之前的差异过大比如改动了 ro/rw、acl 等remount 有可能失败此时不要强行卸载重挂先回滚 fstab 再排查。3.2 初始化配额数据库quotacheck 的细节与误区Ext4 启用配额前需要扫描整个文件系统把所有已存在文件归属到各用户/组生成配额统计数据库。这一步是 Ext4 和 XFS 最明显的分水岭。首次启用执行quotacheck -cug /data参数含义-c创建全新的配额文件-u启用用户配额-g启用组配额。执行成功后/data目录下会出现aquota.user和aquota.group两个文件。这一步常见的问题有三个报错Cannot get quotafile name。原因通常是配额文件已经存在但文件系统没有正确加载配额选项或者配额文件是从别的机器拷贝过来的脏数据。解决办法先确认挂载选项没问题必要时删除/data/aquota.user和/data/aquota.group再重新创建。扫描速度极慢。如果分区上有几百万个小文件quotacheck 可能要跑十几分钟甚至更久。期间不要重启机器也不要手动 kill 进程等它自然结束。重复扫描时给配额加了新档案。第二次执行不需要-c了直接quotacheck -ug /data即可更新统计但如果配额文件损坏重新-c也没问题最多重新生成一遍数据库。扫描完成后正式启用配额quotaon /data quotaon -p /data # 查看配额是否处于开启状态quotaon -p如果显示user quota on /data is on和group quota on /data is on就说明配额已经进入工作状态。现代主流发行版在 fstab 配置好usrquota并重启后会自动执行 quotaon不需要额外写开机脚本但如果是精简版系统或容器环境建议自己确认一遍。3.3 用 edquota 和 setquota 下发配额策略开启配额后要给具体用户或者组设置上限。最直观的方式是edquota它会打开一个编辑器让你手动改edquota -u zhangsan编辑界面大概是这样的Disk quotas for user zhangsan (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sdb1 220 5120000 6144000 7 0 0文件里单位是 KBblocks表示当前已用块数soft和hard列分别对应软限制和硬限制。这里5120000KB 等于 5GB6144000KB 等于 6GB。改完保存退出即可。命令行批量下发更推荐setquota尤其适合脚本化操作setquota -u zhangsan 5120000 6144000 0 0 /data这里的四个数字依次是用户软限制KB、用户硬限制KB、inode 软限制、inode 硬限制。inode 限制一般不要轻易设因为那会限制文件数量很多程序会创建大量临时文件inode 设得太低会莫名报错我一般写 0 表示不限制。组配额方式完全一样setquota -g devteam 20480000 25600000 0 0 /data edquota -g devteam3.4 验证配额是否真正生效设置完配额一定要做一次超额写入测试别等到线上用户写不进去才发现问题。从普通用户身份写一个超出硬限制的文件su - zhangsan -c dd if/dev/zero of/data/zhangsan/test.img bs1M count7000如果配额生效dd 在写到接近 6GB 时会报错dd: error writing /data/zhangsan/test.img: Disk quota exceeded并且ls -lh看到文件大小稳定在硬限制附近。另外可以用quota命令从用户视角查看状态quota -u zhangsan输出里如果看到*标记说明当前已经超过软限制需要留意宽限期。4. XFS 配额全流程xfs_quota 的一站式管理4.1 挂载选项和 XFS 配额机制说明XFS 启用配额的方式比 Ext4 少了一个数据库初始化环节。因为 XFS 文件系统自身就维护每个用户、组的空间统计信息挂载选项加持后系统会实时跟踪文件占用不需要像 quotacheck 那样扫描整个盘生成外部文件。这在大容量存储场景里是一个很实际的优势——真正的挂上即用。先改/etc/fstabUUIDab987654-xxxx-xxxx-xxxx-xxxxxxxxxxxx /srv/data xfs defaults,uquota,gquota 0 0然后重新挂载mount -o remount /srv/data同样确认挂载选项生效cat /proc/mounts | grep /srv/data 如果没生效可以显式指定mount -o remount,uquota,gquota /srv/dataXFS 的挂载选项既支持uquota, gquota短写法也支持usrquota, grpquota长写法两者等价。项目配额对应的选项是prjquota可以单独使用也可以跟用户/组配额一起使用。4.2 xfs_quota 命令体系解析XFS 配额管理统一用xfs_quota命令。管理员操作必须加-x专家模式-c指定命令最后跟挂载点。下面是我常用的几个命令。查看配额报告xfs_quota -x -c report -h /srv/data-h让容量以人类可读的 GB/MB 显示。输出会分用户、组、项目几个维度显示used、soft、hard、grace。给指定用户设置配额xfs_quota -x -c limit -u bsoft5g bhard6g zhangsan /srv/data这个写法的好处是直接支持5g、600m这种单位不用自己做 KB 换算。bsoft是空间软限制bhard是空间硬限制对应的 inode 限制是isoft和ihard。设置组配额xfs_quota -x -c limit -g bsoft20g bhard25g devteam /srv/data设置宽限期xfs_quota -x -c timer -u -b 7days /srv/data查看单个用户当前占用xfs_quota -x -c quota -h -u zhangsan /srv/data禁用配额时可以使用xfs_quota -x -c off -u /srv/data不过这个命令只是关闭用户配额记账挂载选项还保留着重启后又会自动打开。如果想彻底移除配额还是改掉/etc/fstab里的选项后 remount 最干净。4.3 XFS 项目配额按目录限额的进阶玩法XFS 的项目配额是我最推荐的功能它解决的是不按用户、按目录限额的需求。比如/srv/data/web下要放多个网站的静态资源你希望整个 web 目录最多占用 20GB不管里面是哪个用户写的。项目配额配置分为三步。第一步在/etc/projects里给目录分配一个项目 IDecho 200:/srv/data/web /etc/projects第二步在/etc/projid里给项目 ID 起一个名字echo web:200 /etc/projid第三步初始化项目目录xfs_quota -x -c project -s web /srv/data执行后/srv/data/web目录会被打上项目 ID 200 的标记之后新建在里面的文件和子目录会自动继承这个项目 ID。然后设置项目配额xfs_quota -x -c limit -p bsoft18g bhard20g web /srv/data查看项目维度的报告xfs_quota -x -c report -p -h /srv/data项目配额最大的好处是天然支持多用户共享同一个目录预算某个项目目录下有 5 个人在写文件配额总量按项目算而不是按每个人算。这在多租户应用的服务器上非常实用。提示Ext4 在内核 4.5 之后也支持项目配额但我实际用过之后感觉配置门槛偏高同一块盘上有多个项目时更容易混所以如果明确要做目录级配额我会直接把分区做成 XFS省事也少踩坑。5. 配额启用后的日常巡检与动态调整5.1 定时巡检repquota 与 xfs_quota report 的监控脚本配额不是设置完就能撒手不管的。用户数量多了总有人会冲到软限制附近你不主动巡检最后一定会有人在周五晚上把盘写满。Ext4 查看所有用户配额使用情况repquota -a repquota -v /dataXFS 查看完整报告xfs_quota -x -c report -h /srv/data xfs_quota -x -c report -hu /srv/data # 只看用户 xfs_quota -x -c report -hg /srv/data # 只看组我习惯写一个简单的巡检脚本每天通过 cron 跑一次把超过软限制的用户发出来。脚本核心逻辑不复杂repquota -a | awk $4 ~ /[0-9]/ $4 0 {print $1, $2, $4}对于 XFS报告输出更适合用sort配合awk筛选。核心思想一样把used接近或超过soft的行挑出来交给告警渠道。5.2 配额满了之后用户会看到什么配额的强制效果在普通用户视角里非常直观执行写入命令shell 返回Disk quota exceeded。但对程序来说这可能表现为很隐蔽的失败——比如数据库写入事务中断、日志服务停止写入但不退出、文件上传接口报 500。所以配额的硬限制设置不能拍脑袋。如果用户跑的是一个真实业务建议先观察一周使用曲线再定软硬限制软限制可以定在预期正常使用量的 120%硬限制定在软限制的 120%这样既留缓冲又不会让业务突然哑火。5.3 关闭配额的完整过程有时候业务调整不需要配额了或者要格式化分区重新规划这时关闭配额也要干净利落。Ext4 关闭配额quotaoff /data然后删掉配额文件rm -f /data/aquota.user /data/aquota.group最后把/etc/fstab里的usrquota,grpquota字段去掉mount -o remount /data即可。XFS 关闭配额xfs_quota -x -c off -u /srv/data xfs_quota -x -c off -g /srv/data再把 fstab 的uquota,gquota,prjquota去掉mount -o remount /srv/data。相比 Ext4XFS 没有独立配额文件可删重置配额统计直接xfs_quota -x -c limit -u bsoft0 bhard0 zhangsan /srv/data就行。6. 生产环境踩坑总结几个真正值钱的细节6.1 Ext4 的 quotacheck 在已满分区上的表现我在一台老服务器上遇到过这样的问题分区使用率 100%有告警说要启用配额给用户限流。当时执行quotacheck -cug /data时直接卡住后来清理出少量空间再跑就正常了。原因推测是 quotacheck 需要在文件系统内创建 quota 文件哪怕只有几 KB也需要文件系统有一定可用空间来分配 inode。面对已满分区更稳妥的顺序是先找出最大的临时文件或日志文件清理出空间 - 再跑 quotacheck - quotaon - setquota。如果你清理空间都无从下手可以先临时软限制里写入较大的值等系统腾出空间后再收紧。6.2 XFS 项目配额在容器场景的用法现在很多团队在宿主机上用 XFS 给容器数据目录做隔离。比如 Docker 和 Podman 的数据根目录、Kubernetes 的 PV 本地目录都建议放在独立 XFS 分区上。用项目配额给每个项目目录一个 ID配合xfs_quota limit -p限制整个项目总占用比逐个容器设置镜像层大小更直接也能防止某个容器的日志文件把宿主机系统盘写满。提一句容易混淆的点如果你是从 NAS 或者 NFS 挂载过来的目录配额能不能用取决于 NFS 服务端的导出选项以及客户端挂载的版本。NFS 本身有quota相关的 RPC 协议但很多环境根本不生效最可靠的做法还是在文件所在的服务器本地分区上做配额而不是在挂载端模拟。6.3 一句话选型建议最后总结一下我的选型习惯方便你直接照抄已有 Ext4 分区要快速限制用户/组空间 - 用usrquota,grpquota quotacheck edquota不要为了配额特地去格式化。新分区明确有多用户共享目录、目录级限额需求 - 用 XFS prjquota一步到位。系统盘或根分区 - 不建议启用配额除非你很清楚自己在做什么。系统进程和日志写盘最怕被锁死。高可用集群里的共享存储 - 优先考虑存储端的配额机制单纯依赖客户端本地文件系统配额经常会因为挂载方式不同而失效。配额这功能配置过程本身不难难的是把软限制、硬限制、宽限期和用户真实使用模型匹配起来。我个人的体会是第一次做配额宁可设置得宽松一些观察用户触线频率再逐步收紧。一上来就把数值压得很低不仅用户怨声载道你自己也会被各种磁盘配额超限的工单淹没。先给数据再给规则配额才能真正成为帮助你管理存储的工具而不是给自己制造新的麻烦。
返回列表