拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Linux磁盘配额配置指南:Ext4与XFS完整实操

Linux磁盘配额配置指南:Ext4与XFS完整实操

写这篇文章的起因,是我上周帮一位客户处理“磁盘写满”的告警。客户这边一台文件服务器,/home所在的 ext4 分区被塞满了,排查下来是一个开发人员把编译产物、Docker 镜像导出包和几份数据库备份一股脑全丢进了自己的家目录。删数据不难,但问题在于:如果不加限制,这种问题会反复发生。解决办法就是 Linux 磁盘配额(Disk Quota)。

磁盘配额算是 Linux 系统管理里最经典的能力之一,但在实际运维中却经常被忽略。不少朋友知道有 quota 这个东西,真到用的时候才发现,XFS 和 Ext4 两种文件系统上的做法几乎完全不同,网上资料又各说各话,照着操作容易掉坑。这篇文章我会把 Ext4 和 XFS 的配额配置完整梳理一遍,从挂载参数、配额初始化、用户/组/项目配额设置到排查思路,全部给到可复制的命令和实操记录。适合正在做 Linux 运维、文件服务器管理,或者要给多用户机器统一做存储限额的朋友参考。

1. 配额机制的本质:XFS 和 Ext4 到底差在哪里

1.1 配额管的是什么:软限制、硬限制与宽限期

配额不是简单地“限一个数”,它实际包含三个维度的概念,理解清楚再动手,后面才不会一脸懵。

第一是磁盘容量限额,也就是 blocks 这一列,限制的是文件实际占用的磁盘块。第二是 inode 限额,限制的是文件数量。很多人只盯着容量,忘了 inode,结果用户写了几十万个 1KB 的小文件,容量没超,inode 却爆了,整个分区连新建目录都做不了。这个坑我踩过,后面排查思路里会再提。

第三是软限制(soft limit)、硬限制(hard limit)和宽限期(grace period)这套组合。软限制允许用户临时超过,但超过的那一刻就开始计算宽限期;硬限制是绝对上限,到了就拒绝写入。宽限期默认值是 7 天,可以自己调整。

用生活化的方式理解:软限制像是“警告线”,到了 10GB 系统会提醒你注意;硬限制像是“收费站杆”,到了 12GB 直接不放行。如果用户长时间停留在软限制之上,宽限期一到,哪怕还没到硬限制,也会被强制拒绝写入。所以设置配额时,软硬限制之间要留出合理的缓冲,不能把软限制设得太接近硬限制。

1.2 Ext4 与 XFS 配额实现方式对比

这两种文件系统都支持配额,但实现机制完全不同。Ext4 采用的是“配额文件 + 扫描数据库”的方式,配额数据保存在文件系统根目录下的aquota.user、aquota.group这两个隐藏文件里,需要先用quotacheck扫描构建数据库,再用quotaon激活。XFS 则完全不同,配额信息直接记录在文件系统自身的元数据里,没有配额文件,也不需要 quotacheck,挂载时带上配额选项就生效。

用表格说清楚:

对比项Ext4XFS
配额数据存储方式aquota.user / aquota.group 文件文件系统元数据,无额外文件
是否需要 quotacheck需要,用于构建配额数据库不需要,也没有这个机制
是否需要 quotaon需要不需要,挂载即生效
配额类型支持用户、组用户、组、项目(project)
常用挂载选项usrquota, grpquotauquota, gquota, pquota
主要管理工具edquota, setquota, repquotaxfs_quota

这里最关键的区别是 XFS 支持项目配额(project quota)。项目配额可以按“目录”为单位限制空间,而不是按用户或组。比如一台机器上给三个业务团队各划一个目录,每个团队限 50GB,这正是 XFS 项目配额的典型使用场景。Ext4 的项目配额支持相对较弱,实际运维中很少用,所以我后面会重点讲 XFS 的项目配额玩法。

提示:XFS 本身没有 quotacheck 和 quotaon 的概念。如果你在 XFS 文件系统上执行 quotacheck,会直接报错“Cannot find filesystem to check”。这不是故障,说明你把这套机制用错了文件系统,后面排查章节我会展开讲。

2. 动手前先做好三件事:环境确认与挂载参数

2.1 确认文件系统类型与现有挂载选项

我见过不少人上来就直接配配额,配了半天不生效,最后发现目标分区根本不是 ext4 或 XFS,而是网络盘或者被 LVM 包了一层。所以第一步一定是确认环境,别凭印象,用命令说话。

# 查看文件系统类型、使用率 df -hT # 查看挂载点对应的设备与挂载选项 findmnt /data mount | grep /data # 查看设备文件系统属性和 UUID blkid /dev/sdb1

findmnt和df -hT是我在排查时必用的两条命令,前者能直观看出挂载选项里有没有 usrquota 字样,后者能确认文件系统类型。比如输出里/data显示为xfs,那后面所有步骤都要走 XFS 路线;如果显示为ext4,就走传统配额文件路线。

