已索引

先看一下 RHEL6 中的 GRUB 文件:

# ll /boot/grub/
total 276
-rw-r--r--. 1 root root     63 May  8  2015 device.map
-rw-r--r--. 1 root root  13380 Jul  9  2015 e2fs_stage1_5
-rw-r--r--. 1 root root  12620 Jul  9  2015 fat_stage1_5
-rw-r--r--. 1 root root  11748 Jul  9  2015 ffs_stage1_5
-rw-------  1 root root   1221 Jul 13  2015 grub.conf
-rw-------  1 root root   1203 Jul 13  2015 grub.conf.orabackup
-rw-r--r--. 1 root root  11756 Jul  9  2015 iso9660_stage1_5
-rw-r--r--. 1 root root  13268 Jul  9  2015 jfs_stage1_5
lrwxrwxrwx. 1 root root     11 May  8  2015 menu.lst -> ./grub.conf
-rw-r--r--. 1 root root  11956 Jul  9  2015 minix_stage1_5
-rw-r--r--. 1 root root  14412 Jul  9  2015 reiserfs_stage1_5
-rw-r--r--. 1 root root   1341 May  7  2010 splash.xpm.gz
-rw-r--r--. 1 root root    512 Jul  9  2015 stage1
-rw-r--r--. 1 root root 125992 Jul  9  2015 stage2
-rw-r--r--. 1 root root  12024 Jul  9  2015 ufs2_stage1_5
-rw-r--r--. 1 root root  11364 Jul  9  2015 vstafs_stage1_5
-rw-r--r--. 1 root root  13964 Jul  9  2015 xfs_stage1_5

计算机加电后,开始 POST,POST 完成后会读取第一引导设备(Hard Drive)。然后读取硬盘的 MBR(硬盘第一个扇区)。简单地可以这样说,MBR 中有引导程序相关的代码,通过它可以找到我们的 /boot/* ,然后加载 vmlinuz 和 initramfs 到内存……

但是 GRUB 具体是怎样把系统引导起来的呢?

MBR 的 446B 即是由 GRUB 的 stage1 代码汇编生成,这段代码的唯一作用就是将第二个扇区(0柱面 0 磁道 2扇区)的 512B 加载到内存中去(你可以这样理解,第一个扇区只有 446B 可用,不足 512B)。

第二个扇区的 512B 其中就是 /boot/grub/e2fs_stage1_5 文件的前512字节。为什么是这个文件而不是其它的*_stage1_5 呢?因为 GRUB 执行 setup 的时候,能够识别启动设备的文件系统,比如我们,是 ext4 文件系统,所以只需要将 ext4 相关文件e2fs_stage1_5 的前 512B 放入扇区。这 512B 的作用就是把第三个扇区到第 N 个扇区的代码调到内存(N 取几取决与文件系统)。这些代码我们称为文件系统支撑代码, 文件系统支撑代码调到内存之后,我们就可以识别文件系统了,就再也不需要通过汇编指令来调用磁盘扇区中的内容了,我们可以直接操作文件了。此时, /boot/grub/stage2 这样的比较大的文件可以直接操作了。

所以,e2fs_stage1_5 这个文件的作用是识别 ext4 文件系统的。我们知道GRUB在开始的时候没有 OS,也没有文件系统的概念。那么 GRUB 是从何时开始有文件系统的功能的呢。这就是 stage1.5 干的事情,stage1.5 过后,GRUB就能识别文件系统了,就能在磁盘上识别加载文件了。

-- By 许望(RHCA、OCM、VCP)
最后修改:2024 年 02 月 07 日 09 : 41 AM
如果觉得我的文章对你有用,请随意赞赏