Linux启动流程
本文最后更新于219 天前,其中的信息可能已经过时,如有错误请发送邮件到2156936367@qq.com

当我们按下Linux电源键的时候,背后发生了什么? 首先,介绍一下整个流程

  1. BIOS/UEFI
  2. BootLoader(GRUB)
  3. 内核加载(Kernel)
  4. initramfs(临时根文件系统)
  5. init/systemd 初始化
  6. 用户空间(服务 + 登录) 接下来,详细讲解每一个流程。

一、BIOS / UEFI 阶段(硬件初始化)

首先,开机后运行主板固件,BIOS/UEFI程序启动,运行加电自检(POST,确保不同的硬件组件在启动之前都是能够正常工作的)

模式特点读取 BootLoader
BIOS传统模式(MBR)读取硬盘MBR,前512字节
UEFI现代模式(GPT + EFI分区)读取EFI分区中的.efi文件

流程:

  1. 自检(POST)
  2. 初始化(检查) CPU、内存、硬盘等硬件
  3. 按启动顺序查找可启动设备
  4. 加载 BootLoader(读取引导程序)

二、BootLoader(引导程序)

常见的就是 GRUB2(LILO已经过时)

流程:

  1. 读取配置文件 /boot/grub2/grub.cfg
  2. 显示菜单
  3. 选择内核
  4. 传递启动参数
  5. 加载内核 /boot/vmlinuz-xxx 到内存
  6. 加载临时根文件系统,/boot/initramfs-xxx.img 到内存
  7. 把控制权交给内核

三、内核(Kernel)启动

Linux内核开始执行

流程:

  1. 解压自身,/boot/vmlinuz-xxx是压缩的内核镜像
  2. 初始化核心组件,内存管理,进程管理……其中内存管理:a.建立页表,b.启用虚拟内存
  3. 初始化设备驱动:a.磁盘驱动、b.文件系统驱动、c.网络驱动
  4. 挂载临时根文件系统(initramfs):initramfs是内存中的临时根文件系统
  • 作用:

a.加载系统真正的根文件系统root所需的驱动(帮忙驱动),内核初期还不会访问磁盘(缺驱动)

b.找到真正的root分区(/dev/sda2)

c.挂载root分区

d.切换根目录root

四、init / systemd(用户空间初始化)

内核启动第一个用户态进程:systemd (PID 1)

早期:/sbin/init(SysV)

现代:systemd:整个用户空间的主管

  • 作用:

a.所有进程的祖先

b.读取配置 /etc/systemd/system/

c.systemd 根据 /etc/systemd/system/default.target 确定启动级别(如多用户模式或图形界面)。

  • systemd 启动流程:
  1. 挂载文件系统 /proc,/dev…
  2. 启动 udev(设备管理)
  3. 启动日志(journald)
  4. 启动网络
  5. 启动服务(sshd / cron / dbus 等)
  6. 启动图形界面(如果有)

注意:这里是并行启动服务,快所以好,这是systemd启动快的原因,之前叫init串行服务,比较慢,后面被systemed 取代

六、用户空间(登录阶段)

最终会看到:

启动 getty 等待用户输入用户名密码,或者启动图形桌面环境(GNOME/KDE)。

  • 服务器:终端登录(tty)
  • 桌面:GUI 登录界面(GDM/KDM)

登陆后:

启动shell,读取配置 ~/.bashrc,~/.profile….

面试题

  1. Linux 启动第一个进程是什么?它的 PID 是多少?在现代 Linux 中是 systemd,在老版本中是 init。其 PID 永远是 1。
  2. 什么是 initramfs (或 initrd)?它的作用是什么?它是一个临时的根文件系统。因为内核不知道如何驱动所有的硬件(如 RAID 卡、复杂的驱动),initramfs 包含了这些驱动。内核先挂载它,加载驱动,然后再挂载真正的硬盘根分区root。
  3. systemd 相比之前的 SysVinit 有什么优势?并行启动(提高速度)、按需启动、依赖检查、cgroups 隔离服务、日志统一管理 (journalctl)。
  4. 如何进入单用户模式(救援模式)?在 GRUB 菜单按 e 编辑,在 linux16 或 linux 行末尾添加 rd.break 或 single(或 init=/bin/bash),然后 Ctrl+X 启动。
  5. MBR 和 GPT 的区别?MBR 最多支持 4 个主分区,支持 2TB 以下硬盘;GPT 支持无限分区(常用 128 个),支持 2TB 以上,且有备份分区表更安全。
  6. 僵尸进程与 PID 1如果 PID 1 的进程(systemd)挂了,系统会立即 Kernel Panic。systemd 还有一个职责是“收养”孤儿进程(孤儿进程进程号是PPID1,假设是1)并回收僵尸进程。
  7. Systemd Target(启动级别)
    • multi-user.target (相当于 init 3,命令行)
    • graphical.target (相当于 init 5,图形化)
    • 面试官可能会问:如何修改默认启动级别?(systemctl set-default …)
  8. 关键配置文件位置
    • GRUB2 配置:/etc/default/grub 和 /boot/grub2/grub.cfg。
    • 内核参数:在 /etc/sysctl.conf 或 GRUB 启动行定义。
    • 文件系统挂载:/etc/fstab。
  9. UEFI 启动与 Secure Boot
    • 现代机器多用 UEFI。UEFI 不读取 MBR,而是读取 EFI 系统分区 (ESP) 里的 .efi 文件。如果开启了 Secure Boot,未签名的内核将无法启动。
  10. 启动速度优化
    • 可以使用 systemd-analyze blame 查看哪个服务启动最慢。
    • 可以使用 systemd-analyze critical-chain 查看启动关键链。
觉得有帮助可以投喂下博主哦~感谢!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
Hello! I'm 臭企鹅!