系列第 1 篇|先建立「从上电到应用跑起来」的完整图景适合:写过 C、但未必做过系统移植的读者
在开始用 Yocto「制作」一套 Linux 之前,我们先弄清一件事:按下电源键之后,到你能打开一个程序为止,机器里大致发生了什么。
为什么要先讲这个?因为所谓「自定义 Linux 系统镜像」,并不是魔法,而是在这条启动链条上,替换或裁剪某些环节——最常见的是裁剪 rootfs(根文件系统)以及里面的应用程序。你若不清楚链条长什么样,后面改配置时就会不知道自己在改哪一环。
人们常说「Linux 启动」,其实至少包含两层意思。建议一开始就分开记。
启动阶段:系统由哪几块「材料」组成
这里问的是静态结构,好比问一辆车有发动机、变速箱、轮子。对 Linux 来说,最核心的三块是:
它们是「零件清单」:少了哪一块,系统都撑不起来。
启动流程:上电后控制权按什么顺序交接
这里问的是时间顺序,好比问:先打火、再挂挡、再起步。可以写成:
上电 → 引导程序 → 内核 → 根文件系统→ init → 服务 → 应用程序英文里常写作:
power on → bootloader → linux kernel→ rootfs → init → services → application一句话区分:阶段回答「有哪些角色」;流程回答「谁先上场、谁后上场」。
Bootloader(引导加载程序)
电脑刚上电时,CPU 还不知道 Linux 在哪里。主板上的固件(firmware,可以理解为出厂时固化的一小段程序)会先跑起来,然后通常把控制权交给 Bootloader。
Bootloader 的工作可以想象成:
常见名字:GRUB、UEFI、U-Boot、Little Kernel。细节见系列第 2 篇。本系列后面动手验证含两条线:QEMU 虚机快速跑通,以及 PC 上的 UEFI + GRUB 双系统。
Kernel(Linux 内核)
内核是操作系统的「核心引擎」。它不是给你点图标用的桌面,而是负责:
内核自己初始化告一段落后,还要做一件对后续至关重要的事:把根文件系统挂载上来,并启动用户空间的第一个进程,通常叫 init。详见系列第 3 篇。
Rootfs(根文件系统)
Rootfs 是 Root File System 的缩写,中文常叫「根文件系统」。
你可以把它理解成:内核挂载成功之后,你在 shell 里看到的那个以 / 开头的整个目录树。/bin、/etc、/usr、/home 里的命令、配置文件、动态库、应用程序,大多都住在 rootfs 里。
没有 rootfs,内核即使跑起来了,也几乎没有「用户能用的程序」可执行。详见系列第 4 篇。
下面按时间顺序,把整条链走一遍:
Power on(上电)你按下电源键。CPU 复位,开始执行固件入口代码。对写过单片机的人来说,这很像上电后跑 Reset_Handler:还没有操作系统,只有最早的那一点代码在执行。
Bootloader(引导加载程序)固件找到并启动 Bootloader(在 PC 上常常是 UEFI 再加载 GRUB)。Bootloader 把 Linux 内核读进内存,准备好参数,然后跳转。
Linux kernel(内核)内核接管 CPU,做一系列内部初始化,加载必要驱动,让硬盘、控制台等关键设备可用。
Rootfs(根文件系统)内核按照启动参数(例如 root=)找到存放根文件系统的分区或设备,把它挂载为 /。从此,磁盘上的目录树对系统「可见」了。
init(一号进程)内核在 rootfs 里启动第一个用户空间程序,进程号为 1,习惯上叫 init。可以把它理解成用户空间的「总指挥」:后面绝大多数进程都由它直接或间接拉起来。
Services(服务)init 会按策略启动一批后台服务:网络、日志、登录界面相关组件等。传统方式用脚本(常称 initrc / SysV init 风格);现代发行版多用 systemd 及其 unit 配置文件。
Application(应用程序)到这一步,你才能登录、打开终端、运行自己的业务程序——也就是我们平时说的「系统已经起来了」。
完整时序再看一眼:
power on → bootloader → linux kernel → rootfs → init → services (initrc / systemd) → application交接关系可以记成:
上电 └→ Bootloader(加载内核并跳转) └→ 内核(挂载根文件系统) └→ init(PID 1) └→ 服务 └→ 应用程序/ 目录树:命令、库、配置、应用的家 | |
同样的骨架,在 PC 和嵌入式板上「演员」不同:
细节可以差很多,但「先引导、再内核、再根文件系统、再 init」这条骨架是通的。本系列后面动手验证:先 QEMU,再按 PC 路径做真机双系统。
读完本篇,你至少应该能不看资料写出:
power on → bootloader → linux kernel→ rootfs → init → services → application并说出 bootloader、kernel、rootfs 各自解决什么问题。