跳转到内容

系统启动故障排查

课程介绍

系统启动故障是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-grub

3.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.cfg

3.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-grub

4. 内核故障排查

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-generic

4.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-grub

5. 文件系统故障排查

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
# 重启系统
reboot

5.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
# 重启系统
reboot

6. 服务启动故障排查

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.service

6.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 addr

7. 应急处理技巧

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

# 重启系统
reboot

7.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.bak

8.2 定期检查文件系统

定期检查文件系统,及时发现和修复问题。

bash
# 检查文件系统
sudo fsck -n /dev/sda2

# 设置定期检查
sudo tune2fs -c 30 /dev/sda2

8.3 定期更新系统

定期更新系统和内核,修复已知问题。

bash
# 更新系统
sudo apt-get update
sudo apt-get upgrade

# 更新内核
sudo apt-get install linux-image-generic

8.4 监控系统日志

定期监控系统日志,及时发现潜在问题。

bash
# 查看系统日志
sudo journalctl -xb

# 查看启动日志
sudo journalctl -b

# 查看错误日志
sudo journalctl -p err

课程总结

这节课我们学习了系统启动故障排查。

核心内容:

  • Linux系统启动流程
  • 常见启动故障类型
  • GRUB故障排查
  • 内核故障排查
  • 文件系统故障排查
  • 服务启动故障排查
  • 应急处理技巧
  • 预防措施

重要命令:

  • update-grub:更新GRUB配置
  • grub-install:安装GRUB
  • fsck:检查和修复文件系统
  • journalctl -xb:查看启动日志
  • systemctl --failed:查看失败的服务
  • systemctl status:查看服务状态

系统启动故障是Linux运维中最常见的问题之一,掌握这些排查方法和应急处理技巧,可以帮助你快速定位和解决问题,保障业务连续性。

课后练习

练习1(基础)

简述Linux系统的启动流程,至少列出5个主要步骤。

练习2(进阶)

假设系统启动时出现"emergency mode"提示,请描述排查步骤。

练习3(拓展)

假设GRUB损坏,系统无法启动,请描述如何使用Live CD修复GRUB。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径