Linux启动流程
本文最后更新于44 天前,其中的信息可能已经过时,如有错误请发送邮件到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
小恐龙
花!
上一篇
下一篇