# Linux 系统启动过程

URL: https://caijiao.org/linux/basic/boot-process
Source: docs/linux/basic/boot-process.md
Description: 深入解析Linux操作系统的启动流程，包括BIOS/UEFI初始化、引导加载程序、内核启动、初始化系统和登录过程。

Linux 系统的启动过程是一个复杂而有序的过程，从计算机加电到用户登录界面出现，涉及多个阶段和组件的协同工作。了解这个过程对于系统管理员和故障排除非常重要。

## 启动过程概述

Linux 系统启动可以分为以下几个主要阶段：

1. **BIOS/UEFI 初始化**
2. **引导加载程序**
3. **内核启动**
4. **初始化系统**
5. **用户登录**

## BIOS/UEFI 初始化

### BIOS (Basic Input/Output System)

#### 加电自检 (POST - Power-On Self Test)
- 计算机加电后，BIOS 首先执行加电自检
- 检查硬件设备是否正常工作（CPU、内存、硬盘等）
- 初始化基本的硬件设备

#### 引导设备选择
- BIOS 根据配置的启动顺序查找可引导设备
- 通常顺序为：硬盘、CD/DVD、USB 设备、网络等
- 找到可引导设备后，读取设备的第一个扇区（MBR - Master Boot Record）

### UEFI (Unified Extensible Firmware Interface)

#### UEFI 特性
- 现代计算机使用 UEFI 替代传统 BIOS
- 支持更大容量的硬盘（超过 2TB）
- 支持安全启动（Secure Boot）
- 使用 GPT (GUID Partition Table) 替代 MBR

#### UEFI 引导过程
- 初始化固件环境
- 加载 EFI 系统分区中的引导加载程序
- 提供更高级的硬件初始化和配置

## 引导加载程序

### 常见的引导加载程序

#### GRUB (GRand Unified Bootloader)
- 最常用的 Linux 引导加载程序
- 支持多种操作系统的引导
- 分为 GRUB Legacy 和 GRUB 2 两个主要版本

#### LILO (Linux Loader)
- 早期的 Linux 引导加载程序
- 功能相对简单，现在较少使用

#### systemd-boot
- 轻量级引导加载程序，由 systemd 项目提供
- 主要用于 UEFI 系统

### GRUB 2 引导过程

#### 阶段 1
- 位于 MBR 或 EFI 系统分区
- 负责加载阶段 1.5 或阶段 2

#### 阶段 1.5
- 如果文件系统在 MBR 之后有足够空间，加载此阶段
- 提供对文件系统的基本支持

#### 阶段 2
- 加载完整的 GRUB 环境
- 读取配置文件（`/boot/grub/grub.cfg`）
- 显示引导菜单

#### 引导菜单
- 显示可用的操作系统和内核选项
- 允许用户选择要启动的内核和选项
- 默认等待一段时间后自动启动默认选项

```bash
# 查看 GRUB 配置文件
cat /boot/grub/grub.cfg

# 编辑 GRUB 配置（通过模板）
/etc/default/grub
```

## 内核启动

### 内核加载
- 引导加载程序将内核映像和初始 RAM 磁盘（initrd 或 initramfs）加载到内存
- 解压内核映像
- 将控制权转交给内核

### 初始 RAM 磁盘
- 包含启动过程中需要的驱动程序和工具
- 用于挂载根文件系统
- 位于 `/boot/initrd.img` 或 `/boot/initramfs-<version>.img`

### 内核初始化
- 初始化硬件设备
- 加载内核模块
- 挂载虚拟文件系统（如 sysfs、procfs）
- 挂载根文件系统
- 启动初始化进程（PID 1）

```bash
# 查看当前运行的内核版本
uname -r

# 查看加载的内核模块
lsmod
```

## 初始化系统

### 初始化系统的作用
- 启动和管理系统服务
- 设置系统环境
- 管理运行级别/目标
- 启动用户空间程序

### SysVinit

#### 运行级别
- **0**: 关机
- **1**: 单用户模式
- **2**: 无网络多用户模式
- **3**: 完全多用户模式（命令行）
- **4**: 未使用
- **5**: 图形界面模式
- **6**: 重启

#### 启动过程
- 通过 `/etc/inittab` 配置默认运行级别
- 按顺序启动 `/etc/rc.d/rc<runlevel>.d/` 目录中的服务脚本

