Dony · RHEL 日志分析 · 培训

sosreport 分析实战培训

基于企业级 Linux 故障排查方法论,从 sosreport 采集到证据链分析、4 步分诊,再到 4 个 P1/P2 实战案例(网络丢包 / 文件系统只读 / 内核崩溃 / 磁盘物理定位),系统化掌握 sosreport 驱动的根因定位流程。

受众 SRE / 系统 / 运维工程师
模块 7 大主题 + 4 个 Lab
时长 约 3 小时
先决条件 熟悉 Linux 命令行 / dmesg / 日志分析
1

什么是 sosreport

Linux 系统的全景快照 — 一键采集系统全维运行数据

15 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 理解 sosreport 的定位与核心价值
  • 掌握 sosreport 收集内容分类
  • 了解 sosreport 的目录结构
sosreport 收集命令伪终端
图 1:sosreport 收集过程 —— 多个 plugin 依次采集系统全维数据
1. sosreport 是什么

sosreport 是 Red Hat / CentOS / Fedora 等企业级 Linux 发行版自带的诊断工具包,可一键收集系统运行状态、日志、配置、硬件信息,用于故障复盘、性能分析、合规审计和供应商技术支持。

2. 核心价值
  • 无需登录目标主机,即可获取完整系统状态
  • 跨越登录限制(机房禁登、VPN 不通)的远程诊断手段
  • 完整保留故障现场,避免事后日志被覆盖
  • 供应商支持必需文件(Red Hat GSS、Dell PERC 等)
3. 收集内容分类
类别 内容
内核日志 dmesg、kernel ring buffer、panic stack
网络 ip/ethtool/Bonding/VLAN/bridge 状态
存储 df/mount/LVM/Multipath/RAID/lsblk
内存 free/slab/hugepages/cgroup OOM
进程/服务 ps/systemd/SELinux/PAM/sudo
硬件 lspci/dmidecode/megaraid/mpt3sas/nvme
4. 收集命令
# RHEL 10 收集 sosreport
sos report --all-logs

# RHEL 7/8/9
sosreport --all-logs

# 收集结果
sos_commands/   var/log/
etc/            proc/
boot/           sos_reports/
5. 解压后目录结构
sosreport-hostname-timestamp.tar.xz
├── sos_commands/        # 各类诊断命令的输出快照
├── var/log/             # 系统日志
├── etc/                 # 配置快照
├── proc/                # 运行时内核参数
├── boot/                # 引导配置
└── sos_reports/         # sosreport 自身报告
6. 常用触发场景
场景 何时采集
性能问题 用户报告慢但现场已恢复
故障复盘 服务挂了又自动拉起
升级前快照 重大变更前的系统状态
供应商支持 Red Hat / Dell / VMware GSS 要求
2

证据链分析法

从用户症状到根因,层层递进的系统性排查路径

20 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 掌握 7 步证据链分析流程
  • 理解 P1-P4 严重度定级标准
  • 学会构建结构化分析报告
1. 七步证据链

证据链分析法通过系统性地收集从用户报告到硬件层的多维度证据,确保根因判断有充分依据。

  1. 用户报告的症状 — 故障现象、影响范围、首次发生时间、持续时间
  2. 确认时间窗口 — 故障时间 vs. SOS 收集时间 vs. 系统 uptime,确认日志是否覆盖
  3. 日志证据 — messages · dmesg · journal · audit · sos_commands/kernel/dmesg
  4. 运行时证据 — ip · ps · df · mount · multipath · systemctl · ethtool · netstat
  5. 配置证据 — /etc 配置文件 · 网络脚本 · SELinux 策略 · sysctl 参数
  6. 驱动 / 固件 / 硬件证据 — dmidecode · lspci · lsmod · ethtool -i · megaraid logs
  7. 综合评估 — 严重度定级 · 置信度 · 行动项,输出结构化分析报告
2. 严重度定级标准
等级 名称 典型场景
**P1** Critical 内核崩溃 · 全盘只读 · 存储全挂
**P2** High 单路径失败 · 高网络错误 · 高负载
**P3** Medium 硬件错误(已纠正) · 非核心服务失败
**P4** Low 配置问题 · 历史计数器 · 警告
3. 首次必检文件清单
  • etc/os-release
  • sos_commands/kernel/uname_-a
  • sos_commands/host/uptime
  • sos_commands/date/date
  • proc/cmdline
  • var/log/messages
  • var/log/dmesg
  • sos_commands/kernel/dmesg

> 不要凭单一计数器下结论。累计计数器 ≠ 当前增长,需结合时间线与 Uptime 共同判断。

