系统故障排查

核心知识点

1. 系统故障类型

1.1 启动故障

┌─────────────────────────────────────────────────────┐
│              启动故障类型                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────────────────────────────────────┐       │
│   │           BIOS/UEFI 故障              │       │
│   │  - 无法开机                             │       │
│   │  - 无法识别硬盘                         │       │
│   │  - 启动顺序错误                         │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           引导加载器故障              │       │
│   │  - GRUB 错误                           │       │
│   │  - 引导配置错误                         │       │
│   │  - 内核文件丢失                         │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           内核启动故障                  │       │
│   │  - 内核 Panic                           │       │
│   │  - 驱动加载失败                         │       │
│   │  - 挂载文件系统失败                     │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           系统服务故障                  │       │
│   │  - 服务启动失败                         │       │
│   │  - 依赖服务未启动                       │       │
│   │  - 配置错误                             │       │
│   └─────────────────────────────────────────┘       │
│                                                     │
└─────────────────────────────────────────────────────┘

1.2 运行时故障

故障类型 表现 常见原因
系统崩溃 系统重启、无响应 内核 Bug、硬件故障
死锁 系统无响应 资源竞争、死循环
内存泄漏 内存持续增长 程序错误、资源未释放
CPU 爆满 CPU 使用率 100% 死循环、病毒攻击
磁盘满 无法写入数据 日志过多、数据增长

2. 启动故障排查

2.1 BIOS/UEFI 故障

# 1. 检查硬件连接
# - 检查电源连接
# - 检查硬盘连接
# - 检查内存条

# 2. 进入 BIOS/UEFI 设置
# - 检查启动顺序
# - 检查硬盘识别
# - 检查内存配置

# 3. 恢复默认设置
# - Load Optimized Defaults
# - Save and Exit

# 4. 更新 BIOS/UEFI
# - 下载最新固件
# - 按照说明更新

2.2 GRUB 故障

# 1. 进入 GRUB 救援模式
# - 重启系统
# - 按 Shift 键进入 GRUB 菜单
# - 选择 Advanced options
# - 选择 Recovery mode

# 2. 修复 GRUB
# 从 Live CD 启动
sudo fdisk -l
sudo mount /dev/sda1 /mnt
sudo grub-install --boot-directory=/mnt/boot /dev/sda
sudo update-grub

# 3. 修复 GRUB 配置
sudo nano /etc/default/grub
sudo update-grub

# 4. 重新安装系统
# 如果无法修复,考虑重新安装系统

2.3 内核启动故障

# 1. 查看启动日志
dmesg | less
journalctl -b -1
cat /var/log/boot.log

# 2. 检查内核参数
cat /proc/cmdline
cat /etc/default/grub

# 3. 修改内核参数
sudo nano /etc/default/grub
# 添加或修改 GRUB_CMDLINE_LINUX_DEFAULT
sudo update-grub

# 4. 选择旧内核启动
# - 重启系统
# - 按 Shift 键进入 GRUB 菜单
# - 选择 Advanced options
# - 选择旧内核版本

2.4 系统服务故障

# 1. 检查服务状态
systemctl status
systemctl --failed

# 2. 查看失败服务
systemctl --state=failed

# 3. 查看服务日志
journalctl -u <service>
journalctl -u <service> -n 100

# 4. 启动失败服务
systemctl start <service>

# 5. 查看服务依赖
systemctl list-dependencies <service>

# 6. 修复服务配置
sudo nano /etc/systemd/system/<service>.service
sudo systemctl daemon-reload

3. 运行时故障排查

3.1 系统崩溃排查

# 1. 查看崩溃日志
dmesg | grep -i panic
journalctl -b -1 | grep -i panic
cat /var/log/kern.log | grep -i panic

# 2. 查看 kdump 日志
ls /var/crash/
crash <vmcore> <vmlinux>

# 3. 配置 kdump
# 安装 kexec-tools
sudo apt-get install kexec-tools

# 配置 /etc/kdump.conf
sudo nano /etc/kdump.conf

# 启用 kdump
sudo systemctl enable kdump
sudo systemctl start kdump

# 4. 分析崩溃原因
# - 查看内核日志
# - 查看硬件日志
# - 查看应用日志

3.2 死锁排查

# 1. 查看系统状态
top
vmstat 1
iostat -x 1

