当前位置:首页>Linux>从零构建 Linux|01 启动流程总览

从零构建 Linux|01 启动流程总览

  • 2026-10-11 06:56:48
从零构建 Linux|01 启动流程总览

系列第 1 篇|先建立「从上电到应用跑起来」的完整图景适合:写过 C、但未必做过系统移植的读者

在开始用 Yocto「制作」一套 Linux 之前,我们先弄清一件事:按下电源键之后,到你能打开一个程序为止,机器里大致发生了什么。

为什么要先讲这个?因为所谓「自定义 Linux 系统镜像」,并不是魔法,而是在这条启动链条上,替换或裁剪某些环节——最常见的是裁剪 rootfs(根文件系统)以及里面的应用程序。你若不清楚链条长什么样,后面改配置时就会不知道自己在改哪一环。

两个容易混淆的概念

人们常说「Linux 启动」,其实至少包含两层意思。建议一开始就分开记。

启动阶段:系统由哪几块「材料」组成

这里问的是静态结构,好比问一辆车有发动机、变速箱、轮子。对 Linux 来说,最核心的三块是:

  1. Bootloader(引导加载程序)
  2. Kernel(内核)
  3. Rootfs(根文件系统)

它们是「零件清单」:少了哪一块,系统都撑不起来。

启动流程:上电后控制权按什么顺序交接

这里问的是时间顺序,好比问:先打火、再挂挡、再起步。可以写成:

上电 → 引导程序 → 内核 → 根文件系统→ init → 服务 → 应用程序

英文里常写作:

power on → bootloader → linux kernel→ rootfs → init → services → application

一句话区分:阶段回答「有哪些角色」;流程回答「谁先上场、谁后上场」。

启动阶段:三块积木分别干什么

Bootloader(引导加载程序)

电脑刚上电时,CPU 还不知道 Linux 在哪里。主板上的固件(firmware,可以理解为出厂时固化的一小段程序)会先跑起来,然后通常把控制权交给 Bootloader。

Bootloader 的工作可以想象成:

  1. 把硬件带到一个「勉强能干活」的状态(比如能访问内存、能读硬盘);
  2. 从存储介质上找到内核映像文件(一个很大的二进制文件);
  3. 把它读进内存合适的位置;
  4. 告诉内核一些启动参数(例如根文件系统在哪个分区);
  5. 跳转到内核入口,把 CPU 交给内核。

常见名字:GRUB、UEFI、U-Boot、Little Kernel。细节见系列第 2 篇。本系列后面动手验证含两条线:QEMU 虚机快速跑通,以及 PC 上的 UEFI + GRUB 双系统。

Kernel(Linux 内核)

内核是操作系统的「核心引擎」。它不是给你点图标用的桌面,而是负责:

  1. 管理 CPU 时间(进程调度)
  2. 管理内存
  3. 通过驱动程序(driver)操作硬盘、网卡、键盘等硬件
  4. 提供文件系统、网络等基础能力

内核自己初始化告一段落后,还要做一件对后续至关重要的事:把根文件系统挂载上来,并启动用户空间的第一个进程,通常叫 init。详见系列第 3 篇。

Rootfs(根文件系统)

Rootfs 是 Root File System 的缩写,中文常叫「根文件系统」。

你可以把它理解成:内核挂载成功之后,你在 shell 里看到的那个以 / 开头的整个目录树。/bin、/etc、/usr、/home 里的命令、配置文件、动态库、应用程序,大多都住在 rootfs 里。

没有 rootfs,内核即使跑起来了,也几乎没有「用户能用的程序」可执行。详见系列第 4 篇。

启动流程:用文字把时序走一遍

下面按时间顺序,把整条链走一遍:

  1. Power on(上电)你按下电源键。CPU 复位,开始执行固件入口代码。对写过单片机的人来说,这很像上电后跑 Reset_Handler:还没有操作系统,只有最早的那一点代码在执行。

  2. Bootloader(引导加载程序)固件找到并启动 Bootloader(在 PC 上常常是 UEFI 再加载 GRUB)。Bootloader 把 Linux 内核读进内存,准备好参数,然后跳转。

  3. Linux kernel(内核)内核接管 CPU,做一系列内部初始化,加载必要驱动,让硬盘、控制台等关键设备可用。

  4. Rootfs(根文件系统)内核按照启动参数(例如 root=)找到存放根文件系统的分区或设备,把它挂载为 /。从此,磁盘上的目录树对系统「可见」了。

  5. init(一号进程)内核在 rootfs 里启动第一个用户空间程序,进程号为 1,习惯上叫 init。可以把它理解成用户空间的「总指挥」:后面绝大多数进程都由它直接或间接拉起来。

  6. Services(服务)init 会按策略启动一批后台服务:网络、日志、登录界面相关组件等。传统方式用脚本(常称 initrc / SysV init 风格);现代发行版多用 systemd 及其 unit 配置文件。

  7. Application(应用程序)到这一步,你才能登录、打开终端、运行自己的业务程序——也就是我们平时说的「系统已经起来了」。

完整时序再看一眼:

power on  → bootloader  → linux kernel  → rootfs  → init  → services (initrc / systemd)  → application

交接关系可以记成:

上电  └→ Bootloader(加载内核并跳转)        └→ 内核(挂载根文件系统)              └→ init(PID 1)                    └→ 服务                          └→ 应用程序

每一步对照(方便背下来)

环节
一句话
power on
复位,跑最早的固件代码。此时还没有 Linux
bootloader
「搬运工 + 传令兵」:把内核搬进内存,并告诉它 root 在哪
linux kernel
操作系统核心:管硬件与进程,但不等于「桌面」
rootfs
磁盘上的 / 目录树:命令、库、配置、应用的家
init
用户空间第一个进程(PID 1),后面进程的「祖先」之一
services
后台守护进程集合:网络、日志、登录等相关
application
你真正关心的业务程序,例如编辑器、服务器、你的 hello

两条典型现实路径

同样的骨架,在 PC 和嵌入式板上「演员」不同:

场景
典型路径
特点
PC(本系列 demo)
UEFI → GRUB → Linux 内核 → rootfs → systemd → 应用
有标准固件,常要支持双系统菜单
嵌入式板卡
片内 ROM/SPL → U-Boot → Linux 内核 → rootfs → BusyBox init → 应用
板子差异大,引导更贴近芯片厂商方案

细节可以差很多,但「先引导、再内核、再根文件系统、再 init」这条骨架是通的。本系列后面动手验证:先 QEMU,再按 PC 路径做真机双系统。

和后续文章怎么衔接

  1. 第 2~4 篇:分别把 bootloader、kernel、rootfs / init / services 讲透一点。
  2. 第 5 篇:假设系统已经能登录,讲解如何用包管理器安装应用。
  3. 第 6~11 篇:用 Yocto 自己生成这条链所需的镜像,并在 x86_64 Windows PC 上用 U 盘做成双系统跑通。

读完本篇,你至少应该能不看资料写出:

power on → bootloader → linux kernel→ rootfs → init → services → application

并说出 bootloader、kernel、rootfs 各自解决什么问题。

系列文章列表:

从零构建 Linux 系统

最新文章

随机文章