Orange的运维学习日记–30.Linux启动原理详解及故障排查
文章目录

从按下电源键到获得登录提示,CentOS 7 的启动要经历多层次的硬件检测、引导加载、内核初始化以及 systemd 启动等环节。理解这一流程有助于故障排查和性能优化
系统固件阶段
系统刚通电时,UEFI 或 BIOS 会执行开机自检(POST),验证 CPU、内存、键盘、硬盘等关键硬件是否工作正常
POST 完成后,固件按照用户设置的启动顺序(硬盘、光驱、USB)查找可引导设备
- Legacy BIOS 会读取 MBR(主引导记录)前 446 字节并跳转到该位置执行引导程序
- UEFI 则扫描 EFI 分区中的
.efi
可执行文件,通过 EFI Shell 或 EFI 引导管理器启动
在此阶段按 F2、F12、Del 等键可进入固件设置界面,用于:
- 调整启动设备顺序
- 启用或禁用安全启动
- 修改 CPU、内存及外围设备参数
引导加载程序:GRUB2
MBR/GPT 引导概念
- 在 BIOS+MBR 模式下,主启动记录(512 字节)分为引导代码区、分区表和结束标志(0xAA55)。BIOS 读取这段代码并转交控制
- 在 UEFI+GPT 模式下,固件直接解析 EFI 分区(FAT 格式),执行
.efi
文件来加载内核
安装与配置
GRUB2 是现代 Linux 默认的引导加载器,负责在多系统环境中展示启动菜单,并将内核与 initramfs 装载到内存
-
安装到磁盘
grub2-install /dev/sda
-
配置脚本与变量
/etc/default/grub
:定义超时、默认启动项、内核参数/etc/grub.d/
:多个脚本按数字顺序合成最终配置
-
生成最终配置
grub2-mkconfig -o /boot/grub2/grub.cfg
启动菜单与加密
- 调整超时时间
编辑GRUB_TIMEOUT
并更新配置 - 追加内核参数
在GRUB_CMDLINE_LINUX
中加入console=ttyS0
、rhgb quiet
等 - 汉化或主题定制可通过
/etc/grub.d/05_debian_theme
等脚本修改 - 若需保护引导项,可在
/boot/grub2/user.cfg
中配置GRUB2_PASSWORD
并生成 PBKDF2 哈希
内核与 initramfs 阶段
内核加载
GRUB2 将指定内核映像 (vmlinuz-*
) 和初始内存盘 (initramfs-*.img
) 加载到内存
内核解压后借助 initramfs 中的驱动和工具完成根文件系统挂载
dracut 与 initramfs
CentOS 7 使用 dracut 生成 initramfs,包含常见文件系统和存储驱动
-
配置目录:
/etc/dracut.conf.d/
-
手动重建:
dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
-
查看内容:
lsinitrd /boot/initramfs-$(uname -r).img
在模块丢失、LVM、RAID 或网络根挂载场景中,initramfs 的完整性与正确配置至关重要
systemd 启动阶段
内核完成初始化后,执行 /sbin/init
(CentOS 中为 systemd),PID 1 由 systemd 接管启动流程
systemd 并行调度各类单元(unit),包含服务(.service)、挂载点(.mount)、目标(.target)等
target 及依赖
sysinit.target
:完成基础初始化,如挂载/etc/fstab
、启动日志(journald)、加载 udev 规则basic.target
:在 sysinit 之后,启动网络、设备热插拔、定时任务multi-user.target
:多用户文本模式,常用于服务器,无图形界面graphical.target
:在 multi-user 基础上启动图形登录管理器(如 GDM)
查看依赖:
systemctl list-dependencies graphical.target
反向依赖:
systemctl list-dependencies sshd.service --reverse
并行化与日志
systemd 通过 socket-activated、DBus-activated 等机制加速启动
日志默认写入二进制格式,可使用 journalctl
查看历史与实时日志
运行级别映射
CentOS 6 及更早版本使用 SysV runlevel(0–6)
CentOS 7 全面转向 systemd target
Runlevel | Target | 描述 |
---|---|---|
0 | poweroff.target | 关机 |
1 | rescue.target | 单用户模式、系统修复 |
2 | 保留 | |
3 | multi-user.target | 多用户文本界面 |
4 | 保留 | |
5 | graphical.target | 多用户图形界面 |
6 | reboot.target | 重启 |
切换:
systemctl isolate multi-user.target
systemctl isolate graphical.target
设为默认:
systemctl set-default multi-user.target
systemctl get-default
重置 root 密码方法
方法一:rd.break 暂停至 initramfs
1 在 GRUB 编辑菜单 linux16
行尾追加 rd.break
2 启动后进入 initramfs shell,根分区挂载在 /sysroot
(只读)
3 重新挂载并切换根
mount -o remount,rw /sysroot
chroot /sysroot
4 重置密码并标记 SELinux 重新标记
passwd root
touch /.autorelabel
5 退出两次,系统继续启动并完成 SELinux 重标记
方法二:init=/bin/bash 直接进入
1 linux16
行尾追加 init=/bin/bash
2 启动后根文件系统只读,重新挂载为读写后:
mount -o remount,rw /
passwd -d root
touch /.autorelabel
exec /usr/lib/systemd/systemd
3 系统接管并继续启动,首次登录无需密码
/etc/fstab 引起的启动故障
/etc/fstab
定义系统文件系统和交换分区的自动挂载,语法不当可能导致启动卡顿或进入 emergency
常见故障场景
- 挂载点不存在
系统会自动创建对应目录并挂载,无需人工干预 - 设备名或 UUID 错误
systemd 在超时(约 1 分 30 秒)后进入 emergency 模式,需手动修改或注释错误行 - 文件系统损坏
initramfs 内尝试自动修复失败后进入 emergency
可使用xfs_repair
、fsck.ext4
等工具修复后继续启动
防护建议
- 建议使用 UUID 或 LABEL 代替
/dev/sdXn
- 为非关键挂载项添加
nofail
或x-systemd.device-timeout=10
- 定期运行 fsck 或 xfs_repair 检查磁盘健康
grub2 故障排查与修复
MBR 结构回顾
主引导扇区(512B)划分为:
- 引导程序区(446B)
- 分区表(4×16B)
- 结束标志(2B,0xAA55)
引导区损坏
使用以下命令清空 MBR 前 446 字节后将无法正常从硬盘引导
dd if=/dev/zero of=/dev/sda bs=1 count=446
修复步骤:
1 从光盘或 U 盘启动进入 Rescue 模式
2 chroot /mnt/sysimage
并确认读写挂载
3 执行
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
4 退出 chroot 并重启
引导映像丢失
误操作移动或删除 /boot/vmlinuz-*
或 initramfs 后,GRUB 菜单将报错找不到文件
恢复策略:
- 在 Rescue 模式挂载
/boot
,从安装包或其他服务器复制文件 - 重新运行
grub2-mkconfig
更新配置
硬盘加密与安全思考
通过 LUKS 对整盘加密,可避免物理窃取后数据泄露
/boot
分区保持明文,以便 GRUB 读取- 解密逻辑盘后,系统才能挂载根分区
- rescue 环境或 LiveCD 也需输入解密密码才能访问加密分区
部署建议:
- 使用 TPM+PIN 增强开机安全
- 对
/etc/crypttab
和 dracut 配置进行适当加固 - 定期更换和备份密钥
务器复制文件
- 重新运行
grub2-mkconfig
更新配置
硬盘加密与安全思考
通过 LUKS 对整盘加密,可避免物理窃取后数据泄露
/boot
分区保持明文,以便 GRUB 读取- 解密逻辑盘后,系统才能挂载根分区
- rescue 环境或 LiveCD 也需输入解密密码才能访问加密分区
部署建议:
- 使用 TPM+PIN 增强开机安全
- 对
/etc/crypttab
和 dracut 配置进行适当加固 - 定期更换和备份密钥