# 2. 查看进程状态
ps aux
ps -eo pid,stat,cmd

# 3. 查看死锁进程
cat /proc/<pid>/stack
cat /proc/<pid>/status

# 4. 使用 sysrq
echo 1 > /proc/sys/kernel/sysrq
echo t > /proc/sysrq-trigger

# 5. 强制重启
echo b > /proc/sysrq-trigger

# 6. 分析死锁原因
# - 查看进程日志
# - 查看系统日志
# - 使用性能分析工具

3.3 内存泄漏排查

# 1. 监控内存使用
free -h
watch -n 1 "free -h"

# 2. 查看进程内存
ps aux --sort=-%mem | head -20
smem -P <pid>

# 3. 使用 valgrind 检测
valgrind --leak-check=full --show-leak-kinds=all ./myapp

# 4. 使用 address sanitizer
gcc -fsanitize=address -g myapp.c -o myapp
./myapp

# 5. 分析内存映射
pmap -x <pid>
cat /proc/<pid>/maps

# 6. 修复内存泄漏
# - 检查未释放的内存
# - 检查循环引用
# - 使用智能指针

3.4 CPU 爆满排查

# 1. 查看 CPU 使用
top
htop

# 2. 查看高 CPU 进程
ps aux --sort=-%cpu | head -20

# 3. 分析进程
strace -p <pid>
perf top -p <pid>

# 4. 查看线程
ps -eLf | grep <pid>
top -H

# 5. 终止异常进程
kill <pid>
kill -9 <pid>

# 6. 分析原因
# - 查看进程日志
# - 查看系统日志
# - 检查代码逻辑

4. 硬件故障排查

4.1 CPU 故障

# 1. 查看 CPU 信息
cat /proc/cpuinfo
lscpu

# 2. 监控 CPU 温度
sensors
watch -n 1 "sensors"

# 3. 查看 CPU 错误
dmesg | grep -i cpu
cat /var/log/kern.log | grep -i cpu

# 4. 运行压力测试
stress-ng --cpu 4 --timeout 300s
sysbench cpu --cpu-max-prime=20000 run

# 5. 检查 CPU 核心数
nproc
cat /proc/cpuinfo | grep processor | wc -l

# 6. 处理 CPU 故障
# - 清理散热器
# - 检查风扇
# - 更换 CPU

4.2 内存故障

# 1. 查看内存信息
cat /proc/meminfo
free -h
dmidecode -t memory

# 2. 检查内存错误
dmesg | grep -i memory
cat /var/log/kern.log | grep -i memory

# 3. 运行内存测试
memtest86+

# 4. 使用 edac 工具
apt-get install edac-utils
edac-util -v

# 5. 查看内存使用
ps aux --sort=-%mem | head -20
smem

# 6. 处理内存故障
# - 清理内存条
# - 更换内存条
# - 检查主板

4.3 磁盘故障

# 1. 查看磁盘信息
fdisk -l
lsblk
df -h

# 2. 检查磁盘健康
smartctl -a /dev/sda
smartctl -H /dev/sda

# 3. 查看磁盘错误
dmesg | grep -i disk
cat /var/log/syslog | grep -i disk

# 4. 检查文件系统
fsck /dev/sda1
e2fsck -f /dev/sda1

# 5. 查看磁盘 I/O
iostat -x 1
iotop

# 6. 处理磁盘故障
# - 备份数据
# - 更换磁盘
# - 重建 RAID

4.4 网络故障

# 1. 查看网络接口
ip addr show
ifconfig

# 2. 检查网络连接
ping <host>
traceroute <host>
mtr <host>

# 3. 查看网络状态
netstat -an
ss -s

# 4. 检查网络配置
ip route show
cat /etc/network/interfaces
cat /etc/sysconfig/network-scripts/ifcfg-eth0

# 5. 查看网络错误
dmesg | grep -i network
ethtool -S eth0

# 6. 处理网络故障
# - 检查网线
# - 检查交换机
# - 检查配置

5. 系统恢复

5.1 从备份恢复

# 1. 恢复系统配置
rsync -avz /backup/etc/ /etc/

# 2. 恢复应用数据
tar -xzf app-backup.tar.gz -C /var/www/

# 3. 恢复数据库
mysql -u root -p database < backup.sql

