配置磁盘配额防日志堆积需先确认/var/log为独立分区,启用ext4/xfs配额支持,安装quota工具,修改fstab添加usrquota,grpquota并重挂载,运行quotacheck生成配额文件后quotaon启用;再为syslog等日志服务用户设硬性blocks和inodes限制,配合logrotate实现双保险。

配置系统磁盘空间配额防日志堆积导致拒绝服务,核心是给日志写入主体(如 syslog、www-data 等服务用户)在 /var/log 分区设硬性空间和文件数限制,让失控日志在填满磁盘前就被拦截——这不是替代 logrotate,而是加一道内核级保险。
先确认 /var/log 是否可配额
多数系统默认把 /var/log 和根分区共用,这没法安全设限。必须先检查:
- 运行
df -h /var/log,如果输出挂载点是/var/log(而非/),说明它是独立分区,可直接配置 - 如果显示挂载点是
/,别强行对根分区加配额——建议迁移:新建 ext4 分区(如/dev/sdb1),挂载到/var/log,再操作 - 确保文件系统为 ext4 或 XFS(
df -T /var/log查看);安装 quota 工具:sudo apt install quota(Debian/Ubuntu)或sudo dnf install quota(RHEL/Rocky)
启用 /var/log 分区的配额支持
配额不是开箱即用,得手动“激活”:
- 编辑
/etc/fstab,找到/var/log对应行,在挂载选项中加入usrquota,grpquota,例如:UUID=abc123 /var/log ext4 defaults,usrquota,grpquota 0 2 - 执行
sudo mount -o remount /var/log,再用mount | grep log确认输出含usrquota - 运行
sudo quotacheck -cugm /var/log(-c新建文件,-u/-g启用用户/组配额,-m忽略警告) - 检查是否生成:
ls -l /var/log/aquota.*应看到两个非空隐藏文件 - 启用:
sudo quotaon /var/log,再用sudo quotaon -p验证状态为on
给日志服务用户设硬限制
日志是进程写的,不是目录自己膨胀的。限制对象必须是实际写入者:
- 查关键用户 UID:
getent passwd syslog、getent passwd www-data、getent passwd mysql - 为每个用户设限额:
sudo edquota -u syslog,在编辑器中填入(单位 KB):
• blocks 行:soft 留空,hard 填524288(即 512MB)
• inodes 行:soft 留空,hard 填5500(防小文件刷爆 inode) - 同样操作设置
www-data、mysql等账户;不要设软限宽限期——拒绝服务场景下,超限必须立即阻断 - 保存退出即生效,无需重启;测试:
sudo -u syslog dd if=/dev/zero of=/var/log/test bs=1M count=600应报Disc quota exceeded
配合 logrotate 形成双保险
配额是兜底,logrotate 是日常治理。两者不冲突,缺一不可:
- 确保
/etc/logrotate.d/rsyslog、/etc/logrotate.d/nginx等配置存在且生效(可用sudo logrotate -d /etc/logrotate.conf调试) - 关键参数建议:
size 100M(比daily更防突发)、rotate 7(保留周粒度)、compress(节省空间)、postrotate ... reload ... endscript(确保服务重开日志句柄) - 验证效果:手动触发轮转
sudo logrotate -f /etc/logrotate.d/rsyslog,再检查/var/log/syslog*文件是否新增、旧文件是否压缩、inode 数是否回落











