sosreport 分析实战培训
基于企业级 Linux 故障排查方法论,从 sosreport 采集到证据链分析、4 步分诊,再到 4 个 P1/P2 实战案例(网络丢包 / 文件系统只读 / 内核崩溃 / 磁盘物理定位),系统化掌握 sosreport 驱动的根因定位流程。
什么是 sosreport
Linux 系统的全景快照 — 一键采集系统全维运行数据
学习目标
- 理解 sosreport 的定位与核心价值
- 掌握 sosreport 收集内容分类
- 了解 sosreport 的目录结构
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 要求 |
证据链分析法
从用户症状到根因,层层递进的系统性排查路径
学习目标
- 掌握 7 步证据链分析流程
- 理解 P1-P4 严重度定级标准
- 学会构建结构化分析报告
1. 七步证据链
证据链分析法通过系统性地收集从用户报告到硬件层的多维度证据,确保根因判断有充分依据。
- 用户报告的症状 — 故障现象、影响范围、首次发生时间、持续时间
- 确认时间窗口 — 故障时间 vs. SOS 收集时间 vs. 系统 uptime,确认日志是否覆盖
- 日志证据 — messages · dmesg · journal · audit · sos_commands/kernel/dmesg
- 运行时证据 — ip · ps · df · mount · multipath · systemctl · ethtool · netstat
- 配置证据 — /etc 配置文件 · 网络脚本 · SELinux 策略 · sysctl 参数
- 驱动 / 固件 / 硬件证据 — dmidecode · lspci · lsmod · ethtool -i · megaraid logs
- 综合评估 — 严重度定级 · 置信度 · 行动项,输出结构化分析报告
2. 严重度定级标准
| 等级 | 名称 | 典型场景 |
|---|---|---|
| **P1** | Critical | 内核崩溃 · 全盘只读 · 存储全挂 |
| **P2** | High | 单路径失败 · 高网络错误 · 高负载 |
| **P3** | Medium | 硬件错误(已纠正) · 非核心服务失败 |
| **P4** | Low | 配置问题 · 历史计数器 · 警告 |
3. 首次必检文件清单
etc/os-releasesos_commands/kernel/uname_-asos_commands/host/uptimesos_commands/date/dateproc/cmdlinevar/log/messagesvar/log/dmesgsos_commands/kernel/dmesg
> 不要凭单一计数器下结论。累计计数器 ≠ 当前增长,需结合时间线与 Uptime 共同判断。
快速分诊四步法
拿到 sosreport 后的第一步行动清单
学习目标
- 掌握拿到 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 个关键问题,判断分析结论的可信程度:
- 何时收集?
- 运行多久?
- 是否重启?
- 日志覆盖故障窗口?
- 错误在重启前还是之后?
案例一:网络丢包 / CRC 错误
P2 · High
学习目标
- 能从 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_allsos_commands/networking/netstat_-sproc/net/bonding/bond0
4. 根因分析
| 类别 | 根因 |
|---|---|
| 物理层问题 | 网线 / 光模块 / 交换机端口协商异常 |
| Speed/Duplex 不匹配 | 半双工协商导致大量碰撞 |
| CRC 错误 | 光纤弯折过大、光模块功率不足、交换机光口脏污 |
| Bond slave 故障 | 某 slave 链路 down 导致流量集中到另一条 |
| 驱动版本过旧 | 需升级或联系供应商确认兼容版本 |
5. 建议行动
- 检查网线 / 光模块物理状态并更换确认
- 确认交换机端口 speed/duplex/auto-neg 配置一致
- 检查光纤弯曲半径是否达标,光功率是否在范围
- 如有持续 CRC 报错,更换 NIC 光模块或整卡
- 更新驱动或固件至厂商推荐版本
- 建立持续监控:CRC errors > 0 立即告警
案例二:文件系统只读 (Read-Only)
P1 · Critical
学习目标
- 理解文件系统只读是症状非根因
- 能从存储链路证据中定位底层故障
- 避免错误执行 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/dmesgsos_commands/filesys/df_-h·sos_commands/filesys/mountsos_commands/multipath/multipath_-llsos_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 确认磁盘健康
案例三:系统不稳定 / 内核崩溃
P1 · Critical
学习目标
- 能从 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/dmesgsos_commands/last/last·sos_commands/host/uptimeetc/kdump.conf·proc/cmdline·boot/grub2/grub.cfgsos_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 原始文件供供应商分析
案例四:磁盘物理位置定位
P2 · High · Dell PERC / 多链路场景
学习目标
- 能用 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)
步骤 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
步骤 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
步骤 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 设备)
步骤 5:用 lsblk 确认挂载状态
lsblk
# 确认 /dev/sda 的分区情况和挂载点。本例中 sda/sdb/sdc 均无挂载(2.2TB 盘),sdd 为系统盘有 / 和 /boot/efi 分区。
# sda 无挂载 · sdd2 → /(系统盘)
3. 注意事项
- 不同 PERC 卡使用不同版本 perccli
- RAID 和 NON-RAID 磁盘定位命令不同
- 需根据实际配置调整命令参数
- Dell PowerEdge 推荐用 perccli64
- storcli64 与 perccli64 用途类似但格式不同
- 定位完成后务必用 lsblk 确认设备名
- 涉及 RAID 操作前请先备份数据
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)
sos report --encrypt 需要先配置 GPG 密钥。--clean 标志更彻底脱敏。