|
曾经讲到,在 BIOS 读完信息后,接下来会到第一个开机设备的 MBR 去读取 boot loader 。该 boot loader 可以具有选单功能、字节加载核心文件以及控制权移交功能等,系统必须要有 loader 才能够加载该操作系统的核心。
但是 MBR 是整个硬盘的第一个 sector 内的一个区块,整个大小才 446 bytes 。即使 GPT 也没有很大的扇区来存储 loader 数据,那么功能强悍的 loader 是怎么放进去的?
为了解决这个问题,Linux 将 boot loader 的程序代码执行与设置值加载分成两个阶段(stage)执行
Stage 1:执行 boot loader 主程序
第一阶段执行 boot loader 的主程序,该主程序必须被安装在开机区,即 MBR 或则是 boot sector,但是因为 MBR 是在太小了,所以通常仅安装 boot loader 的最小主程序,并没有安装 loader 的相关配置文件
Stage 2:主程序加载配置文件
第二阶段通过 boot loader 加载所有配置文件与相关的环境参数文件,包括文件系统定义与主要配置文件 grub.cfg,一般来说,配置文件都在 /boot 下
与 grub2 相关的都放在 /boot/grub2
[root@study ~]# ls -l /boot/grub2
total 32
-rw-r--r--. 1 root root 84 Oct 4 18:31 device.map # grub2 的设备对于文件
drwxr-xr-x. 2 root root 25 Oct 4 18:31 fonts # 开机过程中的画面会使用到的字体数据
-rw-r--r--. 1 root root 4309 Oct 4 18:32 grub.cfg # grub2 的主配置文件,非常重要
-rw-r--r--. 1 root root 1024 Oct 4 18:32 grubenv # 一些环境区块的符号
drwxr-xr-x. 2 root root 8192 Oct 4 18:31 i386-pc # 针对一般 x86 PC 所需要的 grub2 的相关模块
drwxr-xr-x. 2 root root 4096 Oct 4 18:31 locale # 语系相关数据
[root@study ~]# ls -l /boot/grub2/i386-pc/
acpi.mod # 电源管理有关的模块
ata.mod # 磁盘有关的模块
chain.mod· # 进行 loader 控制全移交的相关模块
command.lst # 一些指令相关性的列表
efiemu32.o # 与 uefi BIOS 先关的模块
efiemu64.o
efiemu.mod
ext2.mod # EXT w文件系统家族相关模块
fat.mod # FAT 文件系统模块
gcry_sha256.mod # 常见的加密模块
iso9660.mod # 光盘文件系统模块
lvm.mod # LVM 文件系统模块
mdraid09.mod # 软件磁盘阵列模块
minix.mod # MINIX 相关文件系统模块
msdospart.mod # 一般 MBR 分区表
part_gpt.mod # GPT 分区表
part_msdos.mod # MBR 分区表
scsi.mod # SCSI 相关模块
usb_keyboard.mod # usb 模相关模块
usb.mod
vga.mod # VGA 显卡相关模块
xfs.mod # XFS 文件系统模块
。。。。 等等很多模块
Copied!
/boot/grub2 目录下最重要的是 grub2.cfg 配置文件,以及各种文件系统的定义。所以 loader 读取了这种文件系统定义数据后,就能够认识文件系统并读取在该文件系统内的核心文件了
从上面的文件来看, grub2 认识的文件系统与磁盘分区格式真的非常多,正因为如此,grub2 才会取代 Lio/grub 这个老婆的 boot loader
|
|