systemd-journald日志空间问题
Linux systemd-journald 日志空间问题排查与配置笔记
一、环境信息
- 系统: Linux pbsbc01h3 5.4.65-sunxi #2.2.2 SMP Fri Mar 15 19:06:30 CST 2024 armv7l GNU/Linux
- 日志存储:
/var/log挂载在 zram 压缩内存盘上,总容量 128MB - 初始问题: 不到一天
/var/log使用率达到 100%
# 查看磁盘使用情况
df -h /var/log
# 输出: /dev/zram0 124M 122M 0 100% /var/log
# 查看日志占用
journalctl --disk-usage
# 输出: Archived and active journals take up 176.9M in the file system.二、问题诊断
1. 存储结构
zramctl
# NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
# /dev/zram1 lzo-rle 499.8M 4K 73B 4K 4 [SWAP]
# /dev/zram0 zstd 128M 121.5M 8.8M 9.5M 4 /var/log2. 日志占用详情
du -sh /var/log/* 2>/dev/null | sort -h| 占用 | 目录/文件 | 说明 |
|---|---|---|
| 121M | /var/log/journal | systemd 日志 ← 主要占用 |
| 276K | /var/log/wtmp | 登录记录 |
| 100K | /var/log/lightdm | 显示管理器日志 |
| 28K | /var/log/auth.log | 认证日志 |
| 28K | /var/log/daemon.log | 守护进程日志 |
| 12K | /var/log/user.log | 用户日志 |
| 8K | /var/log/syslog | 系统日志 |
| 其他 | 各种小文件 | 合计不足 1M |
结论: /var/log/journal 占用 121M / 128M,是问题根源。
三、原始配置及问题分析
原始配置
Compress=yes
SystemMaxUse=50M
SystemKeepFree=100M # ← 问题根源
SystemMaxFileSize=10M
SystemMaxFiles=4
RuntimeMaxUse=50M
RuntimeKeepFree=50M # ← 潜在问题
RuntimeMaxFileSize=10M
MaxRetentionSec=4day配置冲突说明
| 配置项 | 设定值 | 问题 |
|---|---|---|
SystemMaxUse | 50M | 要求日志最多占 50M |
SystemKeepFree | 100M | 要求磁盘至少空闲 100M |
/var/log 总容量 | 128M | 128M - 100M = 28M 可用给日志 |
实际效果: journald 优先满足 SystemKeepFree,导致日志实际上限被压缩到 28M,与 SystemMaxUse=50M 产生直接冲突。
四、解决方案
方案一:优化配置(推荐)
修改 /etc/systemd/journald.conf:
[Journal]
Compress=yes
SystemMaxUse=120M # 充分利用 128M 空间
# SystemKeepFree=100M # 注释掉或删除
SystemMaxFileSize=30M # 单文件 30M,减少文件数量
SystemMaxFiles=4
RuntimeMaxUse=20M # 运行时日志不需要太大
# RuntimeKeepFree=50M # 注释掉
RuntimeMaxFileSize=10M
MaxRetentionSec=2day # 从 4 天改为 2 天保守版配置(给其他日志留空间)
[Journal]
Compress=yes
SystemMaxUse=110M
SystemKeepFree=10M # 改成 10M 而不是 100M
SystemMaxFileSize=25M
SystemMaxFiles=4
RuntimeMaxUse=20M
RuntimeMaxFileSize=10M
MaxRetentionSec=2day立即生效命令
# 1. 编辑配置文件
nano /etc/systemd/journald.conf
# 2. 重启 journald 服务
systemctl restart systemd-journald
# 3. 强制清理到指定大小
journalctl --vacuum-size=120M
# 4. 验证效果
df -h /var/log
journalctl --disk-usage方案二:关闭 zram 日志存储(改用硬盘)
临时关闭(重启失效):
systemctl stop systemd-journal-flush.service systemd-journald
mount --bind /var/log.hdd /var/log
systemctl start systemd-journald永久关闭:编辑 /etc/default/armbian-ramlog
ENABLED=false方案三:扩容 zram(如果日志量确实很大)
编辑 /etc/default/armbian-ramlog 或 /etc/log2ram.conf:
SIZE=256M # 从 128M 改为 256M方案四:快速应急清理
# 立即清理日志腾出空间
journalctl --rotate --vacuum-size=50M五、关键配置参数说明
| 参数 | 作用 | 建议值(128M 分区) |
|---|---|---|
SystemMaxUse | 持久日志总大小上限 | 80-120M |
SystemKeepFree | 为其他用途保留的空闲空间 | 注释掉或设为 10M |
SystemMaxFileSize | 单个日志文件大小 | 20-30M |
SystemMaxFiles | 最多保留的文件数量 | 4 |
RuntimeMaxUse | 运行时日志(/run)上限 | 20M |
MaxRetentionSec | 日志最长保留时间 | 2-3 天 |
六、最佳实践总结
对于小容量分区(< 512M):
- ❌ 避免使用
SystemKeepFree和RuntimeKeepFree - ✅ 仅使用
SystemMaxUse控制日志上限 - ✅ 合理设置
MaxRetentionSec避免日志无限累积
- ❌ 避免使用
配置优先级:
- journald 会优先满足
KeepFree条件,而非MaxUse - 两者冲突时,
KeepFree胜出
- journald 会优先满足
监控建议:
# 定期检查日志大小 journalctl --disk-usage # 查看最占空间的日志来源 journalctl --list-boots journalctl -p err -b排查日志刷屏问题:
# 查看最近一分钟的日志数量 journalctl --since "1 minute ago" | wc -l # 查看最活跃的日志来源 journalctl --since "1 hour ago" | cut -d' ' -f5 | sort | uniq -c | sort -nr | head -10