3

快速分诊四步法

拿到 sosreport 后的第一步行动清单

20 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 掌握拿到 sosreport 后的标准操作流程
  • 能用全局错误扫描快速定位问题类别
  • 用 5 个问题评估分析置信度
1. 确认系统基本信息

确认 OS / 内核版本、主机名、运行时间、是否重启过(BOOT TIME)。

cat etc/os-release
cat sos_commands/kernel/uname_-a
cat sos_commands/host/uptime
who -b && last reboot | head -3
2. 全局关键错误扫描

搜索 panic、OOM、I/O error、硬件错误、内核崩溃等关键词,500 行上限防止输出过大。

grep -RniE "panic|oom-killer|I/O error|Call Trace|hung task|soft lockup|hard lockup|MCE|PCIe Bus Error|segfault" \
  var/log sos_commands 2>/dev/null \
  | head -500
3. 症状映射到分析模块

根据故障类型选择对应专项参考文件,精准定位,避免大海捞针。

故障类别 分析模块
网络故障 02-04 networking
存储/硬盘 05-06 storage
内存/OOM 08 memory-oom
内核崩溃 09 kernel-crash
systemd 10 systemd-services
Dell 硬件 12 dell-poweredge
4. 时间线与置信度评估

回答 5 个关键问题,判断分析结论的可信程度:

  1. 何时收集?
  2. 运行多久?
  3. 是否重启?
  4. 日志覆盖故障窗口?
  5. 错误在重启前还是之后?
4

案例一:网络丢包 / CRC 错误

P2 · High

30 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 能从 ethtool/netstat 证据链定位网络层根因
  • 区分物理层 / 协商 / 驱动三类问题
  • 建立网络丢包的标准排查流程
1. 症状描述

用户反映部分服务连接超时,访问延迟升高,iperf3 测速带宽显著下降,TCP 重传率超 5%。

2. 证据收集步骤
# 接口错误计数器
ethtool -S eth0 | grep -E "rx_crc_errors|rx_frame_errors"
ip -s -d link       # RX errors 计数持续增长

# 协商状态
ethtool eth0       # Speed / Duplex / Auto-neg 状态

# Bonding 信息
cat /proc/net/bonding/bond0    # bond 模式和 slave 状态

# TCP 重传统计
netstat -s | grep retransmits

# 错误关键字扫描
grep -Ei "error|drop|crc|miss|fifo|overrun|carrier" \
  sos_commands/networking/ethtool_-S_* \
  2>/dev/null
3. 关键文件清单
  • sos_commands/networking/ethtool_-S_<iface>
  • sos_commands/networking/ethtool_<iface>
  • sos_commands/networking/ip_route_show_table_all
  • sos_commands/networking/netstat_-s
  • proc/net/bonding/bond0
4. 根因分析
类别 根因
物理层问题 网线 / 光模块 / 交换机端口协商异常
Speed/Duplex 不匹配 半双工协商导致大量碰撞
CRC 错误 光纤弯折过大、光模块功率不足、交换机光口脏污
Bond slave 故障 某 slave 链路 down 导致流量集中到另一条
驱动版本过旧 需升级或联系供应商确认兼容版本
5. 建议行动
  • 检查网线 / 光模块物理状态并更换确认
  • 确认交换机端口 speed/duplex/auto-neg 配置一致
  • 检查光纤弯曲半径是否达标,光功率是否在范围
  • 如有持续 CRC 报错,更换 NIC 光模块或整卡
  • 更新驱动或固件至厂商推荐版本
  • 建立持续监控:CRC errors > 0 立即告警
5

案例二:文件系统只读 (Read-Only)

P1 · Critical

30 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 理解文件系统只读是症状非根因
  • 能从存储链路证据中定位底层故障
  • 避免错误执行 fsck / xfs_repair
1. 症状描述

应用报错 "Read-only file system",所有写入操作失败。dmesg 中可见 "EXT4-fs error" 或 "XFS internal error",日志显示 "Remounting filesystem read-only"。

2. 证据收集步骤
# 1. 找只读触发点
grep "Remounting filesystem read-only" var/log/messages

# 2. 挂载状态
cat sos_commands/filesys/mount | grep -v "^proc"

# 3. 多路径状态(是否 all paths down)
multipath -ll

# 4. 块设备拓扑
lsblk

# 5. RAID 控制器日志
megaraid / mpt3sas / nvme logs | grep -i "reset"

# 6. 关键字扫描
grep -RniE "xfs|ext4|read-only|I/O error|journal commit|metadata" \
  var/log sos_commands 2>/dev/null \
  | head -200
