问题背景
2026 年 8 月底,公司核心堡垒机(跳板机)上线后,运维账号收口进入收尾阶段。所有生产服务器的直连 MySQL/SSH 端口已通过跳板白名单收敛,现场 DBA 与应用运维只能通过堡垒机操作。
9 月 1 日凌晨 03:17,监控告警突然涌入:「堡垒机根分区使用率 100%」「journalctl 命令卡死」「systemctl status 全部超时」。此时正值双节前变更窗口,任何服务中断都可能影响次日业务恢复演练。
堡垒机采用 Rocky Linux 9.4 + systemd 252,journald 默认配置,历史从未出现过日志写满问题。为什么突然在凌晨暴发?
故障现象
- 根分区写满:
df -h /显示/dev/mapper/rl-root已用 48G/48G(100%),可用 0。 - journalctl 完全失效:执行
journalctl -u sshd直接卡死,无任何输出,Ctrl+C 也无响应。 - systemctl 全部超时:
systemctl status、systemctl list-units全部卡在「systemd-journald」等待。 - 堡垒机 Web 界面无法登录:堡垒机自身也通过 systemd 管理,journald 卡死导致认证日志无法写入,Web 登录接口直接 502。
- 仅影响堡垒机:其他生产服务器(MySQL/Redis/K8s 节点)均正常,确认是单机问题。
此时已无 SSH 登录堡垒机,只能通过 IPMI/iLO 进入紧急模式(单用户模式)排查。
排查过程
步骤 1:紧急模式下确认磁盘占用
通过 IPMI 进入单用户模式后,先检查大文件:
|
|
确认罪魁祸首是 systemd journal 日志目录,占用整个根分区。
步骤 2:检查 journald 配置与 RateLimit
|
|
关键配置:
|
|
RateLimit 已被注释!默认值 RateLimitBurst=10000、RateLimitInterval=30s 形同虚设。
步骤 3:检查近期崩溃的服务
|
|
发现 8 月 31 日 23:50 开始,堡垒机上的「堡垒机 Agent」(自研 Python 服务,负责审计日志转发与命令录像)出现连续崩溃:
|
|
该服务配置:
|
|
致命组合:Restart=always + RestartSec=1 + StartLimitBurst=100 导致 60 秒内 100 次崩溃循环,每秒写 100+ 条 journal 日志,瞬间打满磁盘。
步骤 4:验证日志轮转缺失
|
|
journald 默认只保留一个 system.journal,没有配置 SystemMaxFiles 与 MaxFileSec,导致单文件无限增长。
解决方案
紧急止血(单用户模式)
- 停止崩溃服务,防止继续写日志:
|
|
- 清理 journal 日志(保留最近 2 天):
|
|
- 重启 journald,使配置生效:
|
|
- 验证 journalctl 恢复:
|
|
根治配置(持久化)
编辑 /etc/systemd/journald.conf:
|
|
编辑 /etc/systemd/system/fortress-agent.service(关键):
|
|
重载 systemd 并重启服务:
|
|
验证与监控
- 确认 journald 不再无限增长:
|
|
- 添加 Prometheus 监控(堡垒机已有 node_exporter):
|
|
- 堡垒机 Agent 增加健康检查与退出码规范:非致命错误(网络抖动)返回 0,致命错误(配置错误)返回 1,避免
Restart=always无限循环。
根因分析
直接原因:堡垒机 Agent 在 8 月 31 日 23:50 因堡垒机白名单收口后「审计日志转发接口 403」导致持续崩溃,Restart=always + RestartSec=1 触发 100 次/分钟的 journal 写入风暴,单文件无上限增长打满根分区。
深层原因:
- journald 默认配置「宽松」:RateLimit 被注释,SystemMaxUse 未限制,日志轮转缺失。
- 服务配置「激进」:
Restart=always + RestartSec=1在生产环境极度危险,一旦崩溃即日志雪崩。 - 缺少「变更门禁」:堡垒机 Agent 上线后,未在白名单收口场景下做兼容性测试,直接暴露在生产环境。
预防措施
- journald 硬配额:所有生产服务器统一配置
SystemMaxUse=2G、MaxFileSec=1day,防止单服务刷屏。 - 服务重启策略收紧:
Restart=on-failure+RestartSec≥10+StartLimitBurst=5,关键服务必须加StartLimitAction=reboot(最后手段)。 - 日志监控前置:Prometheus + Alertmanager 监控
node_filesystem_avail_bytes与journalctl --disk-usage,阈值 80% 即告警。 - 变更演练门禁:堡垒机/Agent 类「基础设施变更」必须在「白名单收口」场景下做 48 小时灰度演练,确认无日志风暴后再全量。
- 应急手册:更新「根分区写满应急手册」,明确「单用户模式 → journalctl –vacuum-time → journald.conf 硬配额」三步走流程,演练频次每季度一次。
总结
一次「堡垒机 Agent 403 错误」引发的服务崩溃,本应是「小事」,却因 journald 配置缺失 + 服务重启策略激进,演变为「根分区写满 + 堡垒机全站瘫痪」的生产事故。
教训:基础设施服务(journald/systemd)必须「有上限、有节流、有监控」,任何「无限循环 + 无限制写入」都是定时炸弹。堡垒机作为「最后一道门」,更应在变更前做「最坏场景演练」。
下次堡垒机白名单收口变更前,将先执行「journald 配额 + Agent 重启策略收紧 + 48 小时灰度」三道门禁,确保不再重演。