3. 故障现场信息采集与保全
生产故障诊断的第一原则是“先保全现场,再动手修复”。RHEL 系统一旦发生内核崩溃、服务异常或性能骤降,内存中的日志缓冲、进程状态、网络连接、挂载信息都会随重启或时间推移而丢失。本节围绕“从哪里取证据、取什么、怎么取、如何避免破坏现场”展开,帮助你在故障窗口期内建立一份可回溯、可分析、可交付的证据链。
一、先明确证据来源与访问通道
RHEL 故障现场的证据通常分布在四个层面:内核层(dmesg、Kdump、/proc、/sys)、系统服务层(journalctl、systemd 状态)、用户与网络层(SSH 会话、ss、ip、ps)、以及整体快照层(sosreport)。访问这些证据的通道也分多种:本地控制台(tty/虚拟终端)、SSH 远程会话、串口控制台(serial console)、以及崩溃转储机制 Kdump。不同通道的可用性取决于故障类型——系统完全无响应时,SSH 往往已不可用,此时串口或本地控制台是唯一入口;内核 panic 时,Kdump 是唯一能保留内存现场的手段。
二、控制台与串口:最后的交互入口
当系统负载极高、sshd 无法 fork 新进程,或内核已进入不可调度状态时,SSH 会超时。此时应切换到本地控制台(Ctrl+Alt+F2 进入 tty2)或通过串口登录。串口控制台需要在 GRUB 中配置 console=ttyS0,115200n8,并在 BMC/iDRAC/ILO 中启用 Serial Over LAN。串口日志的价值在于:即使系统无法登录,内核和 systemd 的早期输出仍会持续打印到串口,这些输出往往包含 panic 前的最后线索。
在控制台上,优先执行只读命令,避免任何写操作。例如用 ps -eo pid,ppid,stat,wchan:32,cmd --sort=-%cpu | head -30 观察 D 状态进程及其内核等待通道(wchan),用 cat /proc/loadavg 和 vmstat 1 5 判断是 CPU 饱和还是 IO 阻塞。若怀疑文件系统只读,用 mount | grep ' ro,' 确认,不要急于 remount rw。
三、journalctl 与 dmesg:结构化日志与内核环形缓冲
journalctl 读取的是 systemd-journald 持久化或易失的日志。故障现场最常用的组合是:journalctl -b -1 -p err 查看上一次启动的错误级别日志,journalctl -b --since "2024-06-01 08:00" --until "2024-06-01 09:00" 按时间窗口过滤,journalctl -k -b 只看内核消息。注意:如果 /var/log/journal 不存在,日志仅存于内存,重启即丢失,因此故障后应第一时间执行 journalctl --flush 并考虑 journalctl -b > /tmp/journal_boot.txt 落盘。
dmesg 读取内核环形缓冲区,适合查看硬件报错、OOM killer、驱动加载失败、磁盘 IO 错误。常用参数:dmesg -T 显示人类可读时间戳,dmesg --level=err,warn 过滤级别,dmesg | grep -i -E "oom|killed process|I/O error|EXT4-fs error" 快速定位关键事件。dmesg 缓冲区有限,若日志已被覆盖,可尝试 journalctl -k -b -1 从 journal 中回溯。
四、Kdump:内核崩溃的内存快照
Kdump 通过 kexec 在系统启动时预留一段内存(crashkernel),当生产内核 panic 时,第二个内核被引导并进入该预留内存,把第一个内核的完整内存镜像写入 /var/crash/。配置检查:systemctl status kdump 确认服务 active,grep crashkernel /proc/cmdline 确认预留参数存在,cat /sys/kernel/kexec_crash_loaded 返回 1 表示已加载。若返回 0,说明 Kdump 未就绪,panic 时不会产生 vmcore。
生成的 vmcore 需要用 crash 工具分析:crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/.../vmcore,进入后常用 bt 查看调用栈、log 查看内核日志、ps 查看崩溃瞬间进程状态。vmcore 文件可能达数 GB,采集前应确认 /var/crash 所在分区有足够空间,必要时通过 kdump.conf 的 path 和 core_collector 调整输出位置与压缩方式。
五、sosreport:一键式系统快照
sosreport 是 RHEL 官方支持工具,会收集内核配置、已加载模块、服务状态、网络配置、挂载表、rpm 清单、日志片段等数百项信息,打包为 .tar.xz。执行 sosreport --batch --case-id=12345678 可非交互运行,适合在故障现场快速生成。注意:sosreport 会读取大量文件,在 IO 已经饱和的系统上可能加重负担,建议先评估 iostat -x 1 3,必要时用 --skip-files 或 --profiles 缩小范围。
六、采集清单与判断依据
| 证据类型 | 采集命令/位置 | 关键判断点 |
|---|---|---|
| 内核日志 | dmesg -T --level=err,warn | OOM、I/O error、驱动失败、call trace |
| 系统日志 | journalctl -b -p err | 服务启动失败、超时、依赖缺失 |
| 崩溃转储 | /var/crash/*/vmcore | panic 调用栈、崩溃前进程状态 |
| 系统快照 | sosreport --batch | 配置漂移、rpm 变更、网络与存储状态 |
| 进程与资源 | ps、vmstat、ss -s | D 状态、wchan、连接队列溢出 |
采集完成后,应形成一份带时间线的证据包:以故障发生时刻为 T0,记录 T0 前后的日志切片、转储文件、sosreport 和人工观察记录。这样无论后续是自行根因分析,还是提交给红帽支持,都能在最短时间内还原现场,避免“重启后一切正常、问题无法复现”的被动局面。