这里还要多说一句:有些发行版默认开启了 systemd 的挂载管理。修改完/etc/fstab之后,最好执行systemctl daemon-reload刷新一下挂载单元,否则部分系统上 fstab 的变更不会立刻反映到实际挂载中。这个问题在旧资料里很少有人提,但现代 Linux 系统上很常见。

2.2 修改 /etc/fstab 的正确姿势与注意事项

修改挂载参数通常有两种方式:一是临时用mount -o remount直接加上配额选项,二是改/etc/fstab持久化配置。临时方式适合测试,持久化方式才是正式环境的正解。

以/data分区为例,ext4 的 fstab 配置修改前后对比:

# 修改前 /dev/sdb1 /data ext4 defaults 0 0 # 修改后:增加 usrquota 和 grpquota /dev/sdb1 /data ext4 defaults,usrquota,grpquota 0 0

XFS 则在 fstab 中增加对应选项即可:

/dev/sdb1 /data xfs defaults,uquota,gquota,pquota 0 0

改完 fstab 后,ext4 大多可以靠 remount 动态生效:

mount -o remount /data mount | grep /data

但这里有一个 XFS 和 Ext4 的显著差异,也是很多人踩过坑的地方:XFS 的配额选项无法通过 remount 动态加上,必须在文件系统初始挂载或者系统启动时生效。也就是说,改完 XFS 的 fstab 后,remount 大概率不会让配额选项生效,最稳妥的办法是计划一个维护窗口重启,或者先 umount 再 mount。如果/data上有正在运行的服务,不要为了省事直接 umount,文件系统被占用时 umount 会失败,强行处理可能损坏数据。

注意:修改 /etc/fstab 之前务必备份,最好先把当前内容复制一份。fstab 写错,轻则分区挂不上,重则系统无法启动。尤其是使用 UUID 的场景,设备名变了但 UUID 没变,反而更容易排查。

3. Ext4 文件系统启用配额完整实操

3.1 安装配额工具并确认内核支持

Ext4 配额管理依赖系统自带的 quota 工具集,里面包含quotacheck、quotaon、edquota、setquota、repquota这些命令。先确认工具是否安装:

which quotacheck quotaon edquota repquota

没有输出就说明没装,按发行版安装:

# Debian / Ubuntu apt install quota -y # RHEL / CentOS / Rocky Linux yum install quota -y # 或新版系统的 dnf dnf install quota -y

安装后顺便检查一下内核是否启用了配额支持。绝大多数主流发行版的内核都开了 CONFIG_QUOTA,但虚拟机里跑的精简内核有时会裁掉这部分功能:

zgrep CONFIG_QUOTA /proc/config.gz # 输出 CONFIG_QUOTA=y 表示支持

如果显示# CONFIG_QUOTA is not set,那你得换内核或者换发行版,配额功能本身依赖这个内核编译选项。

3.2 初始化配额数据库并开启配额功能

确认文件系统已经用配额选项挂载后,下一步是生成配额数据库。这一步的顺序很重要:必须先 quotacheck,再 quotaon。

quotacheck -cug /data

参数含义:-c创建配额文件,-u扫描用户配额,-g扫描组配额。执行成功后,在/data根目录下会出现两个隐藏文件:

ls -l /data/aquota.user /data/aquota.group

如果这一步报错“Cannot find filesystem to check”,大概率是挂载参数没生效。先回第 2 章确认挂载选项,ext4 可以再执行一次mount -o remount /data,XFS 则是另一个故事,后面单独讲。

数据库生成后,激活配额:

quotaon -ugv /data quotaon -p /data

quotaon -p用来查看当前配额状态,能看到 user quota 和 group quota 都处于打开状态就对了。需要说明的是,quotacheck 在大型分区上可能跑很久,因为它要扫描整个文件系统统计所有文件的所有者。生产环境如果在业务高峰期第一次跑,尽量错峰执行。

3.3 设置用户配额、组配额与宽限期

配额数据库激活后,就可以给用户设置限额了。最直观的方式是edquota,它会打开一个交互式编辑器:

edquota -u zhangsan

输出大概是这样的:

