Linux磁盘配额怎么配才不被单个用户撑爆盘?ext4与xfs配额实战
本文目录
- 磁盘配额到底限制什么?软限制、硬限制和宽限期是什么意思?
- ext4文件系统怎么开启磁盘配额?完整流程是怎样的?
- xfs为什么不用quotacheck?它的配额有什么不一样?
- 怎么给用户和组设具体的配额?怎么查用量?
- xfs的项目配额怎么按目录限额?
- 磁盘配额在真实运维里都用在哪些场景?
- 配额超限了怎么办?怎么做到提前预警而不是等出事?
- 磁盘配额和单独挂载、LVM怎么配合规划存储?
- 配磁盘配额最容易踩哪些坑?
- 保哥给一台共享服务器配配额,完整走了一遍是怎样?
- 常见问题解答
- 磁盘配额是按整块硬盘还是按文件系统算的?
- ext4和xfs的配额配置主要差在哪?
- 软限制和硬限制到底该怎么搭配设?
- 为什么我设了配额,root用户还是能随便写?
- 磁盘配额会拖慢服务器性能吗?
- 权威参考资料
磁盘被某一个用户或某一个目录悄悄撑满,是Linux服务器最常见也最致命的宕机原因之一:日志写不进、数据库拒绝写入、上传失败、整站500,而
df一看才发现是某个账号的家目录或某个失控的进程把盘吃光了。磁盘配额(disk quota)就是为这种事准备的安全阀——给每个用户、每个组、甚至每个目录设一个用量上限,谁也别想一个人把整块盘占满。保哥这篇把Linux磁盘配额从原理到落地讲透:配额到底限制什么(空间和文件数两条线)、软限制硬限制和宽限期分别是什么意思、ext4上从装quota工具、改fstab、生成配额数据库到quotaon的完整流程、xfs为什么不用quotacheck而且还能按目录配额(project quota)。
再到怎么用edquota和setquota给用户和组设额、怎么用repquota出一张全员用量报表,以及Web服务器多站点、共享主机、邮件服务器这些真实场景怎么配,最容易让你把服务器搞进救援模式的几个坑也一并讲清。看完你就能给服务器装上这道“谁也别想撑爆盘”的保险。
先讲个保哥真处理过的事故。一台跑着好几个独立站的服务器,半夜突然全站500,客户炸锅。保哥登上去一看,df -h 显示根分区100%。再一排查,是其中一个站的用户跑了个导出脚本,把几十G的临时文件全堆在自己家目录里,把整块盘吃光了。结果不只是他自己的站挂,连同一台机器上其他站的数据库都因为写不进而崩了——一个用户的失控,拖垮了一整台机器。
这就是没设磁盘配额的代价:资源是共享的,但没有任何一道闸限制单个用户能占多少,于是任何一个人的失误或滥用,都能波及所有人。磁盘配额做的事很简单——给每个用户、每个组划一条用量红线,到线就拦,谁也别想把公共的盘独吞。这一篇,保哥就把这道闸怎么装、怎么调讲清楚。
磁盘配额到底限制什么?软限制、硬限制和宽限期是什么意思?
先把概念理清,后面配起来才不糊涂。Linux的磁盘配额是内核原生支持的功能,针对的是“某个文件系统上,某个用户或某个组能用多少”,它限制的不是一个数字,而是两条独立的线。
第一条是块配额(block quota),管的是占用的磁盘空间,单位通常是KB。这是大家最直觉理解的“能用多少G”。第二条是inode配额(inode quota),管的是能创建多少个文件和目录。后者容易被忽略,但同样重要——有人可能空间没占多少,却创建了几百万个小文件,把inode耗尽,导致整个文件系统再也建不了新文件,效果和盘满了一样糟。
这两条线上,又各自分软硬两档,外加一个宽限期,这是配额机制的精髓:
- 软限制(soft limit):可以临时超过的“警告线”。用户超过软限制后系统不会立刻拦他,而是开始倒计时(就是宽限期),并发出警告。
- 硬限制(hard limit):绝对不能越过的“天花板”。一旦达到硬限制,系统立刻拒绝继续写入,没有商量余地。
- 宽限期(grace period):用户超过软限制后允许超额停留的时间窗口(比如7天)。在宽限期内他还能继续用,但必须在期限内降回软限制以下;一旦宽限期过了还没降下来,软限制就会被当成硬限制强制执行,写不进了。
这套设计的好处是既有弹性又有底线:软限制给用户临时超额的缓冲(比如月底批量处理时短暂涨一下),硬限制和宽限期则保证他不会无限期地占用过多资源。配额是按“用户 + 文件系统”或“组 + 文件系统”这个组合来算的,也就是说同一个用户在不同的挂载点上可以有不同的配额。
ext4文件系统怎么开启磁盘配额?完整流程是怎样的?
ext4是目前最常见的Linux文件系统,开启配额需要几个步骤,保哥按顺序走一遍,以给 /home 设用户和组配额为例。
第一步,装quota工具包。配额功能在内核里,但管理它的命令行工具要单独装:
sudo apt update
sudo apt install quota # Debian / Ubuntu
# CentOS / RHEL 系: sudo yum install quota第二步,在 /etc/fstab里给目标文件系统加配额挂载选项。找到 /home 对应的那一行,在options字段加上 usrquota(用户配额)和 grpquota(组配额):
/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2只要用户配额写 usrquota、只要组配额写 grpquota、两个都要就都写上。
第三步,重新挂载让选项生效。改完fstab不用重启,重新挂载即可:
sudo mount -o remount /home
mount | grep /home # 确认输出里有 usrquota,grpquota第四步,生成配额数据库文件。用 quotacheck 扫描文件系统当前用量、生成记账文件 aquota.user 和 aquota.group:
sudo quotacheck -cugm /home这里的参数:c 表示创建新的配额文件,u 为用户生成aquota.user,g 为组生成aquota.group,m 表示不要把文件系统重新挂载成只读(在根分区或正在使用的分区上跑时这个参数很关键,否则会报错或影响在线服务)。
第五步,开启配额。记账文件就位后,正式打开配额执行:
sudo quotaon -v /home到这一步,/home 的配额就生效了。注意目前只是开了机制、还没给任何人设具体的额度,设额是下面edquota的事。
xfs为什么不用quotacheck?它的配额有什么不一样?
如果你的文件系统是xfs(很多企业发行版和大容量场景默认用它),配额的玩法和ext4不太一样,而且更简单——但前提是你得在挂载时就启用,事后想加比较麻烦。
xfs的配额是从挂载那一刻就强制执行的,没有ext4那种先quotacheck生成文件、再quotaon打开的两步走。你只需要在fstab的挂载选项里写上对应的配额类型:
/dev/sdb1 /data xfs defaults,uquota,gquota 0 0这里 uquota 是用户配额、gquota 是组配额。挂载后配额立即生效,不需要quotacheck,也不需要quotaon。代价是:如果你想给一个已经挂载的xfs加配额,通常得重新挂载(甚至根文件系统要改内核启动参数),不能像ext4那样在线remount就加上。所以xfs的配额最好在规划阶段就定好。
xfs还有一个ext4没有的杀手锏——项目配额(project quota),可以按目录而不是按用户来限额。挂载选项用 pquota 启用后,你能给某个特定目录(及其下所有内容)设一个总上限,不管是谁往里写。这在容器数据目录、某个应用的工作目录、或者“这个项目最多用50G”这种场景下极其好用,因为它不关心文件属主,只认目录。后面专门讲这个。
怎么给用户和组设具体的配额?怎么查用量?
机制开好了,接下来是给具体的用户、组、目录设额度。最常用的是 edquota 和 setquota 两个命令。
用edquota交互式编辑。它会打开一个编辑器,让你填软硬限制:
sudo edquota -u alice # 编辑用户 alice 的配额
sudo edquota -g devteam # 编辑组 devteam 的配额打开后你会看到blocks(已用空间)、soft、hard(空间软硬限制),以及inodes、soft、hard(文件数软硬限制)几列。已用那两列是系统填好的现状,你只改soft和hard两列的数字即可。比如把空间软限制设5000000(约5G)、硬限制设6000000(约6G),存盘退出就生效。
用setquota命令行直接设,适合写进脚本批量配置,不用进编辑器:
# 格式: setquota -u 用户 块软限 块硬限 inode软限 inode硬限 文件系统
sudo setquota -u alice 5000000 6000000 0 0 /home上面把alice的空间软限设5G、硬限6G,inode不限(填0)。设额里0代表不限制,这点要记牢。
设宽限期用edquota -t。宽限期是全局按文件系统设的,不是按单个用户:
sudo edquota -t # 编辑各文件系统的块/inode宽限期查看用量有几种方式。看单个用户用 quota,出全员报表用 repquota:
quota -u alice # 看 alice 的配额和用量
sudo repquota -a # 所有已启用配额的文件系统的全员报表
sudo repquota -s /home # -s 用 G/M 等人性化单位显示repquota 出的那张表是保哥日常巡检最常看的——一眼扫过去谁快到线了、谁已经超了软限制在宽限期里,心里就有数了,能在出事前提前提醒或处理。
这里要特别提醒一句inode配额别忘了设。很多人只设了空间限制,inode限制留0(不限),结果遇到一种刁钻的滥用:用户空间没占多少,却用脚本生成了几百万个几字节的小文件,把文件系统的inode耗尽。inode一旦用光,整个文件系统就再也建不了任何新文件,哪怕 df -h 显示空间还剩一大半。
这种情况要用 df -i 才看得出inode满了。保哥见过一台机器就是被某个缓存目录的海量碎文件把inode吃干,排查时空间明明够用却处处报“No space left on device”,一度让人摸不着头脑,最后是 df -i 一看inode用了100% 才恍然大悟。所以对会产生大量小文件的用户或目录,inode配额和空间配额一样要设上,两条线一起守才稳。空间和inode是两套独立的天花板,少守一条都可能在你意想不到的地方被击穿。
xfs的项目配额怎么按目录限额?
前面提到xfs的项目配额能按目录限额,这在实际运维里用处很大,保哥单独讲讲怎么落地。它适合的场景是“我不在乎这个目录里的文件属于谁,我只要这个目录整体别超过某个大小”,比如限制某个应用的数据目录、某个共享上传目录、或某个项目的总占用。
配置思路分几步。先在挂载选项里启用 pquota(项目配额)。然后给项目起个名字和编号,写进 /etc/projects(编号对应目录路径)和 /etc/projid(项目名对应编号)两个文件做映射。接着用 xfs_quota 工具把目录初始化为一个项目,再给这个项目设上限。
# /etc/projects 里: 项目编号:目录路径
echo "10:/data/uploads" | sudo tee -a /etc/projects
# /etc/projid 里: 项目名:项目编号
echo "uploads:10" | sudo tee -a /etc/projid
# 初始化并设额(给 uploads 项目设 50G 硬限)
sudo xfs_quota -x -c 'project -s uploads' /data
sudo xfs_quota -x -c 'limit -p bhard=50g uploads' /data设完之后,不管哪个用户、用什么身份往 /data/uploads 里写,整个目录的总占用都不会超过50G。这种“认目录不认人”的限额,是按用户配额做不到的,也是xfs相比ext4在配额上的一大优势。
磁盘配额在真实运维里都用在哪些场景?
讲完操作,保哥说几个真实里最常给服务器配配额的场景,你对号入座,看看自己的环境里有没有该补这道闸的地方。这几个场景的共同点都是“多个使用者共享同一块存储、且任何一个都不该独占”,这正是配额最有价值的前提条件。
多站点共享一台服务器。这是开头那个事故的解药——一台机器跑多个独立站,每个站一个Linux用户,给每个用户的家目录设配额,谁也撑不爆整块盘,一个站的失控不会再连累其他站。这类多租户隔离是配额最经典的用武之地。
给用户的 /home限额。有多个开发或运维共用一台机器时,给每人的家目录设额,防止有人下载大文件、堆日志、留临时文件把盘占满。配合保哥讲的 日志管理与logrotate一起做,一个管用户、一个管日志,盘满的两大来源就都堵住了。
邮件服务器的邮箱限额。每个邮箱用户能存多少邮件,本质就是给对应用户在邮件存储分区设配额,超了就拒收或提醒清理,是邮件系统的标配。没有限额的邮箱很容易被人塞满附件、或被垃圾邮件灌爆,进而拖累整个邮件分区,所以邮箱配额几乎是必配项,区别只在限额定多大。
FTP或对象存储的上传配额。对外提供文件上传的服务,给上传用户或上传目录设配额,能防止有人上传超大文件或海量文件把存储占满。这类对外暴露的写入入口风险最高,配额是最基本的一道防滥用闸,配合限速、文件类型限制一起用,才能让对外的上传功能既可用又不至于失控。
应用数据目录限额。用xfs项目配额给某个应用、某个上传目录、某个容器卷设总上限,防止某个服务的数据无限膨胀。这种按目录的限额配合监控告警,能在磁盘出问题前就拦住。盘真要满了再去救,远不如提前用配额拦住——这和保哥讲 服务器性能与磁盘IO排查那篇是一前一后的关系:配额是预防,排查是事后。
配额超限了怎么办?怎么做到提前预警而不是等出事?
配额配上只是第一步,真正让它发挥价值的是“在用户撞墙之前就知道”。如果你只是设了硬限制、等用户写不进了才被动收到投诉,那体验和盘满了其实差不太多——只是范围小了点。保哥强调的运维思路是:配额要配监控,把被动拦截变成主动预警。
最简单的办法是用 repquota 定期出报表,扫描谁的用量接近软限制。你可以写一个小脚本,定时跑 repquota -as,把超过某个百分比(比如用量达到软限制80%)的用户挑出来,发邮件或推送提醒。这样在用户真正受影响前,你或他本人就能提前清理或申请扩容。
把这个检查脚本挂到定时任务里跑,是最自然的做法。保哥在 用cron把运维自动化那篇里讲过怎么把备份、日志清理、证书续期这些都做成定时任务,配额巡检完全可以加进这套体系——每天凌晨跑一遍配额报表,异常就告警,运维就从“等出事”变成了“防患于未然”。
当用户真的超了硬限制写不进时,处理也很直接:要么让他清理掉不需要的文件把用量降回限制以下,要么评估确实需要更多空间、用edquota给他调高额度。关键是有了预警,这种处理大多能从容进行,而不是在半夜被宕机叫醒后手忙脚乱。配额的价值不只是“拦住”,更是“让你对每个用户的用量心里有数”。
另外提醒一点:给用户发的超限提示要让他看得懂、知道怎么办。很多系统默认的配额超限报错对普通用户来说很费解,他只会觉得“为什么我传不上去了”。在共享主机或多用户环境里,最好配套一份说明,告诉用户配额是多少、怎么查自己的用量(quota -s)、超了该清理哪里,省去大量来回的客服沟通。
磁盘配额和单独挂载、LVM怎么配合规划存储?
磁盘配额很好用,但它不是存储规划的全部。保哥想把它放到更大的图景里讲一句——配额、单独挂载、逻辑卷管理,这几样配合起来,才是一套完整的“别让磁盘成为单点故障”的思路。
第一层是单独挂载。前面FAQ里提过,把容易膨胀的目录(/home、/var/log、上传目录、数据库数据目录)单独挂成独立的文件系统,而不是全堆在根分区。这样哪怕某个目录被写爆,撑满的也只是那个独立分区,根分区还活着,系统不至于整个瘫痪。配额是在这个基础上再做精细的用户级限制。
第二层是配额。在单独挂载的分区上开配额,给用户、组或目录设额,把“某个分区被撑满”进一步细化到“某个用户在这个分区里也别想独占”。单独挂载防的是目录之间互相拖累,配额防的是同一目录内用户之间互相拖累,两者是不同粒度的隔离。
第三层是逻辑卷(LVM)。如果你用LVM管理存储,分区大小不是一锤子买卖——某个分区配额整体不够用了,可以在线扩展逻辑卷、再扩展文件系统,加空间不用停机重装。这就解决了“单独挂载之后分区大小僵化”的顾虑:先按规划切分、开配额,真不够了用LVM平滑扩容。三层配合,存储既隔离得清楚、又留足了弹性。
对独立站服务器来说,保哥的实战建议是:数据库数据目录、网站文件目录、日志目录尽量分开挂载,关键的多用户目录开配额,底层用LVM留扩容余地。这套组合拳下来,磁盘相关的故障面会小很多,哪怕真出问题也基本是局部、可控、可快速恢复的,而不是开头那种一个用户拖垮整台机器的连锁崩盘。
配磁盘配额最容易踩哪些坑?
保哥按踩坑频率列几个最容易翻车的,配之前对照一遍,能少进几次救援模式。
第一,fstab写错导致服务器起不来。改 /etc/fstab是高危操作,选项拼错、写错设备名,可能导致开机挂载失败、系统进emergency mode(救援模式)。保哥的铁律是:改完fstab先 mount -o remount 或 mount -a 验证不报错,再考虑重启,绝不改完直接reboot走人。最好提前知道怎么进救援模式改回来。备份也要做,配额配置本身和fstab都值得纳入 rsync增量备份的范围,出事能快速回滚。
第二,quotacheck在挂载状态下跑报错。quotacheck默认想把文件系统挂成只读再扫,但对正在使用的分区(尤其是根分区)这会失败或影响服务。解法就是加 -m 参数让它别remount只读,前面流程里的 -cugm 已经带上了。在线服务器上跑配额初始化,-m 几乎是必须的。
第三,配额对root不生效,以为没配成功。root用户默认不受配额限制——这是设计如此,不是bug。如果你拿root测试写文件发现怎么写都不拦,别慌,换个普通用户测就对了。配额是给普通用户和组用的。
第四,软限制设了却以为没用。软限制是可以超过的,超过后是进入宽限期倒计时、不是立刻拦截。有人设了软限制,看到用户超了还能写,就以为配额失效了。其实那是宽限期内的正常行为,等宽限期一过就拦了。要立刻硬拦就看硬限制那一档。理解软硬限制的区别,才不会误判。
第五,xfs想事后加配额却加不上。xfs配额必须挂载时启用,已经挂载好的xfs(特别是根文件系统)想加uquota/pquota,往往得重新挂载甚至改grub启动参数,不能像ext4那样在线remount就加。所以用xfs的话,配额要在部署规划阶段就定好,别等盘快满了才想起来加。
第六,repquota看着用量是0,以为没记账。刚开启配额、还没让用户产生新写入,或quotacheck跑的时机不对时,报表里用量可能显示得不准。正常情况下quotacheck会扫描现有文件统计出真实占用,如果你发现数字明显不对,重新跑一次quotacheck(记得带 -m)重建记账文件即可。配额刚启用后,养成跑一次repquota核对现状的习惯,能及早发现记账异常。
保哥给一台共享服务器配配额,完整走了一遍是怎样?
把前面的零件拼成完整画面,保哥分享开头那个事故之后,怎么给那台多站点服务器补上配额这道闸的全过程,你可以照着这个骨架套自己的环境。
先做隔离。那台机器原来所有站点文件都堆在根分区,保哥第一步是把 /home单独挂成一个分区(每个站一个用户、家目录在 /home下),把日志目录也单独挂出去。这样根分区先和用户数据解耦,单个用户再怎么折腾也撑不到根分区。
再开配额。因为是ext4,走标准流程:装quota包、在 /home那行fstab加usrquota,grpquota、remount确认选项生效、quotacheck -cugm /home 生成记账文件、quotaon -v /home 开启。整个过程在线完成,没停服务,-m 参数是关键,避免它去remount只读影响正在跑的站。
然后按站点规模设额。用 setquota 写进一个初始化脚本,给每个用户按它站点的实际体量设软硬限制——小站软限3G硬限4G,大站软限15G硬限18G,宽限期统一7天。用脚本批量设而不是一个个edquota,几十个用户几秒钟搞定,以后加站直接往脚本里追加一行。
最后挂监控。写一个跑 repquota -as 的小脚本,挑出用量超过软限制80% 的用户发邮件提醒,用cron每天凌晨跑一次。从此哪个站快到线了,保哥提前一天就收到信,从容处理。配完到现在,那台机器再没出现过“一个用户撑爆全盘”的事故——哪怕有人又跑失控脚本,最多撑爆他自己那点配额,其他站和根分区毫发无伤。
这个过程保哥想强调的是:配额不是孤立的一条命令,而是“单独挂载做粗隔离、配额做细限制、监控做提前预警”三件事配套落地。三样都到位,磁盘才真正从一个随时可能拖垮全机的单点,变成了一个可控、可预警、出问题也只是局部的资源。
常见问题解答
磁盘配额是按整块硬盘还是按文件系统算的?
按文件系统(挂载点)算,不是按物理硬盘。配额的记账单位是“用户或组 + 某个文件系统”这个组合,你在哪个挂载点的fstab里开了配额、就只对那个挂载点生效。这意味着同一个用户在 /home和 /data上可以有完全不同的配额,互不影响。如果你想限制某个用户在多个文件系统上的用量,需要分别在每个文件系统上给他设额。也正因如此,把需要限额的目录单独挂成一个文件系统(而不是都堆在根分区),管理起来更清晰、也更安全——根分区被某个用户撑满的风险也随之降低。
ext4和xfs的配额配置主要差在哪?
差在启用方式和灵活度。ext4要走“装quota工具、改fstab加usrquota/grpquota、remount、quotacheck生成aquota文件、quotaon开启”五步,而且可以在线remount后再加配额;xfs则是在挂载选项里写uquota/gquota就从挂载那刻强制生效,不需要quotacheck和quotaon,但事后想给已挂载的xfs加配额比较麻烦,往往要重新挂载或改启动参数。另外xfs独有项目配额(project quota),能按目录而非按用户限额,这是ext4没有的能力。简单说ext4配置步骤多但事后好加,xfs启用简单且能按目录限额但要规划在前。
软限制和硬限制到底该怎么搭配设?
常见做法是硬限制设成你绝对不允许越过的天花板,软限制设在硬限制下方一点、作为预警线,中间留出宽限期作缓冲。比如给用户空间硬限6G、软限5G、宽限期7天:日常用量控制在5G内,偶尔批量处理临时涨到5G到6G之间时系统只警告、给7天降回去,但任何时候都碰不到6G这条硬线。这样既给了正常波动的弹性,又守住了绝对上限。如果你的场景完全不允许超额(比如严格的多租户),也可以把软硬限制设得很接近、或宽限期设得很短,让软限制几乎等同硬限制。具体数值要结合业务的真实波动来定。
为什么我设了配额,root用户还是能随便写?
这是正常的,root默认不受磁盘配额限制,属于设计行为而非配置失败。配额机制是用来约束普通用户和组的,root作为超级用户拥有绕过限制的权限。所以测试配额是否生效,一定要用普通用户来测,别用root——拿root写文件发现怎么都不拦,不代表配额没配好。如果你需要连特权进程也受限,那得用别的机制(比如把数据目录单独挂载、用xfs项目配额按目录限额、或容器层面的存储限制),而不是指望用户配额拦住root。
磁盘配额会拖慢服务器性能吗?
影响极小,可以忽略。配额是内核原生支持的,记账开销很低,正常使用感觉不到性能下降。真正需要注意的是quotacheck——它要全盘扫描统计用量,在超大文件系统、文件数量极多时会比较慢、占一些IO,所以一般在低峰期跑、并且只在初次启用或文件系统异常需要重建配额文件时才跑,不需要频繁执行。日常的配额执行(写入时检查是否超限)是轻量的,不会成为性能瓶颈。相比磁盘被撑满导致整机宕机的代价,配额带来的这点开销完全值得。
权威参考资料
FAQPage + Article AI 引用友好版
磁盘被一个用户撑满拖垮整机,是Linux最常见的宕机原因。磁盘配额给每个用户、组、目录设上限。本文讲透软硬限制与宽限期、ext4从装quota到quotaon的完整流程、xfs为何不用quotacheck还能按目录限额,附设额、报表与五个把服务器搞进救援模式的坑。
- Linux运维
- 服务器运维
- Linux
- 磁盘配额
title: Linux磁盘配额怎么配才不被单个用户撑爆盘?ext4与xfs配额实战 author: 张文保 (Paul Zhang) — PatPat SEO 经理 url: https://zhangwenbao.com/linux-disk-quota-user-group-quota-xfs-ext4-setup-management.html published: 2026-04-12 modified: 2026-04-12 source-type: First-hand expert commentary language: zh-CN license: CC BY-NC-SA 4.0 (要求保留原文链接与作者归属)
本文标题:《Linux磁盘配额怎么配才不被单个用户撑爆盘?ext4与xfs配额实战》
本文链接:https://zhangwenbao.com/linux-disk-quota-user-group-quota-xfs-ext4-setup-management.html
版权声明:本文原创,转载请注明出处和链接。许可协议: CC BY-NC-SA 4.0