GRUB2及启动过程详解精品管理资料.docx
- 文档编号:5305089
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:54
- 大小:229.42KB
GRUB2及启动过程详解精品管理资料.docx
《GRUB2及启动过程详解精品管理资料.docx》由会员分享,可在线阅读,更多相关《GRUB2及启动过程详解精品管理资料.docx(54页珍藏版)》请在冰豆网上搜索。
GRUB2及启动过程详解精品管理资料
GRUB2及启动过程详解
作者:
南瓜剪子
2016年7月28日
1.概述
计算机系统上电之后由固化到ROM中的BIOS(UEFI)进行操作,然后导入硬盘MBR中BootLoader并调到其运行,由BootLoader对操作系统内核进行加载,并将控制权交给操作系统.下图简单描述了CentOS7的启动过程(CentOS7使用GRUB2作为BootLoader):
现在的BootLoader有很多类型,大致如下:
1.对Linux来说GRUB2占据了统治地位
2.对Windows来说Bootmgr/BCD占据了统治地位
3.对Apple系统缺省的是BootX
作为一名计算机工程师,了解BootLoader的原理是很重要。
本文着重介绍GRUB2及其启动流程.读完本文,相信读者能够对BootLoader原理有一定深刻理解,并能大致知道其他BootLoader的作用。
本文在介绍一些基本知识后,在第7章会引入基本的反汇编过程来讲解GRUB2的启动流程,因为只有直接读代码才能深入学习原理。
需要读者:
-有一定的汇编语言知识,如果读者对汇编不敢兴趣,可以跳过相关章节
—同时也需要读者有一定C语言知识
本文稍微有点长,但都是作者本人的经验总结,如果静下心读完,相信对你会有帮助,相比其它GRUB一厚本书,能节约你很多时间.但由于作者水平有限,有不足之处忘谅解。
2.CentOS7中GRUB2
GRUB2是GNU下面的一个项目,有关其详细信息,请参考官方网站:
http:
//www.gnu。
org/software/grub/。
相对于GRUB2,原先的GRUB(i。
e.version0.9x)被称为:
GRUBLegacy。
官网上说明:
GRUBLegacyisnolongerbeingdeveloped。
从1。
x开始的新版本就称为GRUB2(注意,虽然称为GRUB2,但其版本号却是从1.x开始1。
99也是GRUB2)。
现在各种最新发行版本的Linux(包括CentOS7)都采用GRUB2。
在CentOS7上可以查看安装的GRUB2版本
[root@controller~]#rpm—qa|grep”grub”
grub2—2。
02—0。
34.el7.centos。
x86_64
在CentOS7下面/boot/grub2目录可以看到有关GRUB2相关文件.在/boot/grub2/i386—pc目录下是GRUB2bootstrapimages文件,该目录大部分文件是以.mod结尾,这些文件为GRUB2模块文件,最后在该目录下面有以下两个image文件:
[root@controlleri386—pc]#ls—lrt*.img
—rw—r——r——。
1rootroot266187\u67081123:
33core.img
-rw—r——r—-。
1rootroot5127\u67081123:
33boot。
img
以上两个img文件都会被grub2—install命令安装到硬盘上相应位置(在硬盘什么位置后面会说),很有意思的是请注意两点
1)boot。
img固定为512Byte
2)core.img小于32KByte
如果你觉得好奇,可以用file命令查看这些image文件类型
[root@controlleri386-pc]#fileboot.img
boot。
img:
x86bootsector;partition4:
ID=0xd4,starthead205,startsector4277266767,0sectors,codeoffset0x63
[root@controlleri386—pc]#filecore。
img
core。
img:
data
[root@controlleri386—pc]#filexfs.mod
xfs。
mod:
ELF32-bitLSBrelocatable,Intel80386,version1(SYSV),notstripped
对于boot。
imgfile命令明确指出其为x86bootsector,而mod文件却是ELF文件,接下来让我们进一步了解这些bootstrapimage文件
3.GRUB2的bootstrapimage文件
GRUB2有以下各种bootstrapimages文件,大伙应悉知,这些image会被grub2-install安装到硬盘相应的位置,当BIOS完成后,他们会被加载并引导系统继续完成启动。
3.1.boot。
img
在PCBIOS系统中,这个image是GRUB2第一个被运行的.它被写在MBR(MasterBootRecord)或者在分区(partition)的bootsector中.因为MBR或PCbootsector是固定512字节,这个文件的大小也固定为512byte。
boot.img功能很简单,主要是读磁盘中core。
img中的第一个扇区(sector)到内存中并跳到该部分运行(如果是硬盘启动,那么该扇区就是下面要介绍的diskboot。
img).因为只有512字节,boot。
img不能够加载文件系统(比如CentOS7中XFS或其它Linux的EXT4等等),并且只能是从硬盘固定的位置加载。
3.2.diskboot.img
当从硬盘启动的时候这是core。
img第一个扇区(sector)的内容,主要功能是读剩下的core.img到内存中并开始运行kernel。
img。
同样diskboot。
img没有文件系统的功能(XFS,EXT4等),当他读取剩余的core.img时候,依然从硬盘固定位置读取。
根据启动的介质不同,类似diskboot。
img文件有很多,在安装GRUB时候选用其中一个,目前大部分都是从硬盘启动diskboot.img
1.cdboot。
img:
从CD—ROM启动
2.pxeboot。
img:
从PXE网络启动
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文件系统/boot/grub2目录,并且在运行时加载从文件系统(XFS)所有剩余的模块,这些剩余模块包含启动目录处理,加载操作系统等等功能.
模块化的设计思路最主要的目的是使core。
img保持足够小,目前disk限制core。
img安装必须小于32KB。
core。
img一般被安装在硬盘特殊区域:
embeddingarea(夹层区),这个区一般有32K限制,我们在后面会介绍什么是夹层区.
3.5.*.mod
所有GRUB其他部分被称为模块,他们大部分被core。
img在运行时自动动态加载,其中一小部分被整合到core。
img中,这小部分是必须,比如文件系统支持(xfs。
mod)
模块可以手工加载,请参考insmodcommand(在本文不作介绍,请查阅相关文档)
注意:
如果对以上各种image文件还是不清楚,请继续往下读,后面会有详细说明。
4.对比GRUBLegacy
GRUB2与GRUBLegacy不同,很多人都熟悉GRUBLegacy里面的stage1,stage1_5,stage2等等概念,而在GRUB2里面,这些被各种bootstrapimage文件替代:
boot。
img
diskboot。
img
core.img
大伙应悉知以上三个images
4.1.stage1
GRUBLegacy中stage1相当于GRUB2中boot。
img,他们完成相同的功能.
4.2.*_stage1_5
GRUBLegacy中Stage1。
5包含了足够的文件系统(XFS或EXT4)代码而允许Stage2从文件系统中直接载入系统,就这个意义上来说很像GRUB2中的core.img。
不过core。
img功能更加强大,它提供了恢复shell,使能够在不能加载其他模块(modules)情况下(比如partitionnumber已经改变)能够人工恢复。
Core。
img能够被灵活的创建,允许从LVM或者RAID加载模块.
GRUBLegacy能够运行stage1和stage2而不运行stage1。
5,但是对GRUB2来说,core。
img是必须的.
4.3.stage2
GRUB2没有对应stage2的image。
它从/boot/grub加载相应的模块.
5.grub2—mkimage定制core.img
上一章介绍的core.img至少包含了一下几个部分
1)diskboot。
img
2)kernel.img
3)required*。
mod
他们被grub2—mkimage命令整合成core.img文件,实际上当运行完该命令最终生成的是上一章中/boot/grub2/i386-pc目录下的两个image文件
1)boot。
img
2)core。
img
有兴趣的读者请参照mangrub2-mkimage查阅相关信息,定制自己的core。
img:
[lanzhou@controllerimage]$grub2—mkimage—Oi386-pc-p/boot/grub2-v—ocore。
imgxfs
grub2—mkimage:
info:
thetotalmodulesizeis0x26e4。
grub2-mkimage:
info:
reading/usr/lib/grub/i386—pc/kernel.img.
grub2—mkimage:
info:
locatingthesection。
textat0x0。
grub2-mkimage:
info:
locatingthesection.rodataat0x5494。
grub2—mkimage:
info:
locatingthesection.dataat0x6448.
grub2—mkimage:
info:
locatingthesection。
bssat0x6bd0.
grub2-mkimage:
info:
reading/usr/lib/grub/i386-pc/fshelp。
mod。
grub2-mkimage:
info:
reading/usr/lib/grub/i386—pc/xfs.mod.
grub2-mkimage:
info:
kernel_img=0x2649700,kernel_size=0x6bd0.
grub2—mkimage:
info:
thecoresizeis0x5085。
grub2—mkimage:
info:
reading/usr/lib/grub/i386-pc/lzma_decompress.img。
grub2—mkimage:
info:
reading/usr/lib/grub/i386-pc/diskboot。
img.
grub2-mkimage:
info:
writing0x200bytes。
grub2—mkimage:
info:
writing0x5bc5bytes。
core。
img是内核的名字,生成在当前目录下,i386—pc是镜像的格式,xfs是加入内核的模块。
常用模块有:
xfs:
支持xfs文件系统(CentOS7缺省的文件系统)
ext2:
支持ext2文件系统
但是我们一般不直接运行该命令,一般运行grub2—install。
该命令会自动调用grub2-mkimage.
6.GRUB2安装
当一切准备好后,我们可运行以下命令
grub2—install/dev/sda
去安装grub2(缺省的-—boot-directory=/boot/)
不过一般的CentOS7已经安装好了GRUB2,除非你感兴趣,不用运行上面命令。
在继续后面的内容之前,下面有几个概念大伙必须知道:
6.1.Linux是怎么命名设备(/dev/sda)
比如/dev/sda5,如下图所示
1)SCSI硬盘
第一个SCSI接口硬盘:
/dev/sda
第二个SCSI接口硬盘:
/dev/sdb
2)USB
如果只有一块硬盘,那么第一个USB盘也可能是/dev/sdb(usb存储设备也目前在内核中在两种驱动方法,一种是模拟SCSI硬盘,另一种是非模拟SCSI硬盘,前一种目前比较多)
3)SATA
如果只有一个SATA硬盘,第一个SATA硬盘也是:
/dev/sda
4)IDE硬盘
第一个IDE接口主盘:
/dev/hda
第一个IDE接口从盘:
/dev/hdb
第二个IDE接口主盘:
/dev/hdc
第二个IDE接口从盘:
/dev/hdd
注意:
1)所以只靠/dev/sda无法知道设备类型,也许是SCSI,SATA或者U盘,但是一般来说/dev/sda都会是SCSI硬盘,本文不在详述SCSI,IDE,SATA区别,请参考相关资料
2)有关分区,见下文6.3DPT
6.2.MBR(MasterBootRecord)
MBR,即主引导记录,是对IBM兼容机的硬盘或者可移动磁盘分区时,在驱动器最前端的一段引导扇区,其地址为
采用CHS寻址:
MBR固定为硬盘的0柱面、0磁头、1扇区
采用LBA寻址:
MBR固定LBA0
(注意,我们将在后面介绍CHS与LBA,目前普片采用LBA寻址)
MBR长度为512字节,它一般由三个部分组成:
主引导程序
硬盘分区表DPT(DiskPartitiontable)固定4个分区,每分区16byte
分区有效标志,以55AA结尾的MBR
StructureofaclassicalgenericMBR
Address
Description
Size
(bytes)
Hex
Dec
+000hex
+0
Bootstrapcodearea
446
+1BEhex
+446
Partitionentry1
Partitiontable
(forprimarypartitions)
16
+1CEhex
+462
Partitionentry2
16
+1DEhex
+478
Partitionentry3
16
+1EEhex
+494
Partitionentry4
16
+1FEhex
+510
55hex
Bootsignature[a]
2
+1FFhex
+511
AAhex
Totalsize:
446+4*16+2
512
本表摘自:
https:
//en.wikipedia。
org/wiki/Master_boot_record
注意
1)由于后面支持EFI及GPT,上述结构有些变化,但在本文不作描述,有兴趣的读者可以参看相关EFI及GPT文档
2)上文中的boot。
img将会被grub2-install命令拷贝到MBR主引导程序部分(也就是Bootstrapcodearea),在后面将会详细分析boot。
img
====================================================
工具:
导出并查看MBR
====================================================
我们可以用DD命令把MBR从硬盘中导出来
[root@controllerimage]#ddif=/dev/sdaof=mbr。
binbs=1count=512
512+0recordsin
512+0recordsout
512bytes(512B)copied,0.00173968s,294kB/s
然后我们可以使用hexdump查看其内容
[root@controllerimage]#hexdump—Cmbr。
bin
00000000eb6390108ed0bc00b0b800008ed88ec0|。
c。
.。
....。
。
。
。
.。
。
|
00000010fbbe007cbf0006b90002f3a4ea210600|...|。
.。
。
。
。
..。
!
.。
|
0000002000bebe073804750b83c61081fefe0775|。
。
。
.8。
u。
。
。
..。
。
.u|
00000030f3eb16b402b001bb007cb2808a74018b|.。
。
.。
。
。
.。
|。
.。
t。
.|
000000404c02cd13ea007c0000ebfe0000000000|L。
.。
..|。
。
.。
..。
。
。
|
0000005000000000000000000000008001000000|。
.。
。
。
.。
。
.。
。
。
.。
。
.|
0000006000000000fffa9090f6c2807405f6c270|。
。
。
.。
。
....。
t。
。
.p|
000000707402b280ea797c000031c08ed88ed0bc|t.。
。
。
y|。
。
1。
.。
。
。
。
|
000000800020fba0647c3cff740288c252be057c|.。
.d|<.t。
。
。
R。
。
||
00000090b441bbaa55cd135a52723d81fb55aa75|。
A。
。
U..ZRr=。
。
U。
u|
000000a03783e101743231c0894404408844ff89|7。
.。
t21。
.D.@.D。
。
|
000000b04402c7041000668b1e5c7c66895c0866|D。
.。
.。
f。
。
\|f。
\。
f|
000000c08b1e607c66895c0cc744060070b442cd|。
.`|f。
\..D。
.p。
B.|
000000d0137205bb0070eb76b408cd13730d5a84|。
r。
。
。
p。
v.。
。
。
s。
Z.|
000000e0d20f83de00be857de98200660fb6c688|。
。
。
。
..。
}。
。
。
f。
。
.。
|
000000f064ff40668944040fb6d1c1e20288e888|d。
@f。
D。
。
.。
..。
。
。
.|
00000100f4408944080fb6c2c0e80266890466a1|。
@.D。
.。
.。
..f。
。
f。
|
00000110607c6609c0754e66a15c7c6631d266f7|`|f。
。
uNf.\|f1。
f.|
000001203488d131d266f774043b44087d37fec1|4..1.f。
t.;D。
}7..|
0000013088c530c0c1e80208c188d05a88c6bb00|。
。
0..。
。
。
.。
。
Z。
。
.。
|
00000140708ec331dbb80102cd13721e8cc3601e|p.。
1。
。
。
。
。
。
r.。
。
`.|
00000150b900018edb31f6bf00808ec6fcf3a51f|..。
.。
1。
。
。
.。
。
。
。
。
。
|
0000016061ff265a7cbe807deb03be8f7de83400|a。
&Z|.。
}.。
。
。
}。
4.|
00000170be947de82e00cd18ebfe475255422000|。
.}。
..。
..。
GRUB。
|
0000018047656f6d0048617264204469736b0052|Geom.HardDisk。
R|
0000019065616400204572726f720d0a00bb0100|ead。
Error。
.。
。
。
。
|
000001a0b40ecd10ac3c0075f4c3000000000000|。
。
。
。
.<。
u。
。
..。
。
。
.|
000001b00000000000000000a736080000008020|.。
。
。
..。
..6。
。
...|
000001c0210083dd1e3f0008000000a00f0000dd|!
。
。
。
.?
。
..。
..。
...|
000001d01f3f8efeffff00a80f000058f0000000|。
?
。
。
。
.。
.。
。
.X。
。
。
。
|
000001e000000000000000000000000000000000|.。
.。
.。
。
。
。
..。
.。
。
。
|
000001f0000000000000000000000000000055aa|.。
。
。
。
。
。
.。
.。
。
..U。
|
00000200
黑色部分为启动代码
蓝色部分为分区表DPT(下面会介绍)
红色部分为分区有效标志55AA
6.3.MBR分区表DPT(DiskPartitionTable)
DPT作为MBR中的一部分,已经使用了好长一段时间,直到最近GPT及EFI的出现。
但是DPT作为一个经典,还是有很多东西学习,在这一章我简要介绍一下DPT。
====================================================
工具:
fdisk
====================================================
linux上经典的工具fdisk就是对有关的DPT进行操作.
[root@controllersbin]#fdisk—l/dev/sda
Disk/dev/sda
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GRUB2 启动 过程 详解 精品 管理 资料