[搬运] Linux 启动流程
本文整理的所有内容都来自 YouTube 频道“Bit Byte Talks”发布的视频《Linux boot process Explained - Animated》。 Link: Linux boot process Explained - Animated
Linux 启动流程
你按下过 Linux 机器的电源键,然后等着吗?屏幕闪烁,滚过一些文字,然后“砰”的一声,桌面出现了。那几秒钟里究竟发生了什么?本文从按下电源键的那一刻,一路讲到眼前这个漂亮的桌面。
BIOS/UEFI 与 POST
最开始,CPU 醒了过来——但它还不知道该做什么。它不认识 Linux,也不认识你的硬盘,它只知道一件事:去内存中某个特定地址取第一批指令。而这些指令来自主板上的一枚特殊芯片,叫 BIOS;在现代系统上则是它更酷的表亲 UEFI。
BIOS 全称 Basic Input Output System(基本输入输出系统),自个人计算早期就存在。你可以把它想成做晨间检查的人:一旦电流通过主板,BIOS 就醒来,运行一个叫 POST(Power On Self Test,加电自检)的测试——检查 RAM 是否正常、CPU 是否工作、有没有键盘、显示器是否连接。如果一切通过,BIOS 就点头放行,说“好,去找点能启动的东西”;如果失败,你可能会听到蜂鸣码或看到错误信息。BIOS 就是电脑在做其他任何事之前的健康检查。
现代系统用 UEFI 取代了老式 BIOS。UEFI 全称 Unified Extensible Firmware Interface(统一可扩展固件接口),像打了强心剂的 BIOS:有图形界面、支持更大的硬盘、启动更快,还加入了 Secure Boot 之类的安全特性。如果 BIOS 是纸质的旧式清单,UEFI 就是带触摸屏的数字平板。两者做的是同一件根本的事——初始化硬件、找到从哪里启动,只是 UEFI 的方式强大灵活得多。
寻找引导程序(MBR / EFI)
POST 之后,BIOS 或 UEFI 需要找到操作系统。它会检视启动设备列表:也许你的 SSD、U 盘,或者网络设备。在传统 BIOS 系统上,它读取存储设备的头 512 字节——这片极小区域叫 MBR(Master Boot Record,主引导记录),就像书前面的索引,只够说明“真正的启动内容在那边”。而在 UEFI 系统上,它会寻找一个特殊的 EFI 分区。无论哪种方式,目标都一样:找到引导程序(bootloader)。
GRUB
在多数 Linux 系统上,引导程序叫 GRUB(Grand Unified Bootloader,大一统引导程序)。就是你开机时见过的那个熟悉界面——一个菜单,列着 Ubuntu、Advanced options,双系统时还有 Windows Boot Manager。
GRUB 的全部职责,就是把 Linux 内核加载进内存。它知道内核在磁盘上的位置,加载它、把配置交给它,然后说“好,内核,你上”。GRUB 就像接力赛里传递接力棒的跑者,把棒子交给 Linux 本身。
内核初始化
接下来 Linux 内核登场,它是整个操作系统的心脏——管理 CPU 时间、内存、存储、网络,一切。
GRUB 加载内核后,内核开始搭建自己的营地。它先解压自身,因为内核为了节省空间是压缩存放的,就像一个会自动解压的 zip 文件。然后它初始化 CPU、检测硬件、建立内存管理。这就像一个新任经理走进办公室,立刻盘点手头可用的每一项资源。
内核早期会遇到一个棘手的问题:它需要访问硬盘来加载更多文件,但和硬盘对话的驱动可能就在硬盘上。鸡生蛋的问题,对吧?Linux 用一个叫 initramfs(initial RAM file system,初始 RAM 文件系统)的东西漂亮地解决它——一个住在 RAM 里的、临时的迷你 Linux。内核先加载这个小系统,用它加载存储设备的正确驱动,再挂载真正的文件系统。这就像钱包里带一把备用钥匙,去打开存放真正钥匙的那扇门。
挂载根文件系统
一旦内核用 initramfs 设置好硬件、加载了正确的驱动,就该挂载根文件系统了。这是你真正的 Linux 文件系统,位于 SSD 或硬盘上,装着你的所有文件、程序和系统数据。内核读取磁盘,找到根分区(通常标记为斜杠 /),把它挂载起来。挂载,就是把这个存储设备接上、让它可被访问。至此,Linux 可以访问运行整场演出所需的全部系统文件了。
systemd(PID 1)
这里有一个非常重要的里程碑:内核启动第一个、也是唯一一个进程——进程号 1。在现代 Linux 上它叫 systemd,在更老的系统上叫 init,再早还有其他 init 系统。但今天,systemd 统治着大多数主流 Linux 发行版。
这个单一的进程 PID 1,是系统上所有其他进程的父进程。Linux 上运行的任何东西,要么由 systemd 启动,要么是 systemd 启动之物衍生出来的后代。它是最高的管理者,是把所有其他人唤醒的那一个。
那么 systemd 到底做什么?它读取一批叫 unit 文件的配置文件,这些文件描述服务、挂载、套接字和 target。systemd 里的 target 就像一个里程碑式的目标,例如到达 multi-user.target,意味着所有基础服务都在运行、多个用户可以登录。
systemd 并行启动服务,而不是一个一个来,这是现代 Linux 启动如此之快的原因之一。网络、日志、音频、蓝牙,systemd 同时把它们拉起来,同时检查依赖,确保没有任何东西先于它所需要的前提启动。
关键服务
systemd 拉起的关键服务里有几个值得一说。
首先是 udev,设备管理器:它检测连接到你系统的所有硬件设备——U 盘、显卡、键盘,并为每一个加载正确的驱动。
然后是网络管理器,它负责确定你的 IP 地址、连接 Wi-Fi 或建立有线连接。
还有日志守护进程 journald,它记录下发生的一切,像系统的一部黑匣子记录仪。
这些服务几乎同时启动,省下宝贵的启动时间。
target 检查点
systemd 逐个走完它的 target,你可以把它们想成比赛中的检查点。先是 basic.target——核心系统在运行;然后是 multi-user.target——所有服务就绪,系统可供多用户通过命令行使用;最后,如果你跑的是桌面,就奔向 graphical.target。这是启动显示服务器的检查点,显示服务器要么是经典的 X11,要么是更新的 Wayland 合成器。显示服务器让你的 GPU 与屏幕对话、显示图形窗口,没有它,你就只能对着一个文本终端。
显示管理器与桌面
有了显示服务器,下一块拼图是显示管理器,有时也叫登录管理器。这是你在桌面加载前看到的图形登录界面。在 Ubuntu 上你会看到 GDM(GNOME Display Manager),其他发行版上可能是 LightDM、SDDM 等。
显示管理器的职责简单却重要:认证你。它接收你的用户名和密码,对照系统的用户数据库验证,通过后就启动你的桌面会话。把它想成桌面环境前门的保安。你输入密码、回车,桌面环境就启动了。
什么是桌面环境?它是你交互的整个图形层:任务栏、文件管理器、窗口装饰、系统设置、应用启动器。在 Ubuntu 上是 GNOME,在 Linux Mint 上是 Cinnamon,在 KDE 系发行版上是 Plasma。每个桌面环境都有自己的一套组件需要加载——窗口管理器、负责视觉特效的合成器、面板、通知系统,所有这些都在你登录时启动。
D-Bus 与个人会话
在幕后,随着桌面加载,一个叫 D-Bus 的关键服务正在运行。D-Bus 是消息总线系统,让不同进程互相通信。当你插入 U 盘,udev 检测到它,通过 D-Bus 发一条消息,你的文件管理器就弹出对话框问你想做什么;当你调节音量,音频系统通过 D-Bus 发消息来更新界面。它是 Linux 桌面的神经系统,悄悄地在各个组件之间路由消息,让它们无缝协作。
桌面启动时同样加载的,还有你的个人会话。Linux 读取你的用户配置,比如 .bashrc、.profile,以及桌面环境里设置的自启动应用——你的聊天客户端、剪贴板管理器,也许还有个系统监视器。壁纸被应用,键盘快捷键被配置,主题被加载,你做的所有个性化设置都在此刻生效。这是你的 Linux 系统在穿上你的衣服,准备专门为你服务,而不只是为随便什么人。
全链路回顾
从按下电源键到可用的桌面,整条链条是这样的:BIOS/UEFI 运行 POST、找到引导程序;GRUB 加载内核;内核初始化硬件;initramfs 加载驱动;根文件系统挂载;systemd 启动,服务并行拉起;显示服务器启动;显示管理器显示登录界面;你完成认证;桌面环境加载。每一步都像编排精密的接力赛,逐棒交接。整个过程在现代硬件上通常需要 10 到 30 秒。
自己动手
有一件很酷的事,你可以在自己的 Linux 上试试。打开终端,输入:
systemd-analyze这条命令会准确告诉你启动的每个阶段花了多久。你会看到固件时间、引导程序时间、内核时间和用户空间时间。再输入:
systemd-analyze blame你会得到一份按启动耗时排序的所有服务列表。Linux 爱好者就是这样从启动时间里一点点抠出几秒的——找出慢服务,禁用不需要的。这就像为整个启动过程准备了一份性能报告。
Linux 之所以美,是因为整个过程透明且可定制:你可以换引导程序、换 init 系统、换桌面环境,选择权在你。这就是 Linux 哲学——开放、可理解、可折腾。下次按下电源键时,你会清楚地知道那几秒钟里究竟发生了什么。