3. 关键文件清单
  • var/log/messages · var/log/dmesg · sos_commands/kernel/dmesg
  • sos_commands/filesys/df_-h · sos_commands/filesys/mount
  • sos_commands/multipath/multipath_-ll
  • sos_commands/block/lsblk · sos_commands/block/blkid
4. 根因分析

只读是症状,非根因 —— 底层存储出现问题才触发保护性只读。

类别 根因
HBA / RAID 控制器故障 所有路径失效 → 内核强制只读
SAN 光纤链路中断 multipath all paths down → D-state task 堆积
XFS internal error 磁盘介质损坏或 RAID rebuild 中途失败
EXT4 metadata error journal 日志块损坏,journal replay 失败
5. 建议行动

切勿先执行 fsck / xfs_repair!先查存储链路。

  • 检查 HBA / RAID 控制器健康状态(megaraid -adpAllInfo)
  • 确认 multipath -ll 显示所有路径状态(active ready)
  • 联系存储团队 / SAN 网络管理员确认链路连通性
  • 必要时执行 storage array consistency check
  • 修复底层问题后,以 mount -o remount,rw 重新挂载为读写
  • 修复后建议跑一次 SMART short test 确认磁盘健康
6

案例三:系统不稳定 / 内核崩溃

P1 · Critical

30 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 能从 vmcore / Call Trace 定位内核崩溃
  • 理解 Tainted 标志对根因置信度的影响
  • 建立内核崩溃的标准化响应流程
1. 症状描述

系统意外重启或 panic,dmesg / messages 中可见 "Kernel panic"、"Oops"、"BUG:"、"Call Trace" 或 "soft lockup"。部分场景下系统 hang 住被 NMI watchdog 重置。

2. 证据收集步骤
# 1. 找 panic/BUG/Call Trace
grep -Ei "panic|BUG:|Call Trace|NMI|watchdog" var/log/messages | head -50

# 2. 上下文(Call Trace 周围 10 行)
cat sos_commands/kernel/dmesg | grep -A10 "Call Trace"

# 3. 重启时间线
last | head -10

# 4. kdump 配置
cat etc/kdump.conf
cat proc/cmdline | grep crashkernel
ls -lh /var/crash/  # 是否有 vmcore

# 5. 内核 Tainted 状态
uname -a | grep -o "Tainted:.*"
lsmod | head -30

# 6. 关键字扫描
grep -RniE "panic|oops|BUG:|soft lockup|hard lockup|NMI watchdog|tainted" \
  var/log sos_commands 2>/dev/null \
  | head -100
3. 关键文件清单
  • var/log/messages · var/log/dmesg · sos_commands/kernel/dmesg
  • sos_commands/last/last · sos_commands/host/uptime
  • etc/kdump.conf · proc/cmdline · boot/grub2/grub.cfg
  • sos_commands/kernel/uname_-a(看 Tainted 标志)
  • /var/crash/<日期>/vmcore(如已配置 kdump)
4. 根因分析

找第一个 panic/oops,而非后续级联反应。

类别 根因
Tainted 标志 有非开源模块时降低根因置信度,先排除第三方驱动
Call Trace 分析 识别是内核自身还是第三方模块(如 NVIDIA/nvidia.ko)
NVMe / PCIe AER NVMe 超时或 PCIe Bus Error 可导致系统 reset
MCE / EDAC CPU 内存错误或 PCIe 硬件错误可触发 panic
无 clean shutdown 日志但系统已启动 考虑 power loss / hardware reset / panic
5. 建议行动
  • 如有 vmcore 文件 → 联系 Red Hat GSS / 厂商支持做 crash dump 分析
  • 检查 lsmod 输出,排除加载的可疑第三方模块(out-of-tree 驱动)
  • 核对内核版本与所有驱动版本的兼容性(厂商 HCL)
  • 检查硬件日志:MCE / EDAC / AER 是否有 hardware error 记录
  • 确认 kdump 配置正确且有足够 crashkernel 内存
  • 如是 NVMe 设备,检查固件版本是否有已知 bug(查厂商 advisory)
  • 建议:保留 vmcore、dmesg、messages 原始文件供供应商分析
7

案例四:磁盘物理位置定位

P2 · High · Dell PERC / 多链路场景

25 min 源: sosreport 培训 v5 (8 张 slide 重组)

学习目标

  • 能用 perccli 工具定位 Dell 服务器磁盘物理位置
  • 能从 SN / Slot 找到对应 OS 设备名
  • 熟悉 RAID / NON-RAID 磁盘的定位命令
