Linux操作系统启动顺序与加载文件

1,643 阅读3分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」

Linux系统启动

我们一个传统的操作系统的启动顺序:

  1. BIOS固件启动并执行开机自检(POST)。
  2. BIOS扫描(可能的)引导设备,并根据用户设置的偏好对它们进行排序。
  3. 按顺序扫描引导设备以查找引导固件(如网卡上的PXE ROM)、主引导记录(MBR)或标记为可引导的分区。如果找到了,BIOS就执行它。
  4. 存储在MBR中的第一阶段引导加载程序,从磁盘加载并执行阶段1.5的驱动程序和阶段2的引导加载程序。
  5. 阶段二的引导加载程序从磁盘加载配置文件。对于grub2,就是/boot /grub2 /grub.cfg。
  6. 解析配置文件,并根据其内容自动或由用户选择启动条目。
  7. 启动条目中引用的内核和初始 ram disk从磁盘加载,并将控制权移交给内核。
  8. 内核启动,并使用初始ram disk中的驱动程序初始化硬件。一个简单的init系统也从ram disk启动。
  9. 初始ram disk中的脚本挂载目标系统的根文件系统,然后将root切换到新挂载的文件系统,并将控制权移交给目标根文件系统上的/sbin/init。
  10. init系统根据其配置挂载文件系统并启动服务。

GRUB2

Red Hat Enterprise Linux上使用的引导加载程序是grub2,它是统一引导的加载程序。grub2将文件存储在BIOS系统的多个不同位置:

  • /boot/

内核和初始内存磁盘。其子目录包含其他文件。

  • /boot/grub2/

配置文件、扩展模块和主题。

  • /boot/grub2/grub.cfg

grub2主配置文件。该文件是自动生成的,通常不需要手动编辑。

为了方便起见,/etc/grub2.cfg是指向该文件的符号链接。

  • /etc/grub.d/

该目录包含一个脚本,用于生成一个grub2主配置文件。

  • /etc/default/grub

该文件包含用于生成grub2主配置文件的变量。

  • /boot/grub2/grubenv

一个正好为1 KiB的文件,用于存储变量,如默认或“保存的”启动项目。

主引导记录(MBR)

为了从BIOS系统上的磁盘引导grub2,有两种选择:将grub2引导加载程序的第一部分存储在磁盘的主引导记录(MBR)中,或者将其存储在标记为“可引导”的分区的第一个扇区中。

MBR的问题是:使用MBR有一个很大的限制:典型的MBR大小只有512字节,其中一部分空间用于该磁盘的分区表,只剩下446字节用于引导加载程序。

为了解决这个问题,grub2可以使用磁盘上的 “boot track”, “MBR gap”或者“embedding area”来存储它需要的额外模块和文件。这是MBR和磁盘上第一个分区之间的空间。为了可靠地工作,至少需要31 KiB的可用空间(512字节扇区磁盘上的63个扇区)。如果一个磁盘已经被anaconda分区,那么第一个分区通常会从扇区2048开始,为embedding area留出大约1 MiB的空间,为grub2留出足够的空间。