Linux中journald不支持百分比空间限制,仅接受绝对大小(如SystemMaxUse=500M);可通过脚本动态计算/var分区比例并更新配置,再重启服务实现间接按比例控制。

Linux 中 journalctl 日志本身不支持按“磁盘分区比例”(如 10%)直接限制存储空间,journald 的配置项只接受绝对大小单位(如 M、G),不支持百分比语法(例如 SystemMaxUse=10% 是无效的,会报错或被忽略)。
但你可以通过组合配置 + 外部脚本,间接实现“按比例限制”的效果。下面分三类说明:真正可用的原生方式、实用的间接替代方案、以及常见误区澄清。
一、journald 原生只支持固定大小限制
编辑 /etc/systemd/journald.conf,启用并设置以下参数(取消注释 + 修改值):
Storage=auto
确保日志写入/var/log/journal/(持久化),而非仅内存/run/log/journal/SystemMaxUse=500M
限制所有持久化日志总大小上限(推荐值:建议设为/var分区容量的 5%~10%,需手动换算)SystemKeepFree=1G
强制保留至少 1GB 空闲空间,防止日志写满系统盘MaxRetentionSec=2week(可选)
配合时间维度兜底,避免单次突发日志撑爆空间
✅ 保存后必须重启服务:
sudo systemctl restart systemd-journald
⚠️ 注意:
SystemMaxUse=10%或SystemMaxUse=0.1这类写法不被识别,journald 会静默跳过或启动失败。
二、用脚本动态计算并设置比例上限(推荐做法)
若你希望真正按 /var 分区使用比例自动调整日志上限(比如始终占用不超过 8%),可编写一个简单脚本,定期更新 journald.conf 并重载:
#!/bin/bash
VAR_SIZE=$(df -B1 /var | awk 'NR==2 {print $2}')
TARGET_BYTES=$((VAR_SIZE * 8 / 100)) # 8% of /var
TARGET_HUMAN=$(numfmt --to=iec-i --suffix=B $TARGET_BYTES | sed 's/B//; s/Ki/KB/; s/Mi/MB/; s/Gi/GB/')
sed -i '/^SystemMaxUse=/c\SystemMaxUse='"$TARGET_HUMAN" /etc/systemd/journald.conf
systemctl restart systemd-journald然后加入定时任务(例如每天执行一次):
sudo crontab -e # 添加一行: 0 3 * * * /root/bin/update-journal-limit.sh
这样就能让日志上限随 /var 分区扩容/缩容自动适应。
三、不要依赖的“伪比例”方法
- ❌
journalctl --vacuum-size=10%:命令不支持百分比,会报错Invalid argument - ❌ 在
logrotate中轮转 journal 文件:/var/log/journal/是二进制数据库,不可直接用 logrotate 切割或删除,强行操作会导致损坏 - ❌ 仅靠
--vacuum-*命令:它是一次性清理,不能设“长期比例策略”,不重启 journald 也不会生效
四、验证是否生效
执行以下命令确认配置已加载且空间受控:
# 查看当前占用 journalctl --disk-usage # 查看生效的配置值 sudo systemd-analyze cat-config systemd/journald.conf | grep -E "^(Storage|SystemMaxUse|SystemKeepFree)" # 检查最早还能查到哪次启动(验证 MaxRetentionSec) journalctl --list-boots | head -5
不复杂但容易忽略。


















