ARTICLE DETAIL

资讯详情

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

Linux磁盘配额实战指南:从ext4到xfs的配置与避坑

Linux磁盘配额实战指南:从ext4到xfs的配置与避坑 1. 磁盘配额到底解决了什么问题磁盘配额这个功能说复杂不复杂说简单也不简单。简单理解就是给用户或组设置一块磁盘空间的消费上限超过这个上限就禁止继续写入。这在多用户服务器、共享存储、虚拟主机生产环境里几乎是刚需。我踩过最典型的一个坑是早年给公司搭文件共享服务器没配配额结果某个同事直接往共享目录里拖了几百GB的虚拟机镜像一夜之间整个存储池满了所有业务系统同时报错磁盘空间不足。从那以后我学乖了凡是要给多人用的目录配额一定先配好再交付。那磁盘配额能干什么几条实在的能力限制单个用户在特定文件系统上的空间占用按块block限制限制单个用户可创建的文件数量按inode限制限制一组用户的总空间占用和文件数量组配额设置软限制和硬限制软限制是警告阈值超过后系统会提示但允许继续用一段时间硬限制是绝对上限超过就直接拒绝写入通过宽限期grace time控制在软限制之上还能撑多久到期后软限制自动变成硬限制这套机制特别适合几类场景企业对内文件服务器、高校机房或实验室共享存储、云服务器上给客户开通的多租户站点、以及任何形式的公共FTP/NFS存储目录。单机个人电脑其实不太用得上但如果你的电脑上建了多用户账号给家人或同事用配一下也省心。2. 配额机制的底层原理搞懂这些再动手2.1 限制的是块和inode而不是文件大小这件事很多人第一次看配额会困惑为什么有的配额配置界面显示的是1K Blocks其实Linux文件系统在底层管理空间的时候是以**块block**为单位划分的一个块默认是4KB。一个100KB的文件实际占用的是25个块而不是一个100KB的文件。配额限制的就是这些块的总数也就是用户实际消耗的物理空间。inode这个维度就更底层了。每个文件至少要占用一个inodeinode里存的不是数据而是文件的元数据——权限、所有者、时间戳、数据块指针等。如果一个文件系统inode耗尽即使物理空间还一大堆你也创建不了新文件。所以配额表里通常同时提供blocks和inodes两个维度blocks管空间大小inodes管文件数量。2.2 软限制、硬限制和宽限期三者协作的逻辑软限制soft limit是一个提醒值。比如你给某个用户设了软限制5GB、硬限制8GB、宽限期7天。用户用到5GB之后系统会告警但用户还是能继续写一直写到8GB被硬限制堵死但如果用户一直是超了5GB但没到8GB的状态超过7天宽限期系统就会直接禁止继续分配块除非删除文件把用量压回5GB以下。硬限制hard limit就是一道硬墙。到了这个值not only新写入被拒绝之前的文件也删不掉不是的硬限制只阻止新数据的写入用户依然可以删除自己的文件腾出空间。这一点在排查问题的时候特别重要——用户说我删了文件还是写不进去多半是删除后仍然超出硬限制或者配额按块计算、小碎文件删了不少但释放的块不多。2.3 用户配额、组配额、项目配额有什么区别Linux配额支持三个作用域用户user quota、组group quota、项目/目录project quota。用户配额最容易理解限制的对象是UID每个人的占用独立算账。适合个人目录、home目录这类场景。组配额限制的对象是GID。比如某个项目组共享一个目录组内5个人都往里写配额只统计这5个人共同消耗的总量。这比单独给每个人限制更有实际意义——项目组需要的是一个项目总盘子。项目配额是较新内核2.6.35引入的机制按目录维度管理目录打上project ID标签后不管哪些用户往里写都归到同一个配额账户里。适合托管目录、共享目录这种以目录为边界的管理模型。实务上最常用的组合是用户配额组配额同时启用。举例用户A限额2GB、用户B限额2GB同时A和B组成的组G限额3GB。这样既防止个人滥用也防止整个团队用爆公共盘。2.4 开启配额对文件系统有什么要求不是随便一个分区就能直接开启配额的关键前提有三个文件系统类型要支持。ext3、ext4、xfs、btrfs都原生支持配额ext4和xfs是生产环境中最稳的选择。老旧的ext2也可以但没必要。FAT32/NTFS这类文件系统在Linux下挂载的话配额支持很弱建议不要折腾。必须挂载在独立分区上。配额是一个文件系统级别的特性不能跨多个挂载点统一配额。你如果只给/home配了配额用户把数据塞到/data下配额管不着。所以规划配额之前先想清楚哪些目录需要配额最好一开始就把它们单独分区。挂载参数要带上配额开关。ext4需要usrquota和/或grpquota挂载选项xfs比较特殊配额是文件系统自带的特性挂载时需要uquota/gquota或prjquota参数不同发行版写法略有差异。注意改挂载选项要写入/etc/fstab并正确重挂载或重启否则重启后配额状态会丢失。xfs格式的配额文件在挂载时是不能直接使用quotacheck等传统命令的操作方式不同这个后文细说。3. 实操前准备分区、挂载点、工具安装3.1 推荐的环境与版本基准我后面写的所有步骤都是基于主流的RHEL/CentOS 7/8/9 或 Ubuntu 20.04/22.04 环境内核版本4.x及以上文件系统以ext4为主xfs部分单独说明。如果你用的是老系统命令参数可能会有细微差别但整体流程不变。先说一个实用判断拿到一台机器做配额之前先跑一下df -hT看清楚当前分区和文件系统类型。见过太多人不管三七二十一先装quota工具装完发现要配额的分区是xfs手忙脚乱。先看环境再动手能省一半排查时间。3.2 安装quota工具包quota工具在绝大多数发行版的基础仓库里都有# CentOS / RHEL / Rocky yum install -y quota # Ubuntu / Debian apt install -y quota # 新一点的系统可能要用 dnf dnf install -y quota装完之后验证一下rpm -qa | grep quota dpkg -l | grep quota如果这条命令没有输出说明没装上。此外建议顺手装一个ncdu或du习惯后面核对配额用量的时候要用到。3.3 准备好一个独立分区硬性条件为了演示我们假设机器上有一块独立磁盘/dev/sdb1挂载在/data目录专门用于多用户共享文件。先把分区格式化mkfs.ext4 /dev/sdb1如果有现成的/home独立分区也可以直接拿它演示。但不管用哪个你绝对不能对根分区/做配额操作实践因为根分区一旦配额配置失误很可能导致系统起不来或用户登录异常。演示环境怎么折腾都行生产环境务必小心。格式化完成后创建挂载点并挂载mkdir -p /data mount /dev/sdb1 /data df -h /data3.4 修改fstab让配额开关永久生效很多教程会教你先手动改挂载参数挂载一遍再来说fstab。我建议直接一步到位编辑/etc/fstab加上配额选项然后用mount -o remount重挂载。这样不重启也能生效而且重启后配置不会丢。以/dev/sdb1 /data为例fstab里的写法是/dev/sdb1 /data ext4 defaults,usrquota,grpquota 0 0usrquota表示启用用户配额grpquota表示启用组配额。如果你只需要用户配额只写usrquota即可如果两个都需要就都写上别漏。改完fstab后执行mount -o remount /data然后确认挂载参数已经生效cat /proc/mounts | grep /data输出里能看到usrquota,grpquota字样就说明挂载参数带上了。如果fstab写错了这个命令可能报错系统会提示你重新检查。千万别跳过这一步去重启重启后发现系统起不来再去改fstab那就被动了。提示如果是xfs文件系统fstab里的挂载选项通常写uquota,gquota或者usrquota,grpquota在新内核同样识别xfs下的配额文件是作为文件系统内部元数据自动管理的不需要手动创建aquota.user等文件。3.5 确认内核是否支持配额绝大多数发行版内核都默认打开了配额支持但保险起见可以确认一下grep -i quota /boot/config-$(uname -r)能看到类似CONFIG_QUOTAy、CONFIG_QUOTACTLy、CONFIG_QUOTA_NETLINK_INTERFACEy的输出就行。如果这些配置项是m或没有需要重新编译内核或换个内核版本。这个步骤在标准云镜像上几乎从没出过问题但检查成本极低顺手做没坏处。4. 初始化配额数据库并设置用户/组配额4.1 创建配额文件quotacheckext文件系统启用配额后系统需要在文件系统根目录维护配额记录文件传统上是aquota.user和aquota.group新版系统也支持quota.user但aquota系列最通用。初始化命令quotacheck -cug /data参数解释-c创建配额文件如果不存在-u启用用户配额检查-g启用组配额检查-v显示详细过程可选但推荐能看到每个文件系统的处理情况你可以在/data目录下用ls -l确认ls -l /data/aquota.user /data/aquota.group如果跑完quotacheck报错“Cannot find quota file”或者“Permission denied”多半是前面挂载参数没生效或者SELinux在拦。解决办法后面第7节会单独讲。4.2 首次扫描的作用与注意事项quotacheck的机制是遍历文件系统里每个文件的属主和所属组把所有已占用空间和inode数据汇总写入配额文件。在已有大量数据的目录上首次启用配额这一步是必须的因为系统此前并不知道每个用户已经消耗了多少。这里有一个关键的运维经验对线上正在服务的数据目录执行quotacheck要在业务低谷期做最好先卸载或只读挂载在做。因为扫描期间文件的变化可能导致配额记录和实际不一致。生产实例如果实在不能停机可以接受短暂的不一致跑完后再用quotacheck重扫一次。但千万别在配额文件生成过程中贸然重启。4.3 用edquota交互式为单个用户设置配额创建好配额数据库之后给用户zhangsan设置配额edquota -u zhangsan这条命令会打开一个文本编辑器界面内容类似Disk quotas for user zhangsan (uid 1001): Filesystem blocks soft hard inodes soft hard /dev/sdb1 104 12 24 7 3 5各列含义blocks该用户当前已占用的块数每块大小在挂载参数里确定默认1KB单位显示soft/hard空间块软限制和硬限制inodes该用户当前已创建的文件/目录数量soft/hard右侧两列inode的软限制和硬限制注意编辑时左右两组soft/hard要对应清楚左侧是存储空间、右侧是文件数量。我自己第一次配置时就搞混过把文件数硬限制当成空间限制了害得用户没法建目录反而可以随便写数据——这错得很隐蔽。把数字改好保存退出。比如要限制空间2GB硬限制2048MB即2048个1KB单位不对这里单位是1K blocks2GB要写成2048000个1K block稍微算一下和文件数10000个Filesystem blocks soft hard inodes soft hard /dev/sdb1 104 1843200 2048000 7 9000 10000这里就是单位换算的关键坑1K blocks进位的单位是KB2048000个单位是2048000KB约2GB实际2,048,000KB 1.95GB但四舍五入可接受。我建议直接按KB来换算2GB 2 × 1024 × 1024 2097152 KB但写的时候注意2048000和2097152就差一点分区大小足够就行设置成整数比较方便管理。我的习惯是用2048000这种整数因为看着直观。4.4 批量设置配额从参考用户复制如果用户数量多一个个edquota显然低效。edquota提供了-p参数可以把一个参考用户的配额原样复制给其他用户edquota -p zhangsan lisi wangwu这样lisi和wangwu就复制了zhangsan的配额设置。对几十个用户批量初始化时非常方便。更彻底的方式是写个循环脚本结合setquota命令非交互设置for user in zhangsan lisi wangwu; do setquota -u $user 1843200 2048000 9000 10000 /data donesetquota的参数顺序是-u 用户名 软块数 硬块数 软inode数 硬inode数 文件系统。所有值都是数字单位是1KB块/个。4.5 配置组配额组配额设置方式和用户配额几乎一样只是-u换成-gedquota -g project_team组配额默认会统计该组所有成员写入的块数总和。假设project_team组里有5个人你给组配额设了10GB硬限制那么这5个人加在一起最多写到10GB。这里有个重点用户配额和组配额是叠加生效的。比如用户A个人硬限制2GB组G硬限制3GB那么A的写入受“两者中先命中的那个”约束。他写到2GB会撞到用户硬限制但整个组才消耗了1.5GB组配额还没触发。反之如果A已经写了1GB组里其他人写了2.5GB组硬限制已经触发A即使个人没用完也写不进去。这种双维度限制在项目制环境里非常好用但要跟用户解释清楚规则不然会被骂“为什么我限额还没到就写不进去了”。4.6 设置宽限期宽限期的默认值是7天如果你觉得太长或太短可以改edquota -t界面会显示类似Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sdb1 7days 7days改成3天/dev/sdb1 3days 3days宽限期只对软限制有意义。如果你直接设置硬限制宽限期对它完全无效——硬限制从生效那一刻起就不可逾越。5. 配额状态查看与配额报告5.1 用quota命令查单用户用量切换成普通用户身份执行quota -u zhangsan输出类似Disk quotas for user zhangsan (uid 1001): Filesystem usage quota limit grace files quota limit grace /dev/sdb1 104K 1843200K 2048000K 7 9000 10000这里的quota列对应软限制limit列对应硬限制。用户自己也可以执行这个命令看自己用了多少。如果某个用户进入了grace期输出里会显示剩余时间一眼就能看出他是不是“踩线”了。5.2 用repquota生成全体配额报告运维视角下最常用的命令其实是repquotarepquota -a-a表示报告所有启用了配额的文件系统。输出*** Report for user quotas on device /dev/sdb1 Block grace time: 3days; Inode grace time: 3days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 215424 0 0 5500 0 0 zhangsan -- 104 1843200 2048000 7 9000 10000 lisi - 4096 102400 2048000 2days 12 9000 10000注意第二行zhangsan前面的标记--代表一切正常没有超过软限制-代表空间或inode超了软限制但硬限制还没到正在grace期内-同理只是方向不同代表软硬限制都超了比如lisi那行出现了-和2days说明他已经超过了块软限制还剩2天宽限期。这种输出非常适合写脚本监控如果报告中出现非--的行就告警通知管理员查看。5.3 用quotacheck重新校正配额数据配额数据是动态维护的正常情况下每次写入都会实时更新。但偶尔会遇到配额记录和实际不符的怪问题比如用户copy了文件但配额统计没变或者明明删了大量文件配额占用却不降。这时重新跑一次quotacheck就能校正quotacheck -avug-a检查所有配额文件系统-v打印详细过程。跑完后配额记录会和实际用量重新对齐。这个命令本身有开销文件越多、体量越大耗时越长。建议在文件系统变化不频繁的窗口期跑比如深夜定时任务。6. xfs文件系统配额配置的特异性6.1 为什么xfs不能照抄ext4的步骤很多人在xfs上执行quotacheck会得到类似quota not enabled on filesystem的报错或者直接卡死原因在于xfs的配额机制和ext系完全不同。xfs从诞生起就把配额作为文件系统内建的“日志型”功能配额信息通过挂载参数直接开启不需要外部配额文件因此也不存在aquota.user这种文件。xfs的挂载选项常见写法是/dev/sdb1 /data xfs defaults,uquota,gquota 0 0其中uquota用户配额gquota组配额。老内核版本也接受usrquota,grpquota但新版xfs更推荐直接用uquota,gquota。挂载后在xfs文件系统上设置配额也有专门工具xfs_quota -x -c limit bsoft1843200 bhard2048000 isoft9000 ihard10000 -u zhangsan /data参数分解-x进入专家模式-c执行命令limit bsoft1843200 bhard2048000设置块软限制/硬限制isoft9000 ihard10000设置inode软限制/硬限制-u zhangsan针对用户/data目标文件系统查看xfs配额报告的指令是xfs_quota -x -c report -u /data输出和repquota类似同样能列出每个用户的使用量、软硬限制和grace状态。6.2 ext4和xfs配额管理的差异对照我列一个简单的对照表方便你判断自己该按哪套流程走对比项ext3/ext4xfs是否生成磁盘配额文件存在aquota.user/aquota.group不生成外部文件由元数据管理是否需要quotacheck需要用于初始化和校正不需要底层扫描配额信息可靠启用挂载参数usrquota,grpquotauquota,gquota/prjquota配额设置命令edquota / setquotaxfs_quota -c limit ...配额报告命令repquota / quotaxfs_quota -c report ...日志型一致性一般扫描校正强日志记录适合规模中小型单机/家庭服务器企业级/大容量/高并发如果你用的是新版CentOS/Rocky默认安装的xfs根文件系统想给home目录配配额直接走xfs路线别再折腾edquota了。但传统ext4环境在所有旧文档和老教程里还是绝对主流两种都掌握才不会被卡住。7. 常见问题排查与实战避坑技巧7.1 quotacheck报错Cannot find quota file或Operation not permitted这两类报错出现时最先怀疑的方向不是quota工具本身而是挂载参数或SELinux。排查顺序# 确认挂载参数是否带上了 mount | grep /data # 确认fstab是否写对 cat /etc/fstab | grep /data # 临时禁用SELinux测试排查用 setenforce 0 quotacheck -cug /data如果setenforce 0后要再次测试出问题看ausearch -m avc -ts recent | grep quota确认是否被SELinux拦截。真正的修复方法是调整SELinux布尔值或文件上下文而不是长期关闭SELinux。quota相关目录的SELinux类型通常需要设为quota_db_trestorecon -Rv /data但最直接的做法是给挂载目录设置正确的上下文。这个知识点容易被人忽略因为默认SELinux策略下普通数据目录的上下文不是quota专用类型导致写aquota文件被拒。7.2 配额已设但用户仍能无限写入这类问题是我在群里看到提问频率最高的。原因通常是下面几种挂载参数根本没带上配额标志。检查/proc/mounts输出如果只有defaults而没有usrquota,grpquota配额功能形同虚设。配额作用于了错误的分区。用户把文件写到了另一个没开配额的分区上配额当然管不到。比如你只在/data开了配额用户的$HOME在/home且没开配额他把数据放到家目录就绕过了所有限制。软限制设置得太大或忘记了硬限制。有些人只设了软限制没设硬限制宽限期一过系统可能直接拒绝——但这个“可能”取决于版本和配置。老版本在宽限期结束后才会把软限制变硬限制如果你的版本行为不是这样就会看起来“没限制”。用户是root。root用户默认不受配额限制这是设计如此不要花时间去“修复”。逐一排查时别忘了看quota -u 用户名的实际输出。有时候你以为设置了实际上没保存成功。7.3 删除文件后配额用量不下降这个情况很多人遇到以后第一反应是系统坏了其实大概率不是。原因在于配额统计的是块占用不是文件数量并且块是预分配的。举个例子用户写了一个100GB的稀疏文件比如dd创建大文件然后seek跳着写文件系统可能预分配或稀疏映射了很多块。删除部分文件后如果还在硬限制之上写入依然被拒看起来就是“我删了但还是写不进去”。另一个常见情况是文件被进程持续占用。用户删了文件但因为某个服务还持有文件句柄磁盘空间并没有真正释放进程内read/write不会中断。这种情况你可以这样确认lsof L1 | grep deleted看到still open的deleted文件就知道是哪个进程占了。杀掉对应进程或重启服务后空间才真正归还。7.4 重启后配额丢失重启后配额丢失几乎可以确定是fstab没有修改或者挂载参数没有正确写入。有些人图省事只手动mount时带了参数重启后系统按fstab默认配置挂载配额开关自然没了。排查cat /etc/fstab | grep /data如果fstab里没配额选项重新编辑并重启或者重新mount -o remount。还有一个细节是老旧的Linux版本fstab中连续挂载参数之间不能有空格写成defaults,usrquota,grpquota而不是defaults, usrquota, grpquota否则重启时解析会出问题。7.5 生产环境第一次启用配额的操作节奏这个属于经验篇了。生产环境第一次启用配额我建议的节奏是先在测试机上完整走一遍全流程记录每个命令的实际输出找业务低谷窗口备份数据或做快照修改fstab添加配额挂载选项执行mount -o remount观察系统日志dmesg | tail确认挂载成功无报错执行quotacheck -cugm /data其中-m是“不阻止写入”的强制模式适合在线执行虽然我还是推荐短时只读挂载更稳用edquota/setquota批量设置配额用repquota -a核对数据是否准确观察24小时确认无异常后再把流程纳入常规维护手册7.6 监控配额使用率的实用脚本思路配额管理不能设完就撒手不管建议写个简单的告警脚本放到cron里。我用得最多的核心逻辑是解析repquota的输出找到超过软限制的用户并发送通知一个bash函数就够repquota -a | awk $3 ~ /[0-9]/ $3 $4 {print $1, $2, $3, $4}这段的意思是输出文件中第三列used超过第四列soft limit的记录。你把它接入短信或钉钉webhook就成一个最小可用的配额告警系统。当然生产环境用成熟监控平台如zabbix、prometheusnode_exporter更正规但这个“做壳”思路能帮你快速发现问题。8. 一个小众但在多项目环境非常实用的扩展项目配额上文提了一句project quota这里展开说一下。传统的用户/组配额在“一个用户参与多个项目”的场景里会失控一个用户分了2GB总配额但他可能给项目A、项目B、项目C各写了1GB加在一起自己先撞了墙项目之间的隔离也没做到。项目配额project quota把“谁写”变成“写到哪里”以目录为维度做限制。典型操作# 对目录打项目ID标签 mkdir -p /data/proj_a chattr -R p /data/proj_a # 打开project属性非所有文件系统支持ext4需要内核CONFIG_EXT4_FS_PROJECTy # xfs上直接分配prjquota xfs_quota -x -c project -s -p /data/proj_a proj_a /data xfs_quota -x -c limit -p bhard10g proj_a /dataext4项目配额的配置流程相对繁琐而且需要内核编译支持。我自己的经验是如果你想用目录维度配额直接选xfs别在ext4上硬磕省心太多。xfs的项目配额是RHEL/CentOS特意在系统安装时预置了prjquota支持生产上非常稳。项目配额有一个附带的好处即使权限上不同用户混写同一个目录项目配额也能统一算总账非常适合临时拉人进项目又不想逐个改用户配额的协作环境。9. 我踩过几次坑之后的最终体会说实话磁盘配额本身并不难大部分坑都出在文件系统类型判断错误和挂载参数没有真正生效这两件事上。我给新手的忠告是上手之前先用df -hT认清楚文件系统再决定走ext4流程还是xfs流程改完fstab后不要偷懒跳过mount -o remount加cat /proc/mounts验证这两个动作加起来不过几秒钟却能在配额全流程里省掉成小时的排查。另外配额始终是管理工具不是存储备份。它只能防止单点用户撑爆磁盘不能替你处理误删、病毒、磁盘物理故障。真正重要的业务目录配额要和监控告警、定期快照、定期巡检配合起来才是一套比较完整的数据保护方案。如果你目前只是在一台小服务器上给几个同事分空间按照第4节的流程配好用户配额就足够了没必要一开始就上项目配额。真到了多项目、多目录、多人交叉写入的规模再切xfs项目配额完全不迟。配额这东西配好之后平时几乎感觉不到它存在但一旦有人把整盘写满你会庆幸当初花了一个下午把这事儿做完了。
返回列表