《GRUB2及启动过程详解》由会员分享,可在线阅读,更多相关《GRUB2及启动过程详解(75页珍藏版)》请在金锄头文库上搜索。
1、GRUB2及启动过程详解作者: 南瓜剪子2016年7月28日1. 概述22. CentOS7中GRUB223. GRUB2 的 bootstrap image文件33.1. boot.img33.2. diskboot.img43.3. kernel.img43.4. core.img43.5. *.mod44. 对比GRUB Legacy54.1. stage154.2. *_stage1_554.3. stage255. grub2-mkimage定制core.img66. GRUB2安装76.1. Linux是怎么命名设备(/dev/sda)76.2. MBR(Master Boot R
2、ecord)86.3. MBR分区表DPT(Disk Partition Table)106.4. LBA and CHS146.4.1. CHS(cylinders-heads-sectors)146.4.2. LBA(Logical Block Address)146.5. boot.img和core.img安装156.6. 硬盘总结187. 启动过程197.1. BIOS197.2. GRUB2中boot.img207.2.1. Step1无条件跳转207.2.2. Step2 初始化207.2.3. Step3 判断硬盘是否支持LBA还是只支持CHS227.2.4. Step4 采用L
3、BA加载core.img第一个扇区237.2.5. Step5 拷贝core.img第一个扇区到内存指定位置257.2.6. Step6 执行core.img第一条语句277.2.7. Step7 boot.img总结277.3. GRUB2中core.img287.3.1. diskboot.img287.3.2. GRUB2 core Startup347.3.3. GRUB主函数即GRUB主要功能377.3.4. 加载Linux Kernel387.4. Linux kernel478. 结束语489. 参考文献481. 概述计算机系统上电之后由固化到ROM中的BIOS(UEFI)进行操
4、作,然后导入硬盘MBR中Boot Loader并调到其运行,由Boot Loader对操作系统内核进行加载,并将控制权交给操作系统.下图简单描述了CentOS7的启动过程(CentOS7使用GRUB2作为Boot Loader):现在的Boot Loader有很多类型,大致如下:1 对Linux来说GRUB2占据了统治地位2 对Windows来说Bootmgr/BCD占据了统治地位3 对Apple系统缺省的是BootX作为一名计算机工程师,了解Boot Loader的原理是很重要。本文着重介绍GRUB2及其启动流程.读完本文,相信读者能够对Boot Loader原理有一定深刻理解,并能大致知道
5、其他Boot Loader的作用.本文在介绍一些基本知识后,在第7章会引入基本的反汇编过程来讲解GRUB2的启动流程,因为只有直接读代码才能深入学习原理.需要读者:- 有一定的汇编语言知识,如果读者对汇编不敢兴趣,可以跳过相关章节- 同时也需要读者有一定C语言知识本文稍微有点长,但都是作者本人的经验总结,如果静下心读完,相信对你会有帮助,相比其它GRUB一厚本书,能节约你很多时间。但由于作者水平有限,有不足之处忘谅解。2. CentOS7中GRUB2GRUB2是GNU下面的一个项目,有关其详细信息,请参考官方网站: http:/www.gnu.org/software/grub/. 相对于GR
6、UB2, 原先的GRUB(i.e. version 0.9x)被称为: GRUB Legacy. 官网上说明: GRUB Legacy is no longer being developed.从 1.x 开始的新版本就称为 GRUB 2(注意,虽然称为GRUB2,但其版本号却是从1.x开始 1.99也是GRUB2). 现在各种最新发行版本的Linux(包括CentOS7)都采用GRUB2.在CentOS7上可以查看安装的GRUB2版本rootcontroller # rpm -qa | grep grubgrub2-2.02-0.34.el7.centos.x86_64在CentOS7下面/
7、boot/grub2目录可以看到有关GRUB2相关文件. 在/boot/grub2/i386-pc目录下是GRUB2 bootstrap images文件,该目录大部分文件是以.mod结尾,这些文件为GRUB2模块文件,最后在该目录下面有以下两个image文件:rootcontroller i386-pc# ls -lrt *.img-rw-r-r-. 1 root root 26618 7u6708 11 23:33 core.img-rw-r-r-. 1 root root 512 7u6708 11 23:33 boot.img以上两个img文件都会被grub2-install命令安装到
8、硬盘上相应位置(在硬盘什么位置后面会说),很有意思的是请注意两点1) boot.img固定为512Byte2) core.img小于32KByte如果你觉得好奇,可以用file命令查看这些image文件类型rootcontroller i386-pc# file boot.imgboot.img: x86 boot sector; partition 4: ID=0xd4, starthead 205, startsector , 0 sectors, code offset 0x63rootcontroller i386-pc# file core.imgcore.img: dataroot
9、controller i386-pc# file xfs.modxfs.mod: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped对于boot.img file命令明确指出其为x86 boot sector,而mod文件却是ELF文件,接下来让我们进一步了解这些bootstrap image文件3. GRUB2 的 bootstrap image文件GRUB2有以下各种bootstrap images文件,大伙应悉知,这些image会被grub2-install安装到硬盘相应的位置,当BIOS完成后,
10、他们会被加载并引导系统继续完成启动.3.1. boot.img在PC BIOS系统中,这个image是GRUB2第一个被运行的它被写在MBR(Master Boot Record)或者在分区(partition)的boot sector中因为MBR或PC boot sector是固定512字节,这个文件的大小也固定为512byte.boot.img功能很简单,主要是读磁盘中core.img中的第一个扇区(sector)到内存中并跳到该部分运行(如果是硬盘启动,那么该扇区就是下面要介绍的diskboot.img)因为只有512字节,boot.img不能够加载文件系统(比如CentOS7中XFS或
11、其它Linux的EXT4等等),并且只能是从硬盘固定的位置加载.3.2. diskboot.img当从硬盘启动的时候这是core.img第一个扇区(sector)的内容,主要功能是读剩下的core.img到内存中并开始运行kernel.img. 同样diskboot.img没有文件系统的功能(XFS,EXT4等),当他读取剩余的core.img时候,依然从硬盘固定位置读取.根据启动的介质不同,类似diskboot.img文件有很多,在安装GRUB时候选用其中一个,目前大部分都是从硬盘启动diskboot.img1 cdboot.img: 从CD-ROM启动2 pxeboot.img: 从PXE
12、网络启动3 Lnxboot.img: 如果从其他bootloader比如LILO(用image= section)启动,这个image使GRUB看上去像一个Linux内核3.3. kernel.img这个文件包含了GRUB2基本的运行时支撑:对设备及文件的框架,环境变量,恢复模式下的命令行等等一般我们不会直接使用它,但是它是core.img中必不可少的一部分.3.4. core.img这个是GRUB的核心他是被grub2-mkimage命令生存,包含了kernel.img以及一些必须必要的modules. 通常core.img包含了足够的模块(modules)为了访问XFS/EXT4文件系统/
13、boot/grub2目录,并且在运行时加载从文件系统(XFS)所有剩余的模块,这些剩余模块包含启动目录处理,加载操作系统等等功能模块化的设计思路最主要的目的是使core.img保持足够小,目前disk限制core.img安装必须小于32KB. core.img一般被安装在硬盘特殊区域:embedding area(夹层区),这个区一般有32K限制,我们在后面会介绍什么是夹层区3.5. *.mod所有GRUB其他部分被称为模块,他们大部分被core.img在运行时自动动态加载,其中一小部分被整合到core.img中,这小部分是必须,比如文件系统支持(xfs.mod)模块可以手工加载,请参考ins
14、mod command(在本文不作介绍,请查阅相关文档)注意:如果对以上各种image文件还是不清楚,请继续往下读,后面会有详细说明。4. 对比GRUB LegacyGRUB2 与GRUB Legacy不同,很多人都熟悉GRUB Legacy里面的stage1, stage1_5,stage2等等概念,而在GRUB2里面,这些被各种bootstrap image文件替代:boot.imgdiskboot.imgcore.img大伙应悉知以上三个images4.1. stage1GRUB Legacy中stage1相当于GRUB 2中boot.img, 他们完成相同的功能. 4.2. *_sta
15、ge1_5GRUB Legacy中Stage 1.5包含了足够的文件系统(XFS或EXT4)代码而允许Stage2从文件系统中直接载入系统,就这个意义上来说很像GRUB 2中的core.img.不过core.img功能更加强大,它提供了恢复shell,使能够在不能加载其他模块(modules)情况下(比如partition number已经改变)能够人工恢复。Core.img能够被灵活的创建,允许从LVM或者RAID加载模块.GRUB Legacy 能够运行stage1和stage2而不运行stage1.5, 但是对GRUB2来说,core.img是必须的。4.3. stage2GRUB 2 没有对应stage2的image. 它从/boot/grub加载相应的模块。5. grub2-mkimage定制core.img上一章介绍的core.img至少包含了一下几个部分1) diskboot.img2) kernel.img3) required *.mod他们被grub2