使用 systemd 的 Linux 操作系统启动顺序 - 确切的正确步骤是什么?

使用 systemd 的 Linux 操作系统启动顺序 - 确切的正确步骤是什么?

Linux操作系统启动时序图

如果有人可以确认以下步骤是否正确,那就太好了。 我想知道具体的正确步骤。

  1. 打开计算机电源。

  2. 基本 I/O 系统 (BIOS/UEFI)。第一个执行的程序存储在 PC 主板上的 ROM 中。

    • 固件 (BIOS/UEFI):通知设备处理器如何开始启动过程的程序被视为固件。
    • 固件在制造过程中直接安装到硬件上。
    • 计算机、手机和平板电脑依靠 BIOS 和 EFI 等固件来加载操作系统。
  3. 执行 POST(开机自检)以验证 H/W 组件是否处于工作状态。

  4. 寻找可启动设备。如果找到则将 CONTROL 移交给设备的第一个扇区,即 MBR

  5. 主引导记录 (MBR)。 512 字节,任何可启动设备的第一个扇区都包含用于启动机器的机器代码指令。它有以下信息:

    • 引导加载程序信息(446 字节)— 指向引导加载程序的小型低级代码 [引导加载程序位于何处?] /boot/grub2/grub.cfg
    • 分区表信息(64字节)[操作系统位于文件系统中的哪个位置?]
    • 错误检查(2 个字节)
    • 它会将引导加载程序 (GRUB2) 加载到内存中并将控制权移交给它。
  6. GRand 统一引导加载程序 (GRUB2)

    • 它是加载操作系统的程序。它曾经适合 MBR(446 字节),但由于大小不断增加,操作系统的复杂性也在增加。它不是一个单一的程序,它允许正确解释文件系统。
    • 启动时由 MBR 从 /boot/grub2/grub.cfg 加载到内存中
    • 用户可以看到 GUI 要求选择不同的操作系统或内核来启动。
    • 一旦选择了内核,它就会找到相应的内核可执行文件。
      • /boot/vmlinuz-4.18.0-408.el8.x86_64
    • 主要工作是将内核和 initramfs [initramfs-4.18.0–408.el8.x86_64.img] 加载到内存中。
    • 一旦内核被加载到 RAM 中,它就会将 CONTROL 传递给它。
  7. 核心:

    • 一旦 Linux 内核控制了系统(由引导加载程序加载后获得),它就会准备其内存结构和驱动程序(初始化硬件)。内核正在启动。
    • 我们可以看到很多消息,可以通过RHGB和安静来抑制。 [要启用消息传递,请修改 /etc/default/grub 中的参数 GRUB_CMDLINE_LINUX;然后运行 ​​#grub2-mkconfig > /boot/grub2/grub.cfg 并重新启动]
    • 某些基于 Linux 的计算机系统需要 initramfs 才能正确启动。如果存在,那么内核将从 initramfs 执行 /init 脚本。
    • 具有外来驱动程序或设置的系统或加密文件系统需要 initramfs,以便 Linux 内核能够将控制权移交给系统上的 init 二进制文件。
  8. initramfs: ref-10

    • initramfs 是基于 tmpfs 的初始 ram 文件系统。它提供了早期的用户空间,可以做内核在启动时无法做的事情。
    • 它包含在调用实际根文件系统上的 init 二进制文件之前挂载文件系统所需的工具和脚本。
    • 这些工具可以是解密抽象层(用于加密文件系统)、逻辑卷管理器、软件raid、基于蓝牙驱动程序的文件系统加载器等。
    • 在引导时,内核会检查 initramfs 是否存在,或者引导加载程序会通知 Linux 内核 initramfs 已加载。
    • 如果找到,Linux 内核将创建一个 tmpfs 文件系统,提取其上的存档内容,然后启动位于 tmpfs 文件系统根目录中的 /init 脚本。
      • [initramfs 至少包含一个名为 /init.d 的文件。该文件由内核作为主 init 进程(PID 1)执行。它必须完成所有工作。] ref-7
    • 然后,该脚本将真正的根文件系统挂载在 /sysroot 下(在确保它可以挂载它之后,例如通过加载附加模块、准备加密抽象层等)以及重要的其他文件系统(例如 /usr 和/var )。
    • 一旦安装了根文件系统和其他重要文件系统,initramfs 中的 init 脚本会将根切换到真正的根文件系统(请记住,这是 switch_root 操作而不是ivot_root)。
      • [switch_root 操作是将 /sysroot 切换到真正的根文件系统,从那里开始执行内容,然后从内存中删除 initramfs。]
    • 最后调用该系统真实根文件系统上的 /sbin/init (init -> /usr/lib/systemd/systemd) 二进制文件作为主 init 进程(PID 1 - 从 initramfs /init 继承,请参阅 exec 详细信息)以继续引导过程。
  9. 系统:

    • 第一个服务加载了 PID 1
    • 从 /etc/fstab 挂载文件系统。
    • 并行启动所有必需的服务和进程。
      • [/etc/systemd/system/default.target]
    • 它开始寻找启动到默认目标所需依赖项的文件。
    • 一旦默认目标启动并且用户可以看到登录提示,则我们可以说系统启动成功。

参考:

1. https://opensource.com/article/20/5/systemd-startup
2. https://opensource.com/article/20/5/systemd-units
3. https://opensource.com/article/20/4/systemd
4. https://www.quora.com/What-is-chroot-Sysroot
5.https://blog.csdn.net/flynetcn/article/details/131828832
6. https://www.linfo.org/vmlinuz.html
7. https://wiki.gentoo.org/wiki/Custom_Initramfs
8. https://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html
9. https://www.quora.com/What-exactly-is-the-initramfs-program-in-Linux-Is-it-a-script-binary-or-what
10. https://wiki.gentoo.org/wiki/Initramfs/Guide
11. https://wiki.ubuntu.com/Initramfs
12. https://www.youtube.com/watch?v=saovaEhA85g
13. https://www.youtube.com/watch?v=sOIOY6Ks0xA&t=423s
14. https://sourcemage.org/HowTo/initramfs
15. https://web.archive.org/web/20160730094856/http://wiki.sourcemage.org/HowTo(2f)Initramfs.html
16. https://tiebing.blogspot.com/2014/02/linux-switchroot-vs-pivotroot-vs-chroot.html
17. https://unix.stackexchange.com/questions/126217/when-would-you-use-pivot-root-over-switch-root
18. https://linux.die.net/man/8/pivot_root
19. https://linux.die.net/man/8/switch_root
20. https://en.wikipedia.org/wiki/Exec_(system_call)
21. https://www.baeldung.com/linux/exec-command-in-shell-script
22. https://eng.libretexts.org/Bookshelves/Computer_Science/Operating_Systems/Linux_-_The_Penguin_Marches_On_(McClanahan)/13%3A_Working_with_Bash_Scripts/3.09%3A_Positional_Parameters_exec_Command_source_Command#:~:text=%20exec%20command%20in%20Linux ,返回% 20到%20%20调用%20进程。
23. https://en.wikipedia.org/wiki/Overlay_(编程)
24. https://superuser.com/questions/782008/linux-boot-time-scrolling-messages
25. https://itnixpro.com/how-to-view-linux-boot-messages-using-dmesg-command/?utm_content=cmp-true
26. https://linux-audit.com/finding-boot-logs-in-systemd-journals/
27. https://www.loggly.com/ultimate-guide/using-journalctl/

答案1

好吧,你的 initramfs 和 systemd 部分是正确的,但其余的 - 不一定。

确切的正确步骤是什么?

这样的问题的问题是有没有单身“完全正确的步骤”答案 – 有一个种类繁多在每个步骤中,具体取决于硬件平台、Linux 发行版等等。

对于特定 PC 平台上的某些特定 Linux 发行版(2010 年代 PC 上的新 RHEL/Fedora?),您的描述在某个时间点是正确的,但同时另一台 PC 可能使用了不同的引导加载程序而不是 GRUB ,或者可能使用完全不同的引导程序而不是 MBR 扇区 – 但两者都是“正确的”。

  1. (嗯,在“开机”和“BIOS”之间,您可以包含在开机时实际初始化 CPU 的隐藏进程,例如 Intel 的 ME 或 AMD 的 PSP,它们实际上是第一个运行的独立 CPU ,在执行“BIOS”之前准备主 CPU,不过,由于这对用户来说是完全不可见的,所以可以忽略它并假装 BIOS 是第一个。)

  2. 虽然“BIOS”可能是一个通用术语,但实际上它特指 IBM PC 风格的固件,目前大多数 x86 PC 都使用这种固件不再使用– 几乎全部使用“UEFI”类型固件; UEFI 通常会包含 BIOS 接口的兼容性模块,但越来越多的情况不再包含。

    对于其他类型的计算机,它的准确度甚至更低。据我所知,Intel Mac 一直都有 EFI(没有“BIOS”); Apple Silicon Mac 拥有完全定制的系统固件; Chromebook 使用 Coreboot;各种ARM64计算机可能有 UEFI – 或者可能使用其他东西。

    一般来说,最好将其称为“系统固件”。

  3. 就 PC 而言(暂时忽略嵌入式设备),这仅适用于 IBM PC BIOS 引导过程。例如,具有 UEFI 的系统根本不使用第一个扇区的引导代码;相反,固件理解文件系统并将引导代码作为常规文件存储在特殊分区中。

  4. 同样,对于 IBM PC BIOS 准确,但对于 UEFI 不准确。

    虽然扇区可能仍包含分区表(尽管更常见的是使用扇区 2+ 的 GPT 分区表),但 UEFI不使用引导代码来自此处,但直接从文件系统启动 GRUB2。

    (“EFI系统分区”的ID和文件路径通常由固件本身存储在NVRAM中,并且可以有多个 - 固件有自己的启动菜单。

    不过,对于 BIOS,大致有两种引导扇区:a) 跳转到“活动”的第一个扇区的引导扇区分割(又名 VBR),这就是 Syslinux 和 Windows 等发生的情况; b) 跳转到安装时定义的固定扇区位置的文件,这就是 GRUB 的 MBR 的作用。

    无论哪种情况,BIOS MBR 中的引导代码都太小,无法理解 grub.cfg。这仅由下一个MBR 将启动的阶段。

  5. 虽然 GRUB2 很常见,但它绝不是通用的。 (例如,Syslinux 相当常见,rEFInd 和 systemd-boot 也是如此。如今,特别是在 UEFI 系统上,内核映像 (vmlinuz) 本身嵌入了一个存根加载程序,允许固件直接执行它。)

    而且,它从来不适合 MBR——GRUB2 和 GRUB0.x 都不适合。即使在 MS-DOS 中,MBR 也没有做更多的事情,只是找到“活动”分区并跳转到其 VBR(然后加载 IO.SYS,并且仅最终会加载 DOS 内核)。因此,虽然 GRUB2 与其他引导加载程序相比确实很大,但它根本不是什么新鲜事。

    (最后,涉及两个 grub.cfg - 一个微小的“引导”grub.cfg,它直接嵌入到 grub 安装过程中生成的 GRUB 内核映像中,它指向您在中找到的“真实”grub.cfg 的位置/boot/grub。因此,说 GRUB 是“从”/boot/grub2/grub.cfg 加载的并不准确。)

相关内容