系统故障排查
核心知识点
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-reload3. 运行时故障排查
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 故障
# - 清理散热器
# - 检查风扇
# - 更换 CPU4.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. 处理磁盘故障
# - 备份数据
# - 更换磁盘
# - 重建 RAID4.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 -h5.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@snap5.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最佳实践
- 定期备份:确保数据安全。
rsync -avz /home/ /backup/home/
mysqldump -u root -p --all-databases > backup.sql- 配置监控:及时发现系统问题。
sudo apt-get install prometheus grafana- 记录日志:便于问题追踪。
journalctl -f
tail -f /var/log/syslog- 定期更新:保持系统最新。
sudo apt-get update
sudo apt-get upgrade- 硬件检查:定期检查硬件状态。
smartctl -a /dev/sda
memtest86+建立文档:记录问题和解决方案。
定期演练:提高故障处理能力。
预防为主:建立预防机制。
总结
本教程详细介绍了 Linux 系统故障的排查方法和实践。通过实际案例,我们学习了如何排查启动故障、运行时故障和硬件故障,以及如何进行系统恢复。掌握这些知识后,可以快速定位和解决系统级问题。