Linux开机启动流程详解

_

引言

当你按下Linux电脑的电源键后,系统会经历一个复杂而有序的启动过程。了解这个过程对于系统故障排查、性能优化和安全加固都非常重要。本文将详细介绍Linux系统的完整启动流程。

Linux启动流程概览

Linux启动过程可以分为以下几个主要阶段:

  1. BIOS/UEFI阶段
  2. 引导加载程序(GRUB)阶段
  3. 内核加载阶段
  4. init系统阶段
  5. 登录管理器阶段

阶段1:BIOS/UEFI(Basic Input/Output System)

什么是BIOS?

BIOS是计算机开机后运行的第一个软件程序,它固化在主板的ROM芯片中。UEFI是BIOS的现代替代品,提供更强大的功能和更好的安全性。

启动过程

当你按下电源键时:

  1. 电源自检(POST)

    • BIOS/UEFI首先进行硬件自检(Power-On Self-Test)
    • 检查CPU、内存、硬盘、显卡等关键硬件
    • 如果发现问题,通常会发出蜂鸣声或显示错误信息
  2. 初始化硬件

    • BIOS初始化各种硬件设备
    • 设置中断向量表
    • 配置I/O端口和DMA通道
  3. 查找引导设备

    • BIOS按照启动顺序(Boot Order)查找可引导的设备
    • 常见设备:硬盘、USB设备、CD/DVD、网络PXE
    • 通常默认从硬盘的第一个扇区(MBR)读取引导代码

MBR vs GPT

  • MBR(Master Boot Record):传统的分区方案,位于磁盘的第一个扇区(512字节)
  • GPT(GUID Partition Table):现代的分区方案,支持更大的磁盘和更多的分区

阶段2:引导加载程序(Bootloader)

GRUB简介

GRUB(GRand Unified Bootloader)是Linux系统中最常用的引导加载程序。它的主要任务是:

  1. 加载Linux内核
  2. 提供启动菜单
  3. 允许用户选择不同的操作系统或内核

GRUB的工作原理

当BIOS/UEFI找到硬盘的引导扇区后,会加载GRUB的第一阶段(Stage 1)。

Stage 1 (446字节) → Stage 1.5 → Stage 2
  • Stage 1:位于MBR,只做最少的工作
  • Stage 1.5:位于MBR和第一个分区之间的扇区,加载文件系统驱动
  • Stage 2:位于/boot分区,提供完整的GRUB界面

GRUB菜单的出现

在密码重置文章中,你看到的GRUB菜单就是在这个阶段显示的。

默认情况下

  • GRUB菜单可能不会显示,或只显示很短的时间(通常5-10秒)
  • 如果系统只有一个操作系统,GRUB可能直接启动而不显示菜单

如何显示GRUB菜单

  1. 启动时按键

    • 在系统启动过程中,快速按下Shift键(BIOS系统)或Esc键(UEFI系统)
    • 不同发行版可能不同:Ubuntu通常是Shift,Fedora可能是Esc
  2. 修改GRUB配置

    # 编辑 /etc/default/grub
    sudo nano /etc/default/grub
    
    # 设置GRUB_TIMEOUT_STYLE为menu
    GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=10  # 显示10秒
    
    # 更新GRUB配置
    sudo update-grub  # Debian/Ubuntu
    # 或
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # RHEL/CentOS
    

GRUB菜单界面

GNU GRUB version 2.06

*Ubuntu
Advanced options for Ubuntu
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)

Use the ↑ and ↓ keys to select which entry is highlighted.
Press 'e' to edit the commands before booting, or 'c' for a
command-line interface.

菜单选项说明

  1. 操作系统条目:如"Ubuntu",直接启动默认内核
  2. 高级选项:包含恢复模式、不同内核版本等
  3. 内存测试:用于硬件诊断

重要按键

  • ↑/↓:选择启动项
  • Enter:启动选中项
  • e:编辑启动参数(密码重置时使用)
  • c:进入命令行模式

阶段3:内核加载

内核的启动

当你在GRUB菜单中选择一个条目并按Enter后:

  1. 内核加载

    • GRUB将Linux内核(vmlinuz)加载到内存
    • 同时加载初始化内存盘(initrd或initramfs)
  2. 内核解压和初始化

    • 内核在内存中解压自己
    • 初始化各种硬件设备
    • 启动中断处理程序
  3. 根文件系统挂载

    • 内核首先挂载一个临时的根文件系统(initramfs)
    • 这个临时的根文件系统包含必要的驱动程序
    • 随后切换到真正的根文件系统(/dev/sda1等)

initramfs的作用

