如果有人可以确认以下步骤是否正确,那就太好了。 我想知道具体的正确步骤。
打开计算机电源。
基本 I/O 系统 (BIOS/UEFI)。第一个执行的程序存储在 PC 主板上的 ROM 中。
- 固件 (BIOS/UEFI):通知设备处理器如何开始启动过程的程序被视为固件。
- 固件在制造过程中直接安装到硬件上。
- 计算机、手机和平板电脑依靠 BIOS 和 EFI 等固件来加载操作系统。
执行 POST(开机自检)以验证 H/W 组件是否处于工作状态。
寻找可启动设备。如果找到则将 CONTROL 移交给设备的第一个扇区,即 MBR
主引导记录 (MBR)。 512 字节,任何可启动设备的第一个扇区都包含用于启动机器的机器代码指令。它有以下信息:
- 引导加载程序信息(446 字节)— 指向引导加载程序的小型低级代码 [引导加载程序位于何处?] /boot/grub2/grub.cfg
- 分区表信息(64字节)[操作系统位于文件系统中的哪个位置?]
- 错误检查(2 个字节)
- 它会将引导加载程序 (GRUB2) 加载到内存中并将控制权移交给它。
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 传递给它。
核心:
- 一旦 Linux 内核控制了系统(由引导加载程序加载后获得),它就会准备其内存结构和驱动程序(初始化硬件)。内核正在启动。
- 我们可以看到很多消息,可以通过RHGB和安静来抑制。 [要启用消息传递,请修改 /etc/default/grub 中的参数 GRUB_CMDLINE_LINUX;然后运行 #grub2-mkconfig > /boot/grub2/grub.cfg 并重新启动]
- 某些基于 Linux 的计算机系统需要 initramfs 才能正确启动。如果存在,那么内核将从 initramfs 执行 /init 脚本。
- 具有外来驱动程序或设置的系统或加密文件系统需要 initramfs,以便 Linux 内核能够将控制权移交给系统上的 init 二进制文件。
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 详细信息)以继续引导过程。
系统:
- 第一个服务加载了 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 扇区 – 但两者都是“正确的”。
—
(嗯,在“开机”和“BIOS”之间,您可以包含在开机时实际初始化 CPU 的隐藏进程,例如 Intel 的 ME 或 AMD 的 PSP,它们实际上是第一个运行的独立 CPU ,在执行“BIOS”之前准备主 CPU,不过,由于这对用户来说是完全不可见的,所以可以忽略它并假装 BIOS 是第一个。)
虽然“BIOS”可能是一个通用术语,但实际上它特指 IBM PC 风格的固件,目前大多数 x86 PC 都使用这种固件不再使用– 几乎全部使用“UEFI”类型固件; UEFI 通常会包含 BIOS 接口的兼容性模块,但越来越多的情况不再包含。
对于其他类型的计算机,它的准确度甚至更低。据我所知,Intel Mac 一直都有 EFI(没有“BIOS”); Apple Silicon Mac 拥有完全定制的系统固件; Chromebook 使用 Coreboot;各种ARM64计算机可能有 UEFI – 或者可能使用其他东西。
一般来说,最好将其称为“系统固件”。
—
就 PC 而言(暂时忽略嵌入式设备),这仅适用于 IBM PC BIOS 引导过程。例如,具有 UEFI 的系统根本不使用第一个扇区的引导代码;相反,固件理解文件系统并将引导代码作为常规文件存储在特殊分区中。
同样,对于 IBM PC BIOS 准确,但对于 UEFI 不准确。
虽然扇区可能仍包含分区表(尽管更常见的是使用扇区 2+ 的 GPT 分区表),但 UEFI不使用引导代码来自此处,但直接从文件系统启动 GRUB2。
(“EFI系统分区”的ID和文件路径通常由固件本身存储在NVRAM中,并且可以有多个 - 固件有自己的启动菜单。)
不过,对于 BIOS,大致有两种引导扇区:a) 跳转到“活动”的第一个扇区的引导扇区分割(又名 VBR),这就是 Syslinux 和 Windows 等发生的情况; b) 跳转到安装时定义的固定扇区位置的文件,这就是 GRUB 的 MBR 的作用。
无论哪种情况,BIOS MBR 中的引导代码都太小,无法理解 grub.cfg。这仅由下一个MBR 将启动的阶段。
虽然 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 加载的并不准确。)