### Upstart
- Ubuntu 14.04 之前使用的初始化系统
- 事件驱动模型
- 支持并行启动服务

### systemd

#### systemd 简介
- 现代 Linux 发行版使用的初始化系统
- 由 Lennart Poettering 开发
- 采用并行启动方式，提高启动速度

#### 基本概念
- **Unit**: systemd 的基本单元，可以是服务、挂载点、套接字等
- **Service**: 表示一个后台服务
- **Target**: 类似传统的运行级别
- **Journal**: 系统日志系统

#### 主要 Targets
- `poweroff.target`: 关机
- `rescue.target`: 救援模式
- `multi-user.target`: 多用户命令行模式
- `graphical.target`: 图形界面模式
- `reboot.target`: 重启

#### systemd 启动流程
1. 内核启动 systemd 作为 PID 1
2. systemd 读取默认 target（通常是 graphical.target 或 multi-user.target）
3. systemd 启动该 target 依赖的所有服务单元
4. 服务单元通过 socket、D-Bus、文件系统变化等方式互相激活

```bash
# 查看默认 target
systemctl get-default

# 查看所有已加载的服务
systemctl list-units --type=service

# 查看系统启动时间
systemd-analyze
```

## 登录过程

### 显示管理器
- 图形界面环境下的登录界面
- 常见的显示管理器：
  - GDM (GNOME Display Manager)
  - LightDM
  - SDDM (Simple Desktop Display Manager)
  - LXDM

### 登录流程
1. 用户输入用户名和密码
2. 显示管理器验证凭据
3. 加载用户环境（`.bashrc`, `.profile` 等）
4. 启动用户的桌面会话或 shell

### 命令行登录
- 显示 `login:` 提示符
- 用户输入用户名和密码
- 系统验证凭据
- 启动用户的默认 shell

## 启动日志

### 查看启动日志

#### 使用 journalctl (systemd)
```bash
# 查看所有启动日志
journalctl -b

# 查看最近的启动日志，按时间倒序
journalctl -b -r

# 查看特定服务的启动日志
journalctl -u ssh.service
```

#### 使用 dmesg
```bash
# 查看内核启动消息
dmesg

# 实时监控内核消息
dmesg -w
```

#### 传统日志文件
- `/var/log/boot.log`: 启动过程日志
- `/var/log/messages` 或 `/var/log/syslog`: 系统消息

## 启动优化

### 分析启动时间
```bash
# 分析启动时间，显示各个服务的启动耗时
systemd-analyze blame

# 生成启动过程的图形化报告
systemd-analyze plot > boot-plot.svg
```

### 优化方法
- 禁用不需要的服务
- 使用固态硬盘 (SSD)
- 调整 GRUB 超时时间
- 优化内核参数

```bash
# 禁用不需要的服务
sudo systemctl disable <service-name>

# 调整 GRUB 超时时间
sudo nano /etc/default/grub
# 修改 GRUB_TIMEOUT 变量
sudo update-grub
```

## 故障排除

### 常见启动问题

#### GRUB 引导问题
- 修复 GRUB：
  ```bash
  # 使用 Live CD 启动后
  sudo mount /dev/sdaX /mnt  # 挂载根分区
  sudo mount --bind /dev /mnt/dev
  sudo mount --bind /proc /mnt/proc
  sudo mount --bind /sys /mnt/sys
  sudo chroot /mnt
  grub-install /dev/sda
  update-grub
  exit
  sudo umount /mnt/dev /mnt/proc /mnt/sys /mnt
  ```

#### 内核 panic
- 尝试使用较旧的内核版本启动
- 检查硬件问题，特别是内存
- 查看内核日志以确定原因

#### 服务启动失败
```bash
# 查看失败的服务
systemctl --failed

# 查看服务状态和错误信息
systemctl status <service-name>
```

### 单用户模式
单用户模式是一种特殊的运行级别，用于系统维护和修复：

#### 使用 GRUB 进入单用户模式
1. 在 GRUB 菜单中选择要启动的内核
2. 按 `e` 编辑启动参数
3. 找到以 `linux` 开头的行
4. 在行尾添加 `single` 或 `1` 或 `init=/bin/bash`
5. 按 `Ctrl+X` 启动系统

通过了解 Linux 系统的启动过程，您可以更好地管理系统、排除故障，并根据需要优化启动性能。每个阶段都有其特定的功能和配置选项，掌握这些知识对于 Linux 系统管理员来说是必不可少的。
