Arch Linux 的启动流程
Linux 内核启动前
BIOS
- 开机时加电自检。(这一步有时会简称为 POST)
- BIOS 执行在「BIOS 硬盘顺序」中的第一块硬盘上的前 440 字节代码,即主引导记录。
- 主引导记录执行它之后的第二阶段代码,一般就是启动引导器。
UEFI
- 开机时加电自检。
- UEFI 固件被加载,并由它初始化启动要用的硬件。
- 固件读取其引导管理器和 efivars 以确定从何处(比如,从哪个硬盘及分区)加载哪个 UEFI 应用。
- 固件按照引导管理器中的启动项目,加载UEFI 应用。(通常是启动加载器)
启动加载器
Second-stage Bootloader 俗称“启动加载器”,是用来引导系统启动,加载内核之类的特殊软件。
GNU/Linux 下常用的启动引导器大概有这么几种:
GRUB ,即 GRand Unified Bootloader。大家现在经常用到的其实是它的下一代(GRUB 2),是个功能丰富的启动加载器
(或者说是个 OS 也无妨)。
Systemd-boot ,前称 gummiboot。一个配置简单的启动加载器(虽然只支持 UEFI)
- rEFInd,外观精美,自动配置简单。
initramfs
内核被加载后,它就会解压 mkinitcpio , 又名 initial RAM filesystem, 后者会伪装成一个已初始化的根文件系统。内核接着会执行 /init 作为第一条进程。这就是所谓的「用户空间」啦~
初始内存盘本质上是一个很小的运行环境(早期用户空间),用于加载一些核心模块,并在 init 接管启动过程之前做必要的准备。有了这个环境,才能支持加密根文件系统、RAID上的根文件系统等高级功能。mkinicpio 支持自定义的钩子扩展、运行时自动检测以及其他功能。
initramfs 会加载启动时所需要的各种模块,并挂载好根文件系统。
在「早期用户空间」的最终环节里,真正的根文件系统被挂载好后,就会替换掉原来的伪根文件系统。接着 /sbin/init 被执行,同样也替换掉原来的 /init 进程。
Getty 或者显示管理器
init 为每一个 虚拟终端 调用 getty,前者一般有六个,每个虚拟终端都会初始化 tty 并请求输入用户名和密码。当在某虚拟终端输入用户名和密码后,其 getty 会通过 /etc/passwd 检查是否正确,如果正确,就接着调用 login。
如果有使用显示管理器的话,显示管理器, 会代替原来的 getty 登录命令行提示符展示登录画面。