# 4. 恢复用户数据
rsync -avz /backup/home/ /home/

# 5. 验证恢复
systemctl status
df -h
free -h

5.2 系统快照恢复

# 1. 创建快照(LVM)
lvcreate -L 10G -s -n snap /dev/vg0/lv0

# 2. 恢复快照
lvconvert --merge /dev/vg0/snap

# 3. 创建快照(ZFS)
zfs snapshot pool/fs@snap

# 4. 恢复快照
zfs rollback pool/fs@snap

# 5. 删除快照
zfs destroy pool/fs@snap

5.3 系统重装

# 1. 备份数据
rsync -avz /home/ /backup/home/
mysqldump -u root -p --all-databases > backup.sql

# 2. 准备安装介质
# - 下载 ISO
# - 制作启动盘

# 3. 安装系统
# - 按照安装向导操作
# - 选择合适的分区方案

# 4. 恢复数据
rsync -avz /backup/home/ /home/
mysql -u root -p < backup.sql

# 5. 配置系统
# - 安装必要软件
# - 配置网络
# - 配置服务

实用案例分析

案例 1:系统无法启动

场景描述

系统无法启动,显示 GRUB 错误。

排查步骤

# 1. 从 Live CD 启动
# - 插入 Live CD
# - 从 CD 启动

# 2. 检查磁盘分区
sudo fdisk -l
sudo lsblk

# 3. 挂载根分区
sudo mount /dev/sda1 /mnt

# 4. 重新安装 GRUB
sudo grub-install --boot-directory=/mnt/boot /dev/sda

# 5. 更新 GRUB 配置
sudo chroot /mnt
sudo update-grub
exit

# 6. 卸载分区
sudo umount /mnt

# 7. 重启系统
sudo reboot

# 8. 验证启动
# 系统正常启动

案例 2:系统频繁崩溃

场景描述

系统频繁崩溃,需要排查原因。

排查步骤

# 1. 查看崩溃日志
dmesg | grep -i panic
journalctl -b -1 | grep -i panic

# 2. 配置 kdump
sudo apt-get install kexec-tools
sudo nano /etc/kdump.conf
sudo systemctl enable kdump
sudo systemctl start kdump

# 3. 重启系统
sudo reboot

# 4. 分析崩溃转储
ls /var/crash/
crash <vmcore> <vmlinux>

# 5. 检查硬件
# - 检查内存
memtest86+

# - 检查 CPU
stress-ng --cpu 4 --timeout 300s

# - 检查磁盘
smartctl -a /dev/sda

# 6. 更新内核
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install linux-image-generic

# 7. 重启验证
sudo reboot

案例 3:磁盘空间不足

场景描述

系统磁盘空间不足,无法写入数据。

排查步骤

# 1. 检查磁盘使用
df -h
du -sh /var/log/*

# 2. 查找大文件
find / -type f -size +1G
du -h --max-depth=1 / | sort -hr

# 3. 清理日志
sudo journalctl --vacuum-time=7d
sudo rm /var/log/*.old

# 4. 清理缓存
sudo apt-get clean
sudo apt-get autoremove
sudo rm -rf /tmp/*

# 5. 清理旧内核
sudo apt-get remove --purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')

# 6. 配置日志轮转
sudo nano /etc/logrotate.conf

# 7. 验证效果
df -h

最佳实践

  1. 定期备份:确保数据安全。
rsync -avz /home/ /backup/home/
mysqldump -u root -p --all-databases > backup.sql
  1. 配置监控:及时发现系统问题。
sudo apt-get install prometheus grafana
  1. 记录日志:便于问题追踪。
journalctl -f
tail -f /var/log/syslog
  1. 定期更新:保持系统最新。
sudo apt-get update
sudo apt-get upgrade
  1. 硬件检查:定期检查硬件状态。
smartctl -a /dev/sda
memtest86+
  1. 建立文档:记录问题和解决方案。

  2. 定期演练:提高故障处理能力。

  3. 预防为主:建立预防机制。

总结

本教程详细介绍了 Linux 系统故障的排查方法和实践。通过实际案例,我们学习了如何排查启动故障、运行时故障和硬件故障,以及如何进行系统恢复。掌握这些知识后,可以快速定位和解决系统级问题。

« 上一篇 故障排查方法论 下一篇 » 网络故障排查