教程 linux tutorial

Linux 系统启动过程

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 系统管理员来说是必不可少的。