1. 场景描述

拿到 sosreport 后,客户说"Slot 4 槽位那块盘报黄灯,需要现场更换"。需要从 /dev/sda 倒推回物理槽位,或者反过来。

2. 五步法定位流程

通过 Dell perccli64 工具,从目标盘 → VD → OS 设备名,或反之。

步骤 1:获取所有磁盘 SN 和 Slot 信息
perccli64 /call show AliLog
# 找到目标磁盘的 Serial Number(如 WBMANNDN)和 Slot 槽位号(如 Slot 4)。
# 所有磁盘均列出,可用 SN 精确定位目标盘。
# SN=WBMANNDN → Slot 4 (E251/S4)
perccli Step 1
步骤 1 `perccli /call show AliLog` —— 列出所有磁盘 SN 和 Slot
步骤 2:确认该盘详细属性与 DriveGroup
perccli64 /call/e252/s4 show all
# 确认该盘详细属性:SN、型号、容量、WWN、Firmware,以及 DriveGroup=3、Span=0、Row=0
# DriveGroup:3 · Span:0 · Row:0 · SN:WBMANNDN
perccli Step 2
步骤 2 `perccli /call/e252/s4 show all` —— 确认 DriveGroup
步骤 3:找到 DriveGroup 对应的 Virtual Drive
perccli64 /call/vall show all
# 找到该 DriveGroup=3 对应的 Virtual Drive(VD=236),并确认该 VD 由哪个物理盘组成(E252:Slot4)。
# DG=3 · VD=236 · RAID0 · Optl · /dev/sda 对应 E252:4
perccli Step 3
步骤 3 `perccli /call/vall show all` —— VD 与 DG 映射
步骤 4:查看 VD 详细属性,获取 OS Drive Name
perccli64 /call/v236 show
# 查看 VD 236 详细属性,其中 OS Drive Name 字段即为该 VD 在 Linux 中的设备名(如 /dev/sda)。
# OS Drive Name: /dev/sda(VD 236 对应 OS 设备)
perccli Step 4
步骤 4 `perccli /call/v236 show` —— OS Drive Name
步骤 5:用 lsblk 确认挂载状态
lsblk
# 确认 /dev/sda 的分区情况和挂载点。本例中 sda/sdb/sdc 均无挂载(2.2TB 盘),sdd 为系统盘有 / 和 /boot/efi 分区。
# sda 无挂载 · sdd2 → /(系统盘)
lsblk Step 5
步骤 5 `lsblk` —— 确认 sda 分区与挂载
3. 注意事项
  • 不同 PERC 卡使用不同版本 perccli
  • RAID 和 NON-RAID 磁盘定位命令不同
  • 需根据实际配置调整命令参数
  • Dell PowerEdge 推荐用 perccli64
  • storcli64 与 perccli64 用途类似但格式不同
  • 定位完成后务必用 lsblk 确认设备名
  • 涉及 RAID 操作前请先备份数据
Lab

sosreport 采集与分诊实战

目标:在一台测试 RHEL 10 机器上,完整跑通 sosreport 采集 → 4 步分诊 → 简单案例定位。

环境:1 台 RHEL 10 主机、root 权限、能正常生成 sosreport(~10-30 分钟)。

Lab 1:采集 sosreport(15 min)

# 安装
dnf install sos

# 完整采集(耗时较长)
sos report --all-logs --batch

# 完成后会输出路径
# Your sosreport has been generated and saved in:
#   /var/tmp/sosreport-hostname-xxxxxx.tar.xz

# 查看大小
ls -lh /var/tmp/sosreport-*.tar.xz

# 解压查看
mkdir /tmp/sos && cd /tmp/sos
tar -xJf /var/tmp/sosreport-*.tar.xz
cd sosreport-*
ls -la

Lab 2:4 步分诊(20 min)

# 步骤 1:基本信息
cat etc/os-release | head -3
cat sos_commands/kernel/uname_-a
cat sos_commands/host/uptime
who -b && last reboot | head -3

# 步骤 2:全局错误扫描
grep -RniE "panic|oom-killer|I/O error|Call Trace|hung task|soft lockup|hard lockup|MCE|PCIe Bus Error|segfault" \
  var/log sos_commands 2>/dev/null \
  | head -30

# 步骤 3:模块映射(假设发现网络错误 → 看 networking)
ls sos_commands/networking/ | head -20

# 步骤 4:置信度评估
# ① 何时收集?  ② 运行多久?  ③ 是否重启?
# ④ 日志覆盖故障窗口?  ⑤ 错误在重启前还是之后?

