服务器时间突然“倒退”五年怎么办?监控平台卡“启动中”、门禁集体离线的时钟回跳故障排查实录
导读
某天深夜,某企业视频监控平台突发故障:运维平台无法登录,管理中心页面永远停留在“启动中”,门禁子系统整屏设备离线,平台还弹出“数据库有故障”告警。更棘手的是,服务器的 root 密码已遗失,且 root 账号被平台安全策略禁止 SSH 登录。表面上是四五个互不相关的故障,实际排查后发现,绝大多数症状都指向同一个根因——服务器系统时钟回跳到了五年前的出厂时间。本文完整还原排查思路与处置过程,供同行参考。
一、现场环境与故障现象
| 项目 | 情况 |
|---|---|
| 平台类型 | 视频监控综合管理平台(Linux 服务器,原生服务 + 守护脚本架构) |
| 服务器配置 | 8 网口工控服务器 / 62G 内存 / 多块 LVM 数据盘(录像、图片、数据库、消息队列独立分区) |
| 承载业务 | 视频监控、门禁一卡通、报警联动;接入数十台门禁控制器与前端设备 |
| 故障现象① | 运维平台可登录,但管理中心一直显示“启动中”,无法进入 |
| 故障现象② | 平台告警“当前环境数据库有故障,请尽快修复” |
| 故障现象③ | 门禁设备全部离线,开关门功能失效,日志刷满设备登录失败(errCode=0x9) |
| 故障现象④ | root 密码遗失;SSH 仅允许 uid≥1000 的账号登录 |
初步盘点服务进程:Java 服务 28 个、守护(keeper)进程 67 个,均在运行;磁盘、内存、负载全部健康;门户 HTTPS 探测返回 200。“进程都活着,平台却起不来”——这种组合通常指向服务间通信/认证层面的问题,而不是资源或进程层面的问题。
二、排查过程
第一步:恢复登录通道(GRUB rd.break 重置 root 密码)
root 密码遗失,通过 GRUB 单用户方式重置。注意:该平台定制内核下常用的 rw init=/bin/bash 方式两次失败(内核 panic),最终采用 rd.break 方案成功:
1. GRUB 菜单按 e 编辑,linux16 行保留 ro,删除行尾 rhgb quiet,替换为:rd.break enforcing=0
2. Ctrl+X 启动,进入 switch_root:/# 提示符后依次执行:
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
exit
3. 自动重启(SELinux 重打标签阶段长时间黑屏属正常,切勿断电)
密码重置后 root 仍无法 SSH 登录。查 journalctl 发现真实原因不是密码,而是 PAM 加固策略:
pam_succeed_if (sshd:auth): requirement "uid >= 1000" not met by user root
平台安全加固禁止 uid<1000 的账号走 SSH(root 的 uid 为 0)。处置:新建普通运维用户,加入 wheel 组获得 sudo 权限,作为日常 SSH 通道;同时确认该机安全策略会在认证失败时直接 kill sshd 进程,故为其配置了保活定时任务:
# /etc/cron.d/sshd_keep
* * * * * root pgrep -x sshd >/dev/null || systemctl start sshd
第二步:发现时钟异常——所有症状的总根源
排查设备接入服务(门禁通信模块)日志时发现明显的时间线断裂:10 月底之前日志一切正常,随后时间戳突然跳回五年前的出厂日期,此后该模块开始周期性崩溃、门禁设备全部登录失败:
[10-29 01:18:00] [INFO] ... (正常时期的日志)
[01-05 23:48:18] [INFO] disk.go:697, update disk[/staticpic] free size success ... (时间已跳回五年前)
进一步用 timedatectl 核实:时区配置正确(Asia/Shanghai +0800),但本地时间比真实时间快了 8 小时,NTP 显示“已同步”而同步源竟是 LOCAL(0)——机器在跟自己对时,同步状态是假象。真实病根:主板 RTC 电池失效,断电/重启后时钟回落到出厂默认值,且无有效的外部 NTP 源兜底。
时钟错误解释了此前所有“灵异”现象:
| 症状 | 时钟回跳如何导致 |
|---|---|
| 管理中心卡“启动中” | 平台内部服务间通信全部走 HTTPS;系统时间早于证书生效期,TLS 握手全部被拒,服务注册与心跳上报失败,管理界面永远等不到“就绪” |
| 运维模块周期性崩溃 | 该 Go 原生模块的定时任务/会话在时间跳变后逻辑错乱,约每 40 分钟 crash 一次,被守护进程反复拉起 |
| 门禁设备全部离线(0x9) | 平台把错误时间自动同步给了所有门禁控制器;设备时间停留在五年前,平台证书在设备侧“尚未生效”,安全登录(SecurityLogin)双向认证被拒 |
| SSH 日志时间乱码 | 系统时间在多次重启间跳变,日志出现大量非法时间戳 |
第三步:修复时钟
timedatectl set-ntp false # 先关掉假同步,防止被顶回
date -s "<真实当前时间>" # 手动校准
hwclock -w # 写入硬件时钟,防止重启再丢
timedatectl # 复核 Local time 与手机时间一致
时间修正后重启设备接入服务(守护进程自动拉起),并用运维用户重启了平台全套服务。管理中心在时间修正后恢复正常进入,“有效期错误”类告警消失。
第四步:数据库故障——被停掉后无人拉起
平台告警“数据库有故障”。检查发现 MySQL 进程不存在,而错误日志末尾是一次干净的正常关闭(Shutdown complete),时间点恰与执行平台整体重启脚本的时间吻合。
深入排查启动链路发现两个事实:
1)平台的整体重启脚本(restartAll/startAll)确实包含启动 MySQL 的步骤(调用官方封装的 startMysql.sh),但故障当晚那轮启动是在系统时间错误期间执行的,MySQL 环节未能成功拉起;而 MySQL 本身不归 systemd 管、也没有独立的运行守护——停了就没人管。
2)机器重启(开机自启)层面,rc.local 中只有安装镜像加载逻辑,没有数据库启动项。
处置:用平台官方脚本手动拉起数据库(该脚本会处理目录属主、残留 socket 清理、文件句柄上限、分区维护,比裸跑 mysqld_safe 可靠),确认 Storage.err 出现 ready for connections、平台告警消除:
cd /opt/mysql/bin && ./startMysql.sh
# 验证:
ps -ef | grep mysqld | grep -v grep
tail -3 /opt/mysql/data/Storage.err # → 见 ready for connections
随后补上两道保险:
# 开机自启(写入 rc.local,sleep 等挂载就绪)
sleep 30; /opt/mysql/bin/startMysql.sh
# 运行中守护(/etc/cron.d/mysql_keep,每2分钟检查,挂了自动拉起)
*/2 * * * * root pgrep -x mysqld >/dev/null || /opt/mysql/bin/startMysql.sh
三、处置结果
| 项目 | 故障时 | 处置后 |
|---|---|---|
| 系统时间 | 回跳至五年前出厂时间,重启即漂移 | 已校准并写入硬件时钟,与真实时间一致 |
| 管理中心 | 永远“启动中”,无法进入 | 正常进入,各服务状态在线 |
| 数据库 | 进程缺失,平台告警“数据库故障” | 正常运行,已配开机自启 + 2 分钟级守护 |
| SSH 通道 | root 密码遗失 + PAM 禁 root 登录 | 新运维用户(wheel/sudo)+ sshd 保活,通道稳定 |
| 门禁设备 | 全部离线(0x9 认证失败) | 服务器侧已恢复;设备侧需批量校时(平台下发/设备 Web 页),校时后自动重连 |
| 消息队列/中间件 | 磁盘余量充足,无告警 | 正常 |
遗留事项(已向客户交底):1)更换主板 RTC 电池——时钟能回落到出厂默认值,电池基本确定失效,不更换则每次断电重启都会复发;2)配置可达的 NTP 源(有外网指公共 NTP,无外网在内网指定一台时间基准机),杜绝 LOCAL 假同步;3)门禁设备批量校时后复核平台设备在线率;4)服务器到部分设备网段的静态路由需固化到开机脚本。
四、可复用经验与避坑清单
1)“进程都活着但平台起不来”,先查系统时间。企业级平台内部通信普遍依赖 TLS 证书,时钟落在证书有效期之外会造成大面积、看似毫无关联的故障(页面卡启动中、设备集体掉线、模块周期崩溃)。一条 date 命令的成本远低于逐个模块排查。
2)NTP 显示 synchronized 不等于时间正确。同步源是 LOCAL(0) 就是机器在自我对时,属于假同步;核实时间要以 timedatectl 的源列表和真实时间对照为准。
3)时钟错误会“传染”给终端设备。平台会自动向摄像机、门禁控制器等设备下发时间同步,服务器时间错了,全场设备跟着错;修完服务器必须再批量校设备时间,否则设备侧证书校验依旧失败,表现为设备在线但业务不通、认证错误码刷屏。
4)数据库这类核心组件必须有双保险:开机自启 + 运行守护。平台自带的整体启停脚本在异常状态下(如本次时间错误期间)执行可能悄悄失败,且很多平台的数据库不归 systemd 管理,“脚本会拉起来”的假设不可靠,独立守护是底线。
5)重启数据库用平台官方封装脚本,不要裸跑 mysqld_safe。官方脚本处理了运行用户、目录属主、残留 socket、文件句柄上限、分区维护等细节,裸跑短期没事,长期埋雷。
6)被安全加固的机器,SSH 登录失败先看 PAM 再看 sshd_config。“uid >= 1000”这类 PAM 规则会精确拦截 root,而配置文件层面完全看不出异常;认证失败还可能触发安全策略直接杀掉 sshd,形成“越试越连不上”的假象。
7)GRUB 密码重置首选 rd.break enforcing=0,慎用 init=/bin/bash。定制内核 + 行尾 rhgb quiet 参数极易导致后者内核 panic;rhgb 不删除时会被 bash 当作脚本执行。
郑州晋元网络科技有限公司提供视频监控平台运维、故障排查、数据库救援、安全加固与等保合规等 IT 运维外包服务。如您的平台出现类似“服务都在运行但页面异常”“设备集体离线”“数据库无守护”等问题,欢迎联系评估。
官网:www.jyops.cn
了解运维服务