Disk quotas for user zhangsan (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sdb1 0 0 0 0 0 0

需要改的就是 blocks 对应的 soft 和 hard 两列,单位是 KB。比如要给 zhangsan 设置软限制 10GB、硬限制 12GB,把 blocks 的 soft 改成 10485760,hard 改成 12582912 就行。inodes 那两列如果不想限制文件数量,保持 0 即可。

但交互式编辑在批量管理时效率太低,我更推荐setquota,一条命令搞定:

setquota -u zhangsan 10240 12288 0 0 /data

四个数字依次是:软限制块数(KB)、硬限制块数(KB)、软限制 inode 数、硬限制 inode 数。所以上面的命令就是 10GB 软限制、12GB 硬限制。

组配额同理:

setquota -g devteam 21474836480 25600000000 0 0 /data

提示:组配额很适合“一个项目组共用一个共享目录”的场景。单人配额管不住组里相互拷贝文件的情况,组配额能从整体上兜底。

宽限期默认 7 天,可以用edquota -t调整,也可以直接用 setquota 的-T参数:

edquota -t

查看用户实际使用量和配额状态:

quota -u zhangsan repquota -a

repquota -a会列出所有启用配额文件系统的完整报告,包括用户简单使用情况、软硬限制、宽限期剩余时间,是我日常巡检最常用的命令。看到+号标记时说明该用户已经超过软限制,正在占用宽限期时间。

4. XFS 文件系统启用配额完整实操

4.1 XFS 配额的工作方式与挂载选项选择

XFS 配额的管理哲学和 Ext4 完全不同,这里必须先建立正确的认知模型,否则后面会一直别扭。

XFS 的配额是文件系统原生特性,配额计数器直接维护在文件系统元数据里。这意味着:没有aquota.user这类配额文件,不需要 quotacheck 扫描,也不需要 quotaon 激活。配额信息的记录和强制都发生在挂载时指定的选项里。

挂载选项有这么几组:

uquota / usrquota # 用户配额(强制) gquota / grpquota # 组配额(强制) pquota / prjquota # 项目配额(强制) uqnoenforce # 用户配额(仅记账,不强制) gqnoenforce # 组配额(仅记账,不强制) pqnoenforce # 项目配额(仅记账,不强制)

带 noenforce 后缀的选项是 XFS 很有特色的一点,也是我非常推荐的一个部署技巧:第一次上线配额时,先只记账不强制,跑几天看看真实使用量,再决定软硬限制怎么定,最后改成强制模式。直接上强制模式容易误伤正常业务,这个思路在 Ext4 上也能用,但 XFS 支持得更干净。

挂载参数生效后,用state子命令确认:

xfs_quota -x -c 'state' /data

输出会显示 user quota、group quota、project quota 各自的 accounting 和 enforcement 状态。这里要再次强调关键差异:XFS 的配额选项不能在 remount 时动态加上。实测下来,无论你怎么用mount -o remount折腾挂载参数,XFS 的 quota 选项都不会生效,必须重启或将文件系统 umount 后重新挂载。

4.2 用 xfs_quota 设置用户与组配额

XFS 的所有配额管理都通过xfs_quota这个工具完成。-x表示进入专家模式,-c后面跟具体的配额命令。给用户设置限额:

# 用户配额:软限制 10GB,硬限制 12GB xfs_quota -x -c 'limit -u bsoft=10g bhard=12g zhangsan' /data

给组设置限额:

xfs_quota -x -c 'limit -g bsoft=30g bhard=35g devteam' /data

查看使用情况:

xfs_quota -x -c 'report -h -u' /data xfs_quota -x -c 'report -h -g' /data

-h是 human-readable,输出会显示成 G/M 这样的单位。report输出的列和 repquota 类似,能看到每用户的 blocks 使用量、软硬限制和宽限期状态。这里注意一下:XFS 调整默认宽限期用的是timer子命令,语法是xfs_quota -x -c 'timer -u -b 7d' /data,但不同版本细节略有差异。我在生产上更习惯直接用setquota -T设置用户的 grace period,语法更统一,后面给参考。

# 把 zhangsan 的宽限期设为 7 天 setquota -T -u zhangsan 7days 7days /data

4.3 项目配额:按目录限额的正确玩法

项目配额(project quota)是 XFS 的王牌功能,也是它和 Ext4 相比最有优势的地方。场景非常典型:一台文件服务器,/data下按客户或业务划分目录,每个目录限额独立。用户配额管的是“某个用户写多少”,项目配额管的是“某个目录树总共放多少”。

以/data/website_a这个目录为例,给它分配项目 ID 1001,限额 50GB。第一步是编辑两个配置文件:

# /etc/projects 文件:定义项目 ID 与目录的映射 echo "1001:/data/website_a" >> /etc/projects # /etc/projid 文件:定义项目名称与 ID 的映射 echo "website_a:1001" >> /etc/projid

第二步是“初始化”项目目录,这一步很多人会漏。必须用project -s给目录打上项目 ID 标记:

xfs_quota -x -c 'project -s website_a' /data

执行后,/data/website_a目录及其下的文件会被统一标记为项目 ID 1001。新创建的文件会自动继承父目录的项目 ID,所以业务方后续正常写文件、建子目录都不需要额外操作。

第三步才轮到设置配额:

xfs_quota -x -c 'limit -p bsoft=50g bhard=55g website_a' /data

查看项目配额用量:

xfs_quota -x -c 'report -h -p' /data

项目配额有个很实用的细节:它不影响文件的权限和属主,目录还是那些用户在用,只是写入数据时会额外检查项目 ID 的配额。也就是说,一个用户既可以在项目 A 里写 30GB,又可以在项目 B 里写 30GB,两个项目独立统计,互不影响。

注意:用 mv、rsync、tar 等方式迁移文件时,项目 ID 可能不会被正确继承,导致统计错位。如果发现某个目录的配额使用量明显不符合预期,用xfs_quota -x -c 'project -c website_a' /data重新校准目录树的项目标记即可。另外,早期版本的 mkfs.xfs 默认不带项目配额特性,碰到pquota挂载报错时,用xfs_info /data检查是否支持,必要时备份数据后用新版 mkfs.xfs 重新格式化。

5. 常见问题排查与运维心得

5.1 遇到最多的五个问题

配额配置本身不难,难的是出了问题快速定位。我整理了实际运维中遇到频率最高的五个问题,直接做成速查表:

问题现象可能原因解决思路
quotacheck 报 Cannot find filesystem to check在 XFS 上执行了 quotacheck,或 ext4 未以配额选项挂载确认文件系统类型;XFS 不要用 quotacheck;ext4 先确认挂载参数
配额不生效,用户仍能超限写入挂载参数没生效,XFS 只是 remount 过mount 确认参数;XFS 需要重启或 umount 后挂载
quotaon 报错 quota on /data failed没有先执行 quotacheck 生成配额文件先 quotacheck -cug,再 quotaon
用户收到 Disk quota exceeded超过硬限制,或软限制宽限期已耗尽用 repquota / xfs_quota report 查看,确认是否误伤业务
修改 fstab 后系统无法正常挂载fstab 参数写错、设备名或 UUID 不匹配启动到单用户模式或救援盘修正 fstab,务必先备份

除了这张表,XFS 项目配额还有一个容易碰到的问题:项目目录统计不到新写入的数据,或者统计值一直不变。这多半是数据是通过 NFS 或直接对底层目录操作写入的,绕过了项目初始化标记。我当时的处理办法是确认写入路径都经过/data下的项目目录,跑一次project -s重新标记整个目录树,再配合report -p观察数值是否变化。

5.2 我的几条实操建议

配额功能本身不难配,难的是配得合理、管得长久。结合这几年在文件服务器、业务主机上的实际操作,说几条我自己沉淀下来的经验。

第一,先记账后执法。XFS 的 noenforce 选项和 Ext4 的只记不发模式都是好工具。首次上线配额时,先用两周时间摸清每个用户或目录的真实使用量,再根据数据定软硬限制。我见过太多人一上来就拍脑袋定个 10GB,结果业务正常写 15GB,第二天全线告警,非常尴尬。

第二,配额值要留缓冲。软硬限制之间至少留 15%-20% 的差距。宽限期是按天算的,软限制到了之后,用户需要时间清理空间或者申请扩容。如果软硬限制只差 1GB,用户一个晚上写点文件就撞上硬限制,等于没给宽限期。

第三,巡检脚本比人工查看可靠。配额和磁盘告警一样需要定期看,用 cron 把 repquota 或 xfs_quota report 的结果汇总发到邮箱,比等用户报障再处理主动得多。我常用的裁剪版命令是直接把用量超过 80% 的用户过滤出来:

repquota -a | awk '$3 > 0 { if ($3/$4 > 0.8) print }'

第四,别忽略 inode 配额。小文件写爆 inode 的问题在日志系统、缓存目录上非常常见,而且一旦 inode 耗尽,整个分区无法创建新文件,影响的不是一个用户,而是所有依赖该分区的服务。给用户设置容量配额的同时,顺手把 inode 软硬限制一起设上,损失不了多少维护成本。

第五,生产环境变更先演练。配额的生效、失效、扩容流程最好在测试机上完整走一遍,尤其是 XFS 这种需要重启才能启用配额的文件系统。我踩过的坑是:在线上服务器改完 fstab 后以为 remount 就能生效,结果配额一直没起作用,白跑一趟维护窗口。后来经验是,XFS 的配额变更一律按“改 fstab + 计划重启”处理,测试环境先验证重启后配额确认生效,再上生产。

最后再分享一个经验:配额最怕的其实不是技术问题,而是“限错了对象”。给用户配配额之前,先搞清楚这块盘是给谁用的、业务峰值是多少、有没有临时大文件目录。多租户目录用 XFS 项目配额,用户家目录用 Ext4 用户配额加组配额兜底,大部分场景都能覆盖。配额配置完成之后,第一时间用配额工具复查一遍,确认 enforcement 状态已经打开,再通知团队开始正式使用,这才是靠谱的上线节奏。

返回列表