Lab 3:模拟文件只读(20 min)

# 创建一个测试 mount 点,模拟只读故障
mount -o remount,ro /tmp    # 如果 /tmp 允许

# 观察 dmesg
dmesg | tail -20

# 用 sosreport 收集
sos report --batch

# 重新分诊
grep -Ri "read-only|Remounting" var/log | head
lsblk
dmesg | grep -i "i/o error"

Lab 4:查看 Tainted 标志(10 min)

# 查看内核是否被污染
uname -v | grep -o "Tainted:.*"

# 查看加载的第三方模块
lsmod | head -20

# 查看各模块引用计数
lsmod | sort -k3 -n -r | head -10

常见问题 (FAQ)

Q1. sosreport 收集要多久?会中断服务吗?
大概需要几分钟,取决于日志文件的大小和多少和系统繁忙程度。sosreport 只读不写业务盘,不会影响生产服务。建议低峰期执行。
Q2. sos 报告很大,怎么快速定位问题?
遵循"先看症状再查证据":用全局关键字扫描(grep -E "panic|error|warning")快速分类,再按模块(网络/存储/内存)深入。不要打开整个 tarball 一个个看。
Q3. 时间线不对怎么办?
注意:1) 系统时钟是否同步(NTP);2) 是否重启过(BOOT TIME 改变);3) 时区差异(dmesg 用 UTC,local 化工具可能误读);4) 日志覆盖周期(rsylsogrotate)。建议用 uptime + last reboot 锚定。
Q4. fsck / xfs_repair 能直接跑吗?
不能先跑。文件系统只读是症状,根因在底层存储(链路/RAID 控制器/HBA)。直接 fsck 可能进一步破坏数据,甚至使 multipath all-paths-down 状态更难恢复。先修存储链路,再考虑 fsck。
Q5. 看到 Tainted 标志还能定位根因吗?
可以,但置信度降低。Tainted 表示有非开源/未签名模块(常见:NVIDIA, VirtualBox, kmod 驱动)。先在 lsmod 中识别可疑模块,再单独验证该模块是否已知导致 panic(bugzilla / vendor advisory)。
Q6. multipath all paths down 还能恢复吗?
通常可以,前提是底层存储还在。步骤:1) 物理检查光纤 / HBA 链路;2) 重启 HBA 驱动 modprobe;3) multipath -v3 看具体哪条 path 失败;4) 修复后 multipath -ll 应恢复 active ready 状态。避免在 down 状态做 mkfs / 强制 remount。
Q7. 没有 vmcore 怎么分析内核崩溃?
三选一:1) messages / dmesg 中的 Call Trace(降级分析);2) 启用 kdump 后下次崩溃会自动捕获;3) 第三方工具如 kexec / pstore(部分场景)。建议预防性开启 kdump。
Q8. sosreport 会被加密吗?
不会,默认生成明文 tar.xz。如果传给第三方(Red Hat GSS),可考虑 PGP 加密:sos report --encrypt 需要先配置 GPG 密钥。
Q9. 报告里的 sensitive 信息怎么办?
sosreport 默认会脱敏密码(/etc/shadow, ssh keys)。但仍可能含 IP、用户名、hostname 等元数据。外发前用 --clean 标志更彻底脱敏。

sosreport + 排障命令速查表

sos report --all-logs
完整采集(含所有日志,耗时较长)
sos report --batch
无交互式采集(适合脚本)
sos report --clean
外发前脱敏模式
sos report --encrypt
PGP 加密(给第三方前)
grep -RniE "panic|error"
全局错误扫描(var/log sos_commands 2>/dev/null)
ethtool -S eth0
接口错误计数器(CRC/drop/fifo)
ip -s -d link
链路层统计
multipath -ll
多路径状态(active ready / failed)
lsblk
块设备拓扑与挂载
megaraid -adpAllInfo
RAID 控制器健康状态
dmesg | grep -A10 "Call Trace"
内核崩溃上下文
uname -a | grep Tainted
检查内核污染状态
perccli64 /call show AliLog
Dell 磁盘 SN/Slot 映射
journalctl -k -b -1
上一次启动的内核日志
uptime / last reboot
锚定时间线
cat /proc/net/bonding/bond0
Bond 模式 + slave 状态
netstat -s | grep retransmits
TCP 重传统计
mount -o remount,rw /path
修复底层后重挂读写
smartctl -t short /dev/sdX
磁盘 SMART 自检
cat /var/log/kdump*
kdump 配置与历史