initramfs(initial RAM filesystem)是一个压缩的cpio归档,包含:

  • 硬盘驱动程序
  • 文件系统驱动程序
  • 启动脚本
  • 必要的工具程序

它的作用是在真正的根文件系统挂载前,为内核提供必要的驱动支持。

阶段4:init系统

什么是init?

init是Linux系统启动的第一个进程(进程号PID=1),它是所有其他进程的祖先。

主流init系统

  1. SysVinit(传统的init系统)
  2. systemd(现代Linux发行版的默认选择)
  3. Upstart(Ubuntu曾使用过)
  4. OpenRC(Gentoo使用)

本文以systemd为例,因为它是最广泛使用的。

systemd的启动过程

当内核启动完成后,会执行:

/usr/lib/systemd/systemd

systemd然后:

  1. 读取默认目标(default.target)

    • 通常是graphical.target(图形界面)或multi-user.target(文本界面)
  2. 并行启动服务

    • 读取unit文件(.service、.target等)
    • 解析依赖关系
    • 并行启动服务以提高速度
  3. 执行初始化脚本

    • 挂载文件系统
    • 设置主机名
    • 启动网络服务
    • 启动日志系统

典型的启动日志

启动过程中,你会看到类似这样的信息:

[  OK  ] Started OpenBSD Secure Shell server.
[  OK  ] Started The Apache HTTP Server.
[  OK  ] Started MySQL Community Server.
[  OK  ] Started Raise network interfaces.
...
[  OK  ] Reached target Multi-User System.

阶段5:登录管理器

图形登录界面

如果系统配置了图形环境,启动过程会继续到:

  1. 显示管理器启动

    • GDM(GNOME Display Manager)
    • SDDM(Simple Desktop Display Manager)
    • LightDM(轻量级显示管理器)
  2. 登录界面显示

    • 等待用户输入用户名和密码
    • 提供会话选择(如GNOME、KDE、XFCE等)

文本登录

如果没有图形环境,系统会显示:

Ubuntu 22.04 LTS tty1

localhost login: _

启动时间优化

测量启动时间

# 使用systemd-analyze
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain

优化启动速度

  1. 禁用不必要的服务

    sudo systemctl disable service-name
    
  2. 并行启动服务

    • systemd默认已并行启动
  3. 使用启动图标(Plymouth)

    • 隐藏详细的启动日志
  4. 减少文件系统检查频率

    • 修改/etc/fstab中的挂载选项

故障排查

启动失败时的诊断

  1. 查看启动日志

    journalctl -b  # 查看本次启动日志
    journalctl -b -1  # 查看上次启动日志
    
  2. 单用户模式启动

    • 在GRUB菜单中选择"恢复模式"或"单用户模式"
  3. 内核参数调试

    • 在GRUB中添加init=/bin/bash直接启动shell
    • 添加debug参数启用详细日志

常见启动问题

  1. 文件系统错误

    • 系统会在启动时自动检查文件系统
    • 错误严重时可能要求手动fsck
  2. 显卡驱动问题

    • 可能导致系统卡在登录界面
    • 可以在GRUB中添加nomodeset参数
  3. 服务启动失败

    • 查看失败的服务并修复配置
    • 使用systemctl status service-name检查

安全加固

保护GRUB菜单

防止他人通过GRUB菜单修改启动参数:

# 设置GRUB密码
sudo grub-mkpasswd-pbkdf2
# 输出类似: grub.pbkdf2.sha512.XXXX...

# 编辑 /etc/grub.d/00_header
cat <<EOF
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.XXXX...
EOF

# 更新GRUB配置
sudo update-grub

BIOS/UEFI安全

  1. 设置启动密码
  2. 启用安全启动(Secure Boot)
  3. 禁用从USB启动(如果不需要)
  4. 启用TPM模块

总结

Linux的启动过程是一个精密而复杂的流程,从硬件检测到服务启动,每一步都有其特定的作用:

  1. BIOS/UEFI:硬件初始化和引导设备查找
  2. GRUB:提供启动菜单和内核加载
  3. 内核:系统核心,启动所有驱动程序
  4. systemd:启动系统和各种服务
  5. 登录管理器:用户登录入口

理解这个过程对于系统管理员来说至关重要,它不仅能帮助诊断启动问题,还能用于系统优化和安全加固。

当你在密码重置文章中看到"在GRUB菜单出现时按任意键"时,现在你应该知道这个菜单是在引导加载程序阶段显示的,而整个启动流程比你想象的更加复杂和精密。

transformer 2024-12-01
Hugo项目目录结构? 2025-01-11

评论区