主题
Linux 系统启动过程
Linux 系统的启动过程是一个复杂而有序的过程,从计算机加电到用户登录界面出现,涉及多个阶段和组件的协同工作。了解这个过程对于系统管理员和故障排除非常重要。
启动过程概述
Linux 系统启动可以分为以下几个主要阶段:
- BIOS/UEFI 初始化
- 引导加载程序
- 内核启动
- 初始化系统
- 用户登录
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 启动流程
- 内核启动 systemd 作为 PID 1
- systemd 读取默认 target(通常是 graphical.target 或 multi-user.target)
- systemd 启动该 target 依赖的所有服务单元
- 服务单元通过 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
登录流程
- 用户输入用户名和密码
- 显示管理器验证凭据
- 加载用户环境(
.bashrc,.profile等) - 启动用户的桌面会话或 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 进入单用户模式
- 在 GRUB 菜单中选择要启动的内核
- 按
e编辑启动参数 - 找到以
linux开头的行 - 在行尾添加
single或1或init=/bin/bash - 按
Ctrl+X启动系统
通过了解 Linux 系统的启动过程,您可以更好地管理系统、排除故障,并根据需要优化启动性能。每个阶段都有其特定的功能和配置选项,掌握这些知识对于 Linux 系统管理员来说是必不可少的。