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
有兴趣的读者请参照man grub2-mkimage查阅相关信息,定制自己的core.img:
[lanzhou@controller image]$ grub2-mkimage -O i386-pc -p /boot/grub2 -v -o core.img xfs grub2-mkimage: info: the total module size is 0x26e4.
grub2-mkimage: info: reading /usr/lib/grub/i386-pc/kernel.img. grub2-mkimage: info: locating the section .text at 0x0. grub2-mkimage: info: locating the section .rodata at 0x5494. grub2-mkimage: info: locating the section .data at 0x6448. grub2-mkimage: info: locating the section .bss at 0x6bd0. 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: the core size is 0x5085.
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: writing 0x200 bytes. grub2-mkimage: info: writing 0x5bc5 bytes.
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接口主盘: 第一个IDE接口从盘: 第二个IDE接口主盘: 第二个IDE接口从盘:
注意:
/dev/hda /dev/hdb /dev/hdc /dev/hdd
1) 所以只靠/dev/sda无法知道设备类型,也许是SCSI, SATA或者U盘,但是一般来说/dev/sda都会是SCSI硬盘, 本文不在详述SCSI,IDE,SATA区别,请参考相关资料 2)有关分区,见下文6.3DPT
6.2. MBR(Master Boot Record)
MBR,即主引导记录,是对IBM兼容机的硬盘或者可移动磁盘分区时,在驱动器最前端的一段引导扇区,其地址为
采用CHS寻址: MBR固定为硬盘的0柱面、0磁头、1扇区 采用LBA寻址: MBR固定LBA0
(注意,我们将在后面介绍CHS与LBA,目前普片采用LBA寻址)
MBR长度为512字节,它一般由三个部分组成: 主引导程序
硬盘分区表DPT(Disk Partition table) 固定4个分区,每分区16byte 分区有效标志, 以55AA结尾的MBR
Structure of a classical generic MBR
Address Hex +000hex +1BEhex +1CEhex +1DEhex +1EEhex +1FEhex +1FFhex
Dec +0 +446 +462 +478 +494 +510 +511
Bootstrap code area
Partition entry 1 Partition entry 2 Partition entry 3 Partition entry 4
55hex
Boot signature[a]
AAhex
Total size: 446 + 4*16 + 2
512 2
Partition table (for primary partitions)
16 16
Description
Size (bytes) 446 16 16
本表摘自:https://en.wikipedia.org/wiki/Master_boot_record 注意
1) 由于后面支持EFI及GPT,上述结构有些变化,但在本文不作描述,有兴趣的读者可以参看相关EFI及GPT文档
2) 上文中的boot.img将会被grub2-install命令拷贝到MBR主引导程序部分(也就是Bootstrap code area),在后面将会详细分析boot.img
==================================================== 工具: 导出并查看MBR
====================================================
我们可以用DD命令把MBR从硬盘中导出来
[root@controller image]# dd if=/dev/sda of=mbr.bin bs=1 count=512 512+0 records in 512+0 records out
512 bytes (512 B) copied, 0.00173968 s, 294 kB/s
然后我们可以使用hexdump查看其内容
[root@controller image]# hexdump -C mbr.bin
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..| 00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........| 00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |................| 00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p| 00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......| 00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c |. ..d|<.t...R..|| 00000090 b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 |.A..U..ZRr=..U.u| 000000a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 |7...t21..D.@.D..| 000000b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 |D.....f..\\|f.\\.f| 000000c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd |..`|f.\\..D..p.B.| 000000d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 |.r...p.v....s.Z.| 000000e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 |.......}...f....| 000000f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 |d.@f.D..........| 00000100 f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 |.@.D.......f..f.| 00000110 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 |`|f..uNf.\\|f1.f.| 00000120 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 |4..1.f.t.;D.}7..| 00000130 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 |..0........Z....| 00000140 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e |p..1......r...`.| 00000150 b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f |.....1..........| 00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|..}....}.4.| 00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |..}.......GRUB .| 00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R| 00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error......| 000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.....<.u........| 000001b0 00 00 00 00 00 00 00 00 a7 36 08 00 00 00 80 20 |.........6..... | 000001c0 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 00 dd |!....?..........| 000001d0 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 f0 00 00 00 |.?.........X....| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200
黑色部分为启动代码
蓝色部分为分区表DPT(下面会介绍) 红色部分为分区有效标志55AA
6.3. MBR分区表DPT(Disk Partition Table)
DPT作为MBR中的一部分,已经使用了好长一段时间,直到最近GPT及EFI的出现。 但是DPT作为一个经典,还是有很多东西学习,在这一章我简要介绍一下DPT.
==================================================== 工具: fdisk
==================================================== linux上经典的工具fdisk就是对有关的DPT进行操作。
[root@controller sbin]# fdisk -l /dev/sda
Disk /dev/sda: 8589 MB, 8589934592 bytes, 6777216 sectors Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000836a7
Device Boot Start End Blocks Id System /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 16777215 7875584 8e Linux LVM
可以看到我的CentOS7上面/dev/sda这个SCSI硬盘包含了两个分区: sda1, sda2 注意其中sda1从2048 sector(LBA2048)开始
1) 我们说了MBR在第一个sector, 所有第一个分区sda1不能从0sector开始 2) 从很早前dos,第一个分区只能从LBA64开始,
3) 而从LBA2048开始是为了2011年后采用高级格式化的硬盘4k分区对齐
fdisk输出单位:
1 block = 1024bytes = 2 sectors
1 sector = 512bytes
==================================================== DPT解析
==================================================== 如果把上一章6.2MBR中导出的mbr.bin HEX中的DPT对比查看
partition1: 80 20 21 00 83 dd 1e 3f 00 08 00 0000 a0 0f 00 partition2: 00 dd 1f 3f 8e fe ff ff 00 a8 0f 0000 58 f0 00 partition3: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 partition4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
对照下面两张表翻译过来 引导标志 分区类型 partition1 partition1 0x80(活动) 0x00 0x83(Linux) 0x8e(Linux LVM) 起始扇区 0x0800 (2048 sectors) 0x0fa800 (1026048 sectors) 总扇区 0xfa000 (1024000 sectors) 0xf05800 (15751168 sectors) 与fdisk输出完全一致