GNU/Linux系统是如何启动的?

GNU/Linux操作系统启动流程
第一步 固件引导
固件:BIOS(Legacy)或UEFI,为刷写在电脑EEPROM里的小系统,负责硬件识别、自检(POST)和初始化
初始化完成后会把控制权交给中间引导程序进入中间引导阶段
第二步 中间引导
加载内核镜像vmlinuxz以及initramfs到内存,为内核启动做准备
中间引导程序将"指挥权"交给Linux内核进入内核启动阶段
以GRUB2+UEFI为例:
1.准备EFI分区,将GRUB2有关的文件安装在分区中
2.在grub.cfg中配置vmlinuxz和initramfs引导系统加载内核
*良好的UEFI实现(EFISTUB)可替代GRUB2直接引导Linux内核
第三步 内核启动
若系统有initramfs,内核调用initramfs中的init程序进入下一阶段init
若系统无initramfs,内核直接挂载根文件系统并执行init程序进入下一阶段init
*vmlinuz:为压缩过的系统内核文件
*initramfs:临时根文件系统(rootfs),为CPIO格式档案,内核自带CPIO有关的解压代码
*initramfs功能和存在的意义:用于辅助挂载rootfs,因磁盘驱动在磁盘中而直接挂载磁盘需要磁盘驱动,所以这里引入一个临时rootfs用于挂载磁盘所需的驱动/引导加密磁盘/网络引导/其他需要额外模块的引导流程
第四步 init
为Linux系统中第一个由内核启动的用户级进程,缺少该进程系统会无法启动
早期版本Linux的init程序是sysvinit,现在主流的init程序是systemd
systemd启动后会根据配置文件启动journald networkd resolved timesyncd等一系列的系统级服务和其他用户级服务
