主题
系统启动故障排查
课程介绍
系统启动故障是Linux运维中最常见的问题之一,也是影响业务连续性的关键故障。本课程将带你学习系统启动流程、常见启动故障的排查方法以及应急处理技巧,帮助你快速定位和解决系统启动问题。
1. Linux系统启动流程
1.1 启动流程概述
Linux系统启动是一个复杂的过程,涉及多个阶段。
启动流程:
通电 → BIOS/UEFI → Boot Loader → 内核加载 → init进程 → 系统初始化 → 登录界面1.2 详细启动步骤
步骤1:BIOS/UEFI自检
- 硬件自检(POST)
- 检测CPU、内存、硬盘等硬件
- 选择启动设备
步骤2:Boot Loader加载
- GRUB(Grand Unified Boot Loader)
- 加载内核镜像
- 加载initrd镜像
步骤3:内核加载
- 解压内核
- 初始化内核
- 挂载根文件系统
步骤4:init进程启动
- init进程(PID=1)是所有进程的父进程
- 读取/etc/inittab或systemd配置
- 启动系统服务
步骤5:系统初始化
- 挂载文件系统
- 启动网络服务
- 启动系统服务
步骤6:登录界面
- 显示登录提示符
- 等待用户登录
2. 常见启动故障类型
2.1 故障分类
| 故障类型 | 说明 | 严重程度 |
|---|---|---|
| 硬件故障 | 硬盘损坏、内存故障等 | 严重 |
| Boot Loader故障 | GRUB损坏、配置错误 | 严重 |
| 内核故障 | 内核损坏、驱动问题 | 严重 |
| 文件系统故障 | 文件系统损坏、inode耗尽 | 中等 |
| 配置文件错误 | /etc/fstab、/etc/inittab错误 | 中等 |
| 服务启动失败 | 系统服务启动失败 | 轻微 |
2.2 故障现象
现象1:系统无法启动
- 黑屏
- 光标闪烁
- 无任何输出
现象2:GRUB错误
- GRUB rescue>
- error: unknown filesystem
- error: file not found
现象3:内核错误
- Kernel panic
- Unable to mount root fs
- VFS: Unable to mount root fs
现象4:进入紧急模式
- emergency mode
- root password for maintenance
3. GRUB故障排查
3.1 GRUB损坏
当GRUB损坏时,系统无法启动,会进入GRUB rescue>模式。
故障现象:
error: unknown filesystem.
grub rescue>排查步骤:
步骤1:进入GRUB rescue模式
- 系统启动时按Shift键(BIOS)或Esc键(UEFI)
- 进入GRUB rescue>提示符
步骤2:查找GRUB文件
bash
# 查找包含GRUB文件的分区
grub rescue> ls
(hd0) (hd0,msdos1) (hd0,msdos2)
# 查找每个分区
grub rescue> ls (hd0,msdos1)/
grub rescue> ls (hd0,msdos2)/步骤3:设置GRUB根目录
bash
# 假设GRUB文件在(hd0,msdos2)分区
grub rescue> set root=(hd0,msdos2)
grub rescue> set prefix=(hd0,msdos2)/boot/grub步骤4:加载GRUB模块
bash
grub rescue> insmod normal
grub rescue> normal步骤5:修复GRUB
bash
# 进入系统后,重新安装GRUB
sudo grub-install /dev/sda
# 更新GRUB配置
sudo update-grub3.2 GRUB配置错误
当GRUB配置文件损坏或错误时,系统无法正常启动。
故障现象:
error: file not found.
error: you need to load the kernel first.排查步骤:
步骤1:进入GRUB命令行
- 系统启动时按'e'键编辑启动项
- 进入GRUB命令行
步骤2:手动启动系统
bash
# 设置根分区
set root=(hd0,msdos2)
# 加载内核
linux /boot/vmlinuz-5.15.0-91-generic root=/dev/sda2 ro
# 加载initrd
initrd /boot/initrd.img-5.15.0-91-generic
# 启动系统
boot步骤3:修复GRUB配置
bash
# 进入系统后,重新生成GRUB配置
sudo update-grub
# 如果update-grub命令不存在
sudo grub-mkconfig -o /boot/grub/grub.cfg3.3 GRUB密码遗忘
如果忘记了GRUB密码,可以通过Live CD重置。
排查步骤:
步骤1:使用Live CD启动
- 插入Linux Live CD
- 从Live CD启动系统
步骤2:挂载根分区
bash
# 查看分区
sudo fdisk -l
# 挂载根分区
sudo mount /dev/sda2 /mnt
# 挂载其他目录
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys步骤3:chroot到系统
bash
# chroot到系统
sudo chroot /mnt
# 重新设置GRUB密码
grub-mkpasswd-pbkdf2步骤4:更新GRUB配置
bash
# 编辑GRUB配置文件
vim /etc/grub.d/40_custom
# 添加以下内容
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.xxx
# 更新GRUB
update-grub4. 内核故障排查
4.1 内核损坏
当内核文件损坏时,系统无法正常启动。
故障现象:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)排查步骤:
步骤1:查看错误信息
- 记录错误信息
- 确认是哪个内核版本出现问题
步骤2:选择其他内核版本
- 系统启动时按Shift键
- 选择其他内核版本启动
步骤3:重新安装内核
bash
# 查看已安装的内核
dpkg --list | grep linux-image
# 重新安装内核
sudo apt-get install --reinstall linux-image-5.15.0-91-generic
# 如果无法启动,使用Live CD
sudo mount /dev/sda2 /mnt
sudo chroot /mnt
sudo apt-get install --reinstall linux-image-5.15.0-91-generic4.2 内核参数错误
当内核参数配置错误时,系统可能无法正常启动。
故障现象:
Kernel panic - not syncing: Attempted to kill init!排查步骤:
步骤1:编辑GRUB启动项
- 系统启动时按'e'键
- 找到linux行
- 修改内核参数
步骤2:临时禁用问题参数
bash
# 示例:禁用ACPI
linux /boot/vmlinuz-5.15.0-91-generic root=/dev/sda2 ro acpi=off
# 示例:进入单用户模式
linux /boot/vmlinuz-5.15.0-91-generic root=/dev/sda2 ro single步骤3:永久修改内核参数
bash
# 编辑GRUB配置文件
sudo vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=off"
# 更新GRUB
sudo update-grub5. 文件系统故障排查
5.1 文件系统损坏
当文件系统损坏时,系统无法正常挂载根文件系统。
故障现象:
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/sda2排查步骤:
步骤1:进入救援模式
- 系统启动时进入GRUB
- 选择recovery mode
- 选择root
步骤2:检查文件系统
bash
# 检查文件系统(不修复)
fsck -n /dev/sda2
# 检查并修复文件系统
fsck -y /dev/sda2
# 如果超级块损坏,使用备用超级块
fsck -b 32768 /dev/sda2步骤3:重启系统
bash
# 重启系统
reboot5.2 /etc/fstab配置错误
当/etc/fstab配置错误时,系统无法正常挂载文件系统。
故障现象:
emergency mode: Press Ctrl-D to continue or type root password for maintenance排查步骤:
步骤1:输入root密码
- 输入root密码
- 进入紧急模式
步骤2:查看错误信息
bash
# 查看系统日志
journalctl -xb | grep failed
# 查看fstab文件
cat /etc/fstab步骤3:重新挂载根文件系统为读写
bash
# 重新挂载根文件系统为读写
mount -o remount,rw /步骤4:修复/etc/fstab
bash
# 编辑fstab文件
vim /etc/fstab
# 注释掉错误的行
# /dev/sdb1 /data ext4 defaults 0 2
# 保存并退出步骤5:重启系统
bash
# 重启系统
reboot6. 服务启动故障排查
6.1 系统服务启动失败
当系统服务启动失败时,系统可能无法正常启动。
故障现象:
A start job is running for...
Job failed. See 'systemctl status xxx.service' for details.排查步骤:
步骤1:查看启动日志
bash
# 查看启动日志
journalctl -xb
# 查看失败的启动任务
journalctl -xb | grep failed步骤2:查看服务状态
bash
# 查看失败的服务
systemctl --failed
# 查看服务详细状态
systemctl status xxx.service步骤3:禁用失败的服务
bash
# 临时禁用服务
systemctl disable xxx.service
# 永久禁用服务
systemctl mask xxx.service步骤4:修复服务
bash
# 查看服务日志
journalctl -u xxx.service
# 检查服务配置
systemctl cat xxx.service
# 重启服务
systemctl restart xxx.service6.2 网络服务启动失败
当网络服务启动失败时,系统无法连接网络。
故障现象:
A start job is running for Network Manager Wait for Online...排查步骤:
步骤1:查看网络服务状态
bash
# 查看网络服务状态
systemctl status NetworkManager
# 查看网络接口
ip addr
# 查看网络配置
cat /etc/netplan/*.yaml步骤2:修复网络配置
bash
# 编辑网络配置
vim /etc/netplan/00-installer-config.yaml
# 修复配置错误
network:
ethernets:
ens33:
dhcp4: true
version: 2
# 应用配置
netplan apply步骤3:重启网络服务
bash
# 重启网络服务
systemctl restart NetworkManager
# 查看网络状态
ip addr7. 应急处理技巧
7.1 使用Live CD修复
当系统无法启动时,可以使用Live CD进行修复。
步骤1:使用Live CD启动
- 插入Linux Live CD
- 从Live CD启动系统
步骤2:挂载根分区
bash
# 查看分区
sudo fdisk -l
# 挂载根分区
sudo mount /dev/sda2 /mnt
# 挂载其他目录
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys步骤3:chroot到系统
bash
# chroot到系统
sudo chroot /mnt
# 进行修复操作步骤4:退出并重启
bash
# 退出chroot
exit
# 卸载分区
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt
# 重启系统
reboot7.2 使用单用户模式
当系统启动失败时,可以进入单用户模式进行修复。
步骤1:进入GRUB编辑模式
- 系统启动时按'e'键
- 编辑启动项
步骤2:修改内核参数
bash
# 找到linux行
linux /boot/vmlinuz-5.15.0-91-generic root=/dev/sda2 ro quiet splash
# 修改为
linux /boot/vmlinuz-5.15.0-91-generic root=/dev/sda2 ro single步骤3:启动系统
- 按'Ctrl+X'或'F10'启动
- 进入单用户模式
步骤4:进行修复操作
bash
# 挂载根文件系统为读写
mount -o remount,rw /
# 修复问题7.3 使用救援模式
当系统启动失败时,可以进入救援模式进行修复。
步骤1:进入救援模式
- 系统启动时按Shift键
- 选择Advanced options
- 选择recovery mode
步骤2:选择root
- 选择root
- 进入root shell
步骤3:进行修复操作
bash
# 修复问题8. 预防措施
8.1 定期备份
定期备份重要数据和配置文件。
bash
# 备份GRUB配置
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
# 备份fstab文件
cp /etc/fstab /etc/fstab.bak
# 备份内核配置
cp /etc/default/grub /etc/default/grub.bak8.2 定期检查文件系统
定期检查文件系统,及时发现和修复问题。
bash
# 检查文件系统
sudo fsck -n /dev/sda2
# 设置定期检查
sudo tune2fs -c 30 /dev/sda28.3 定期更新系统
定期更新系统和内核,修复已知问题。
bash
# 更新系统
sudo apt-get update
sudo apt-get upgrade
# 更新内核
sudo apt-get install linux-image-generic8.4 监控系统日志
定期监控系统日志,及时发现潜在问题。
bash
# 查看系统日志
sudo journalctl -xb
# 查看启动日志
sudo journalctl -b
# 查看错误日志
sudo journalctl -p err课程总结
这节课我们学习了系统启动故障排查。
核心内容:
- Linux系统启动流程
- 常见启动故障类型
- GRUB故障排查
- 内核故障排查
- 文件系统故障排查
- 服务启动故障排查
- 应急处理技巧
- 预防措施
重要命令:
update-grub:更新GRUB配置grub-install:安装GRUBfsck:检查和修复文件系统journalctl -xb:查看启动日志systemctl --failed:查看失败的服务systemctl status:查看服务状态
系统启动故障是Linux运维中最常见的问题之一,掌握这些排查方法和应急处理技巧,可以帮助你快速定位和解决问题,保障业务连续性。
课后练习
练习1(基础)
简述Linux系统的启动流程,至少列出5个主要步骤。
练习2(进阶)
假设系统启动时出现"emergency mode"提示,请描述排查步骤。
练习3(拓展)
假设GRUB损坏,系统无法启动,请描述如何使用Live CD修复GRUB。