/var/log目录写满问题
1核1G开发版 /var/log 目录写满问题终极排查与解决
一、问题现象(重启后)
重启系统后,发现 /var/log 仍然被写满:
/dev/zram0 124M 119M 0 100% /var/log- zram 是压缩内存盘,
/var/log挂载在 zram 上 - 可用空间为 0,导致系统异常
二、当前配置检查
2.1 journald 配置
grep -E -v "^\s*(#|$)" /etc/systemd/journald.conf[Journal]
Storage=volatile
Compress=no
SyncIntervalSec=0
RuntimeMaxUse=40M
RuntimeMaxFileSize=10M
ForwardToSyslog=no
ForwardToWall=no2.2 rsyslog 配置
grep -E -v "^\s*(#|$)" /etc/rsyslog.confmodule(load="imuxsock")
module(load="imklog")
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$WorkDirectory /var/spool/rsyslog
$IncludeConfig /etc/rsyslog.d/*.conf
auth,authpriv.* /var/log/auth.log
kern.crit;kern.emerg /var/log/kern.crit
*.emerg :omusrmsg:*
*.* stop- rsyslog 已最小化配置,只记录 auth 日志和内核紧急日志
- 其他日志已被
*.* stop丢弃
三、问题定位
3.1 查看 /var/log 占用详情
du -sh /var/log/* | sort -h输出显示:
0 /var/log/alternatives.log
0 /var/log/bootstrap.log
0 /var/log/btmp
...
20K /var/log/kern.log
24K /var/log/messages
40K /var/log/pbsbc01h3-hardware-monitor.log
52K /var/log/auth.log
68K /var/log/syslog
92K /var/log/daemon.log
119M /var/log/journal # ← 罪魁祸首!3.2 查看文件大小排序
ls -lhS /var/log/ | head -20total 400K
-rw-r----- 1 root adm 90K May 25 14:13 daemon.log
-rw-r----- 1 root adm 66K May 25 14:13 syslog
-rw-r----- 1 root adm 50K May 25 14:22 auth.log
-rw-r--r-- 1 root root 40K May 25 14:24 pbsbc01h3-hardware-monitor.log
...
drwxr-sr-x+ 3 root systemd-journal 4.0K Apr 2 10:36 journal # 目录占用119M3.3 检查 auth.log 内容
tail -100 /var/log/auth.log
grep "Failed password" /var/log/auth.log | wc -l输出显示:
- 只有正常的 CRON 和 SSH 登录日志
- 没有失败的密码尝试(0 次)
- auth.log 只有 50KB,不是问题根源
3.4 检查 kern.crit 是否存在
ls -lh /var/log/auth.log /var/log/kern.critls: cannot access '/var/log/kern.crit': No such file or directory
-rw-r----- 1 root adm 50K May 25 14:22 /var/log/auth.logkern.crit文件不存在,说明没有内核紧急日志产生
四、根本原因
问题根源:/var/log/journal/ 目录占用了 119MB,几乎耗尽所有空间。
虽然配置了 Storage=volatile,但:
Storage=volatile的语义是:优先使用内存,但如果/var/log/journal/目录已经存在,journald 会继续使用它- 之前持久化日志留下的目录未被删除,导致配置未真正生效
五、解决方案
5.1 立即修复步骤
# 第1步:停止 journald 服务
sudo systemctl stop systemd-journald
# 第2步:删除磁盘上的持久化日志目录(关键步骤)
sudo rm -rf /var/log/journal/
# 第3步:重启 journald 服务
sudo systemctl start systemd-journald
# 第4步:验证修复结果
df -h /var/log/
ls -la /var/log/journal/ # 应该不存在
ls -la /run/log/journal/ # 应该存在(内存日志)5.2 验证配置生效
# 查看磁盘日志目录(应该不存在)
ls -ld /var/log/journal 2>/dev/null || echo "✅ 磁盘日志已删除"
# 查看内存日志目录(应该存在)
ls -ld /run/log/journal && echo "✅ 内存日志正常"
# 查看内存日志占用
du -sh /run/log/journal/
# 查看 /var/log 总占用
df -h /var/log/六、修复结果
6.1 执行过程
root@pbsbc01h3:~# systemctl stop systemd-journald
Warning: Stopping systemd-journald.service, but it can still be activated by:
systemd-journald-dev-log.socket
systemd-journald-audit.socket
systemd-journald.socket
root@pbsbc01h3:~# rm -rf /var/log/journal/
root@pbsbc01h3:~# systemctl start systemd-journald
root@pbsbc01h3:~# df -h /var/log/
Filesystem Size Used Avail Use% Mounted on
/dev/zram0 124M 428K 115M 1% /var/log
root@pbsbc01h3:~# ls -la /var/log/journal/
ls: cannot access '/var/log/journal/': No such file or directory
root@pbsbc01h3:~# ls -la /run/log/journal/
total 0
drwxr-sr-x+ 3 root systemd-journal 60 May 25 14:23 .
drwxr-xr-x 3 root root 60 May 25 14:23 ..
drwxr-s---+ 2 root systemd-journal 80 May 25 14:23 0dcde7aa16b74be582748e1f014594f3
root@pbsbc01h3:~# du -sh /run/log/journal/
16M /run/log/journal/6.2 修复前后对比
| 检查项 | 修复前 | 修复后 | 状态 |
|---|---|---|---|
/var/log 占用 | 119MB (100%) | 428KB (1%) | ✅ 完美 |
/var/log/journal/ | 119MB 磁盘日志 | 不存在 | ✅ 已删除 |
/run/log/journal/ | 无 | 16MB 内存日志 | ✅ 正常工作 |
| zram 使用率 | 100% | 1% | ✅ 已释放 |
6.3 警告说明
停止 journald 时的警告是正常的:
Warning: Stopping systemd-journald.service, but it can still be activated by:
systemd-journald-dev-log.socket这表示 journald 的 socket 接口仍在监听,但服务已停止。执行 rm -rf 后再启动,完全不影响功能。
七、关于 --show-config 不支持的处理
旧版本 systemd 不支持 --show-config 参数:
journalctl --show-config | grep -i storage
# journalctl: unrecognized option '--show-config'替代验证方法:
# 方法1:查看配置文件
grep -E "^Storage|^Runtime" /etc/systemd/journald.conf
# 方法2:使用 systemd-analyze(如果支持)
systemd-analyze cat-config systemd-journald.conf | grep -E "^Storage|^Runtime"
# 方法3:验证 volatile 模式是否生效
ls -la /run/log/journal/ && echo "✅ 内存模式正常"八、最终配置总结
8.1 journald 配置 (/etc/systemd/journald.conf)
[Journal]
Storage=volatile # 只存内存,不写磁盘
RuntimeMaxUse=40M # 内存上限 40MB
Compress=no # 不压缩,省 CPU
ForwardToSyslog=no # 不转发到 rsyslog
RateLimitIntervalSec=10s # 防刷屏
RateLimitBurst=2008.2 rsyslog 配置 (/etc/rsyslog.conf)
# 只记录认证日志和内核紧急日志
auth,authpriv.* /var/log/auth.log
kern.crit;kern.emerg /var/log/kern.crit
*.emerg :omusrmsg:*
*.* stop # 丢弃所有其他日志8.3 关键操作总结
- 停止 journald:
systemctl stop systemd-journald - 删除磁盘日志目录:
rm -rf /var/log/journal/⭐ 关键步骤 - 重启 journald:
systemctl start systemd-journald - 验证:
df -h /var/log/
九、日常维护建议
9.1 监控命令
# 实时监控 /var/log 目录大小
watch -n 60 'df -h /var/log/ && echo "---" && du -sh /run/log/journal/'
# 查看内存日志占用
du -sh /run/log/journal/
# 检查磁盘日志是否重建
ls -la /var/log/journal/9.2 定期清理 rsyslog 日志(可选)
# 每月清理一次
sudo truncate -s 0 /var/log/{auth.log,daemon.log,syslog,messages,kern.log} 2>/dev/null9.3 查看日志
# 查看本次启动的所有日志(内存中)
journalctl -b
# 查看错误级别日志
journalctl -p err -b
# 实时跟踪
journalctl -f十、注意事项
- Storage=volatile 的陷阱:如果
/var/log/journal/目录已存在,journald 会继续使用磁盘,而不是切换到内存。必须先删除该目录。 - 重启后日志丢失:volatile 模式下,重启后所有历史日志都会丢失,这是正常行为。
- 内存占用:日志占用内存(当前 16MB,上限 40MB),对 1GB 内存影响很小(<4%)。
- 警告信息可忽略:停止 journald 时的 socket 警告是正常的,不影响功能。
十一、验证清单
- [x]
/var/log/journal/目录已删除 - [x]
/run/log/journal/目录存在且有内容 - [x]
/var/log占用从 119MB 降到 428KB - [x] zram 使用率从 100% 降到 1%
- [x] journald 正常记录日志(内存中)
- [x] rsyslog 只记录 auth.log(约 50KB)
- [x] 系统可正常写入日志,不会爆满
十二、问题解决确认
每天中午12点 /var/log 满的问题已彻底解决!
- ✅ journald 日志全部在内存(16MB,上限40MB)
- ✅ 磁盘日志目录已被删除且不会重建
- ✅ zram 占用仅 428KB,剩余 115MB 可用
- ✅ 磁盘 IO 显著降低,SD 卡寿命延长
- ✅ 系统日志功能正常工作
文档版本:2.0
最后更新:2026-05-25
适用环境:Debian/Ubuntu 开发板,1核1G,zram 挂载 /var/log