2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
浏览量:28 次 发布时间:2026-01-21 20:22 作者:明扬工控商城 下载docx
2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
好的,我们继续第十四课。今天学习Linux系统故障排查和恢复,这是系统管理员最重要的技能之一。
第一部分:故障排查方法论
1.1 系统化排查方法
故障排查遵循黄金法则:先观察,再思考,最后行动
六个排查步骤:
bash
# 1. 收集信息
# 2. 重现问题
# 3. 隔离问题
# 4. 分析原因
# 5. 实施解决方案
# 6. 验证和记录
常用诊断命令速查:
bash
# 系统信息
uname -a # 内核版本
lsb_release -a # 发行版信息
uptime # 运行时间
w # 登录用户
who # 登录会话
# 硬件信息
lscpu # CPU信息
free -h # 内存信息
df -h # 磁盘空间
lspci # PCI设备
lsusb # USB设备
1.2 问题分类和优先级
bash
# P0级别:系统完全不可用
# 症状:无法启动、无法登录、所有服务不可用
# P1级别:核心服务不可用
# 症状:数据库、Web服务、网络服务异常
# P2级别:部分功能受影响
# 症状:某些应用异常,但系统基本可用
# P3级别:性能问题
# 症状:响应慢,但功能正常
# P4级别:告警和建议
# 症状:配置问题、安全警告
第二部分:启动故障排查
2.1 Linux启动流程详解
text
1. BIOS/UEFI -> 2. 引导加载器(GRUB) -> 3. 内核加载 -> 4. initramfs -> 5. systemd -> 6. 用户空间
2.2 GRUB故障修复
bash
# 情况1:GRUB完全损坏(黑屏或无引导菜单)
# 使用Live CD/USB修复:
# 1. 从Live系统启动
# 2. 挂载系统分区
sudo mount /dev/sda1 /mnt
sudo mount /dev/sda2 /mnt/boot # 如果有单独的boot分区
# 3. Chroot到目标系统
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
# 4. 重新安装GRUB
grub-install /dev/sda
update-grub
exit
# 5. 卸载并重启
sudo umount /mnt/{dev,proc,sys,boot,}
2.3 内核参数调整
bash
# 在GRUB启动时编辑内核参数
# 按'e'进入编辑模式,在linux行末尾添加:
# 单用户模式(维护模式)
single
# 或
systemd.unit=rescue.target
# 紧急模式
systemd.unit=emergency.target
# 关闭SELinux/AppArmor
selinux=0
apparmor=0
# 修复文件系统
fsck.mode=force
fsck.repair=yes
# 禁用图形界面
systemd.unit=multi-user.target
# 内存调试
memtest=1
2.4 systemd启动问题
bash
# 查看启动失败的服务
systemctl --failed
# 查看启动过程
systemd-analyze time
systemd-analyze blame # 按耗时排序
systemd-analyze critical-chain # 关键路径
# 查看特定服务的依赖
systemctl list-dependencies nginx.service
# 重置失败的服务
systemctl reset-failed
# 调试启动过程
systemd.log_level=debug # 添加到内核参数
journalctl -b # 查看本次启动日志
journalctl -b -p err # 只显示错误
第三部分:文件系统故障
3.1 文件系统检查和修复
bash
# 检查文件系统(必须先卸载)
sudo umount /dev/sda1
sudo fsck /dev/sda1
# 强制检查和自动修复(ext2/3/4)
sudo e2fsck -f -y -v /dev/sda1
# 修复xfs文件系统
sudo xfs_repair /dev/sda1
# 检查NTFS文件系统
sudo ntfsfix /dev/sda1
# 如果无法卸载根分区(在紧急模式或Live CD中操作)
# 1. 进入紧急模式
# 2. 重新挂载根分区为读写
mount -o remount,rw /
# 3. 运行fsck(需指定文件系统类型)
fsck.ext4 -f /dev/sda1
3.2 磁盘坏道检测
bash
# 检查磁盘健康状态(需要安装smartmontools)
sudo apt install smartmontools
sudo smartctl -a /dev/sda # 显示所有信息
sudo smartctl -H /dev/sda # 健康状态
sudo smartctl -t short /dev/sda # 快速测试
sudo smartctl -t long /dev/sda # 长测试
# 检查坏道(谨慎使用,会破坏数据)
sudo badblocks -v /dev/sda # 只读检查
sudo badblocks -nvs /dev/sda # 非破坏性读写测试
3.3 磁盘空间紧急清理
bash
# 快速查找大文件
# 方法1:按大小排序
sudo find / -type f -size +100M 2>/dev/null | xargs ls -lh
# 方法2:按目录统计
sudo du -ahx / 2>/dev/null | sort -rh | head -30
# 方法3:使用ncdu工具
sudo apt install ncdu
sudo ncdu /
# 清理系统日志
sudo journalctl --vacuum-size=100M # 保留最近100MB
sudo journalctl --vacuum-time=30d # 保留30天
# 清理包缓存
sudo apt clean
sudo apt autoremove --purge
# 清理临时文件
sudo rm -rf /tmp/*
sudo find /var/tmp -type f -atime +30 -delete
# 清理旧的内核版本(Ubuntu)
dpkg --list | grep linux-image
sudo apt purge linux-image-5.4.0-XX-generic # 保留当前和最新的
# 清理Docker资源
docker system prune -a
第四部分:网络故障排查
4.1 网络问题诊断流程
bash
# 1. 检查网络接口状态
ip link show
# 如果接口为DOWN状态:
sudo ip link set eth0 up
# 2. 检查IP地址
ip addr show
# 如果没有IP:
sudo dhclient eth0 # DHCP获取
# 或手动设置:
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip route add default via 192.168.1.1
# 3. 测试本地网络
ping 127.0.0.1 # 本地回环
ping 192.168.1.1 # 网关
# 4. 测试DNS
nslookup google.com
# 如果DNS失败,检查/etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 5. 测试外部网络
ping 8.8.8.8 # Google DNS
ping google.com
# 6. 检查路由
ip route show
traceroute google.com
4.2 网络服务故障
bash
# 检查端口监听
ss -tulnp # 推荐
netstat -tulnp # 传统方法
# 如果服务端口未监听:
# 1. 检查服务是否运行
systemctl status nginx
# 2. 检查防火墙
sudo ufw status
sudo iptables -L -n
# 3. 检查SELinux/AppArmor
getenforce # SELinux
sudo aa-status # AppArmor
# 4. 检查配置文件
sudo nginx -t # Nginx配置检查
sudo apache2ctl configtest # Apache配置检查
sudo sshd -t # SSH配置检查
4.3 网络性能问题
bash
# 检查网络带宽
iftop
nload
# 检查网络延迟
mtr google.com # 持续跟踪
# 检查网络连接数
ss -s
# 检查网络错误
netstat -i
ip -s link
# 抓包分析(需要tcpdump)
sudo tcpdump -i eth0 -n port 80 # 抓取HTTP流量
sudo tcpdump -i eth0 host 192.168.1.100 # 抓取特定主机
第五部分:硬件故障排查
5.1 CPU和内存问题
bash
# 检查CPU状态
lscpu
cat /proc/cpuinfo
mpstat -P ALL 1 # 实时CPU使用
# 检查内存状态
free -h
cat /proc/meminfo
vmstat 1 5 # 虚拟内存统计
# 内存测试(需要memtester)
sudo apt install memtester
sudo memtester 1G 3 # 测试1GB内存,3次
# CPU压力测试
sudo apt install stress
stress --cpu 4 --timeout 60s # 4个核心,60秒
5.2 硬件日志查看
bash
# 查看内核消息缓冲区
dmesg
dmesg -T # 带时间戳
dmesg -l err,crit,alert,emerg # 只显示错误
# 查看系统日志
journalctl -k # 内核日志
journalctl --since "10 minutes ago" # 最近10分钟
# 查看特定硬件日志
journalctl _TRANSPORT=kernel # 内核消息
journalctl _TRANSPORT=driver # 驱动消息
# 查看温度传感器
sudo apt install lm-sensors
sudo sensors-detect # 检测传感器
sensors # 显示温度
5.3 电源和RAID问题
bash
# 检查电源状态
sudo apt install acpi
acpi -V
# 检查RAID状态
cat /proc/mdstat # 软件RAID
sudo megacli -LDInfo -Lall -aAll # 硬件RAID(需要安装megacli)
sudo storcli /c0 show # 另一种RAID工具
# 检查磁盘SMART状态
sudo smartctl -a /dev/sda | grep -E "(Reallocated|Pending|Uncorrectable)"
第六部分:服务和应用故障
6.1 服务故障排查
bash
# 查看服务状态
systemctl status servicename
# 查看详细日志
journalctl -u servicename -xe
journalctl -u servicename --since "1 hour ago"
# 服务调试模式
# 修改服务文件,添加:
# Environment=SYSTEMD_LOG_LEVEL=debug
# 手动测试服务
sudo -u www-data /usr/sbin/nginx -g "daemon off;" # Nginx
sudo -u mysql /usr/sbin/mysqld --verbose --help # MySQL
6.2 数据库故障
bash
# MySQL故障排查
sudo tail -f /var/log/mysql/error.log
mysqlcheck --all-databases --check-upgrade --auto-repair
mysql_upgrade -u root -p
# PostgreSQL故障排查
sudo tail -f /var/log/postgresql/postgresql-14-main.log
sudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"
sudo -u postgres psql -c "VACUUM ANALYZE;"
# Redis故障排查
redis-cli info
redis-cli monitor # 实时查看命令
redis-cli --stat # 统计信息
6.3 Web服务器故障
bash
# Nginx故障
sudo nginx -t # 测试配置
sudo tail -f /var/log/nginx/error.log
nginx -V # 查看编译参数
# Apache故障
sudo apache2ctl configtest
sudo tail -f /var/log/apache2/error.log
apache2ctl -M # 查看加载的模块
# PHP故障
php -m # 查看PHP模块
php -i | grep error # 查看错误设置
sudo tail -f /var/log/php8.1-fpm.log
第七部分:安全事件响应
7.1 入侵检测步骤
bash
# 第一步:立即取证
# 不要关机!先收集证据
# 查看当前登录用户
w
last
who -a
# 检查异常进程
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
pstree -ap
# 检查网络连接
ss -tulnp
sudo lsof -i
# 检查最近修改的文件
find / -type f -mtime -1 2>/dev/null | head -20
find /etc -type f -mtime -1 2>/dev/null
# 检查计划任务
crontab -l
ls -la /etc/cron*
cat /etc/crontab
# 检查启动项
ls -la /etc/init.d/
ls -la /etc/systemd/system/
systemctl list-unit-files | grep enabled
# 检查sudo权限
sudo grep -v '^#\|^$' /etc/sudoers
ls -la /etc/sudoers.d/
7.2 恶意软件检测
bash
# 安装安全扫描工具
sudo apt install chkrootkit rkhunter lynis
# 扫描rootkit
sudo chkrootkit
sudo rkhunter --check --sk
# 系统安全审计
sudo lynis audit system
# 病毒扫描
sudo apt install clamav
sudo freshclam # 更新病毒库
sudo clamscan -r /home --bell
# 查找隐藏进程(/proc目录扫描)
ls -la /proc/*/exe 2>/dev/null | grep deleted
7.3 应急响应措施
bash
# 1. 隔离系统
sudo iptables -A INPUT -s 0.0.0.0/0 -j DROP
sudo ip link set eth0 down
# 2. 取证备份
sudo dd if=/dev/sda of=/evidence/sda.img bs=4M status=progress
sudo tar -czvf /evidence/logs.tar.gz /var/log
# 3. 分析时间线
sudo apt install log2timeline plaso
log2timeline.py /evidence/timeline.plaso /dev/sda1
# 4. 清理和恢复
# 根据分析结果清除恶意文件
# 修改被篡改的配置
# 重置密码和密钥
# 5. 加固系统
sudo apt update && sudo apt upgrade
sudo ufw enable
sudo fail2ban-client set sshd banip 192.168.1.100
第八部分:数据恢复技术
8.1 文件恢复
bash
# 使用extundelete恢复ext文件系统文件
sudo apt install extundelete
sudo umount /dev/sda1
sudo extundelete /dev/sda1 --restore-all
# 使用testdisk恢复分区和文件
sudo apt install testdisk
sudo testdisk # 交互式界面
# 选择分区 -> Analyse -> Quick Search -> Write
# 使用photorec恢复文件(testdisk的一部分)
sudo photorec # 交互式界面
# 使用scalpel恢复特定文件类型
sudo apt install scalpel
sudo cp /etc/scalpel/scalpel.conf /etc/scalpel/scalpel.conf.bak
sudo vim /etc/scalpel/scalpel.conf # 取消注释需要的文件类型
sudo scalpel /dev/sda1 -o /recovery
8.2 分区恢复
bash
# 查看丢失的分区
sudo fdisk -l /dev/sda
# 使用gpart恢复分区表
sudo apt install gpart
sudo gpart /dev/sda
# 使用parted恢复分区
sudo parted /dev/sda rescue
# 手动恢复MBR
sudo dd if=/dev/sda of=/backup/mbr.backup bs=512 count=1 # 备份MBR
sudo dd if=/backup/mbr.backup of=/dev/sda bs=512 count=1 # 恢复MBR
8.3 数据库恢复
bash
# MySQL恢复
# 从备份恢复
mysql -u root -p database < backup.sql
# 从binlog恢复
mysqlbinlog /var/log/mysql/mysql-bin.000001 | mysql -u root -p
# PostgreSQL恢复
# 从dump恢复
pg_restore -U postgres -d database backup.dump
# 从WAL恢复
sudo -u postgres pg_resetwal /var/lib/postgresql/14/main/
第九部分:备份和恢复策略
9.1 创建系统备份
bash
# 完整系统备份(使用tar)
sudo tar -czpvf /backup/full-backup-$(date +%Y%m%d).tar.gz \
--exclude=/backup \
--exclude=/proc \
--exclude=/sys \
--exclude=/dev \
--exclude=/run \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/media \
--exclude=/lost+found \
/
# 增量备份(使用rsync)
sudo rsync -av --delete --link-dest=/backup/latest /home/ /backup/incremental/$(date +%Y%m%d)
ln -sf /backup/incremental/$(date +%Y%m%d) /backup/latest
# 磁盘镜像备份
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
9.2 自动化备份脚本
bash
#!/bin/bash
# backup_system.sh
# 配置
BACKUP_DIR="/backup"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/backup.log"
# 日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG_FILE"
}
# 检查备份目录
mkdir -p "$BACKUP_DIR"
if [ ! -d "$BACKUP_DIR" ]; then
log "错误: 无法创建备份目录 $BACKUP_DIR"
exit 1
fi
# 开始备份
log "=== 开始系统备份 ==="
# 1. 备份重要配置文件
log "备份配置文件..."
tar -czf "$BACKUP_DIR/etc-backup-$DATE.tar.gz" /etc 2>>"$LOG_FILE"
# 2. 备份数据库
log "备份MySQL数据库..."
mysqldump --all-databases --single-transaction > "$BACKUP_DIR/mysql-backup-$DATE.sql" 2>>"$LOG_FILE"
# 3. 备份用户数据
log "备份用户数据..."
tar -czf "$BACKUP_DIR/home-backup-$DATE.tar.gz" /home 2>>"$LOG_FILE"
# 4. 备份Web数据
if [ -d "/var/www" ]; then
log "备份Web数据..."
tar -czf "$BACKUP_DIR/www-backup-$DATE.tar.gz" /var/www 2>>"$LOG_FILE"
fi
# 清理旧备份
log "清理 $RETENTION_DAYS 天前的备份..."
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.sql" -mtime +$RETENTION_DAYS -delete
# 验证备份
log "验证备份..."
for file in "$BACKUP_DIR"/*-$DATE.*; do
if [ -f "$file" ]; then
if tar -tzf "$file" >/dev/null 2>&1; then
log "验证成功: $file"
else
log "验证失败: $file"
fi
fi
done
log "备份完成"
log "磁盘使用情况: $(df -h $BACKUP_DIR | tail -1)"
9.3 灾难恢复演练
bash
#!/bin/bash
# disaster_recovery_drill.sh
echo "=== 灾难恢复演练 ==="
echo "这个脚本将模拟系统故障并恢复"
echo
read -p "请确认已在测试环境执行 [y/N]: " confirm
if [ "$confirm" != "y" ]; then
echo "取消"
exit 1
fi
# 创建测试环境
TEST_DIR="/tmp/recovery_test"
mkdir -p "$TEST_DIR"
echo "1. 模拟配置文件损坏"
sudo cp -r /etc "$TEST_DIR/etc_original"
sudo rm -f "$TEST_DIR/etc_original/hostname"
echo "2. 模拟数据库损坏"
sudo mysql -e "CREATE DATABASE IF NOT EXISTS test_recovery"
sudo mysql test_recovery -e "CREATE TABLE test (id INT, data VARCHAR(100))"
sudo mysql test_recovery -e "INSERT INTO test VALUES (1, 'test data')"
echo "3. 执行备份"
./backup_system.sh
echo "4. 模拟灾难"
sudo mv /etc/hostname /etc/hostname.bak
sudo mysql -e "DROP DATABASE test_recovery"
echo "5. 开始恢复"
echo "恢复配置文件..."
sudo tar -xzf /backup/etc-backup-*.tar.gz -C /
echo "恢复数据库..."
latest_sql=$(ls -t /backup/mysql-backup-*.sql | head -1)
sudo mysql < "$latest_sql"
echo "6. 验证恢复"
if [ -f /etc/hostname ]; then
echo "✓ 配置文件恢复成功"
else
echo "✗ 配置文件恢复失败"
fi
mysql -e "SHOW DATABASES LIKE 'test_recovery'" | grep -q test_recovery
if [ $? -eq 0 ]; then
echo "✓ 数据库恢复成功"
else
echo "✗ 数据库恢复失败"
fi
echo
echo "演练完成"
第十部分:故障排查工具箱
10.1 必备工具安装
bash
# 安装诊断工具集
sudo apt install -y \
htop iotop iftop nload \
net-tools dnsutils traceroute \
sysstat lsof strace ltrace \
gdb pstack \
nmap tcpdump wireshark \
smartmontools lm-sensors \
testdisk photorec \
chkrootkit rkhunter lynis \
tree ncdu \
jq yq \
python3-pip
10.2 自定义诊断脚本
bash
#!/bin/bash
# system_health_check.sh
echo "====== 系统健康检查报告 ======"
echo "检查时间: $(date)"
echo "主机名: $(hostname)"
echo
echo "=== 系统信息 ==="
echo "发行版: $(lsb_release -d | cut -f2)"
echo "内核版本: $(uname -r)"
echo "运行时间: $(uptime)"
echo
echo "=== 硬件状态 ==="
echo "CPU负载: $(uptime | awk -F'load average:' '{print $2}')"
echo "内存使用: $(free -h | awk '/Mem:/ {printf "%s/%s (%.1f%%)", $3, $2, $3/$2*100}')"
echo "磁盘使用:"
df -h | awk 'NR>1 && $5+0 > 80 {print " 警告: " $1 " 使用率 " $5}'
df -h | awk 'NR>1 && $5+0 <= 80 {print " 正常: " $1 " 使用率 " $5}'
echo
echo "=== 服务状态 ==="
echo "失败的服务:"
systemctl --failed | grep -A 100 "units listed"
echo
echo "=== 网络状态 ==="
echo "网络接口:"
ip -br addr show
echo
echo "=== 安全状态 ==="
echo "失败的SSH登录:"
sudo grep "Failed password" /var/log/auth.log 2>/dev/null | tail -5 || echo " 无失败记录"
echo "root登录记录:"
sudo grep "Accepted.*root" /var/log/auth.log 2>/dev/null | tail -3 || echo " 无root登录"
echo
echo "=== 检查完成 ==="
10.3 实时监控面板
bash
#!/bin/bash
# live_monitor.sh
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
clear
echo -e "${GREEN}=== 系统实时监控 ===${NC}"
echo "按 Ctrl+C 退出"
echo
while true; do
echo -e "\033[H" # 光标移动到左上角
# 系统信息
echo -e "${YELLOW}系统信息${NC}"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "运行: $(uptime -p)"
echo "负载: $(cat /proc/loadavg)"
echo
# CPU和内存
echo -e "${YELLOW}CPU和内存${NC}"
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 "%us " $4 "%sy " $6 "%id"}')"
mem=$(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2}')
echo "内存: $mem"
echo
# 磁盘
echo -e "${YELLOW}磁盘使用${NC}"
df -h / | awk 'NR==2{print "根分区: "$3"/"$2" ("$5")"}'
echo
# 网络
echo -e "${YELLOW}网络连接${NC}"
echo "TCP连接: $(ss -t | wc -l)"
echo
# 进程
echo -e "${YELLOW}TOP进程${NC}"
echo "CPU前5:"
ps aux --sort=-%cpu | head -6 | tail -5 | awk '{printf " %-10s %-5s %s\n", $1, $3"%", $11}'
echo
echo "内存前5:"
ps aux --sort=-%mem | head -6 | tail -5 | awk '{printf " %-10s %-5s %s\n", $1, $4"%", $11}'
sleep 2
done
第十一部分:练习项目
项目1:模拟和解决系统故障
创建以下故障场景并解决:
GRUB损坏:删除/boot/grub/grub.cfg,然后修复
文件系统损坏:使用dd破坏文件系统头,然后修复
网络故障:配置错误的静态IP和网关,然后排查
服务故障:修改Nginx配置使其无法启动,然后修复
权限问题:更改关键文件权限,导致系统异常
项目2:创建监控告警系统
实现一个完整的监控系统:
收集系统指标(CPU、内存、磁盘、网络)
设置阈值告警
实现自动恢复脚本
创建监控仪表板
配置邮件/短信告警
项目3:设计备份恢复方案
为一个生产环境设计备份策略:
确定备份内容和频率
选择备份工具和方法
制定恢复流程
定期进行恢复演练
文档化整个方案
项目4:安全事件响应演练
模拟安全事件并响应:
模拟SSH暴力破解
模拟Web应用攻击
模拟恶意软件感染
执行应急响应步骤
撰写事件报告
今日总结
今天我们学习了Linux系统故障排查和恢复:
故障排查方法论:系统化的问题解决流程
启动故障:GRUB修复、内核参数、救援模式
文件系统故障:检查、修复、数据恢复
网络故障:连接、服务、性能问题
硬件故障:CPU、内存、磁盘诊断
服务故障:系统服务、数据库、应用问题
安全响应:入侵检测、恶意软件、应急措施
数据恢复:文件、分区、数据库恢复技术
备份策略:备份方法、自动化、恢复演练
工具箱:必备工具、诊断脚本、监控面板
关键原则:
保持冷静:不要慌张,按步骤排查
先备份再操作:重要操作前先备份数据
记录一切:记录所有操作和现象
最小化变更:一次只改变一个变量
验证结果:每个步骤后验证效果
总结经验:记录问题和解决方案
故障排查是经验的积累,遇到问题时不要害怕,每次解决问题的过程都是学习的机会。
有问题吗?完成练习项目后,我们可以继续第十五课:Linux内核和驱动管理。
将本文的Word文档下载到电脑
推荐度: