MBR vs GRUB Legacy vs GRUB2

2018-01-22|Categories: Linux, Magedu-training|

MBR vs GRUB

MBR全称是Master Boot Record,译为主引导记录,又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区(sector 0),总共512字节。

MBR由三部分组成:

  • Boot loader:446字节
  • 磁盘分区表:64字节
  • MBR结束标记:2字节
    • 有效的结束标记:0x55AA0xAA55
    • 无效的结束标记表示MBR已损坏,或已丢失

目前,GRUB是最常见的boot loader,GRUB的第一部分(Primary boot loader)会被安装到MBR中。

值得注意的是,GRUB的第一部分在硬盘上有对应的文件,但在被写入MBR之前,文件大小是512字节。不是说boot loader只占用446字节吗?

# CentOS 6
$ ls -l /boot/grub/stage1
-rw-r--r--. 1 root root 512 Nov  7 15:41 /boot/grub/stage1

# CentOS 7
$ ls -l /boot/grub2/i386-pc/boot.img
-rw-r--r--. 1 root root 512 Dec 14 13:08 /boot/grub2/i386-pc/boot.img

这是因为,GRUB的第一部分在写入MBR之前,不包含有效的分区表信息

CentOS 6:

# 写入前
$ file /boot/grub/stage1
/boot/grub/stage1: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, 
GRUB version 0.94, code offset 0x48

# 写入后
# 可以省略`bs=512`,因为`ibs`和`obs`的默认值都是512字节
$ dd if=/dev/sda of=/tmp/mbr-centos6 bs=512 count=1
$ file /tmp/mbr-centos6
/tmp/mbr-centos6: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, 
boot drive 0x80, 1st sector stage2 0x849fe, GRUB version 0.94; 
partition 1: ID=0x83, active, starthead 32, startsector 2048, 1024000 sectors; 
partition 2: ID=0x83, starthead 221, startsector 1026048, 20480000 sectors; 
partition 3: ID=0x83, starthead 254, startsector 21506048, 16384000 sectors; 
partition 4: ID=0x5, starthead 254, startsector 37890048, 4052992 sectors, 
code offset 0x48

CentOS 7:

# 写入前
$ file /boot/grub2/i386-pc/boot.img
/boot/grub2/i386-pc/boot.img: x86 boot sector; 
partition 4: ID=0xd4, starthead 205, startsector 4277266767, 0 sectors, 
code offset 0x63

# 写入后
$ dd if=/dev/sda of=/tmp/mbr-centos7 bs=512 count=1
$ file /tmp/mbr-centos7
/tmp/mbr-centos7: x86 boot sector; 
partition 1: ID=0x83, active, starthead 32, startsector 2048, 2097152 sectors; 
partition 2: ID=0x83, starthead 170, startsector 2099200, 209715200 sectors; 
partition 3: ID=0x82, starthead 254, startsector 211814400, 4194304 sectors; 
partition 4: ID=0x5, starthead 254, startsector 216008704, 203421696 sectors, 
code offset 0x63

GRUB Legacy vs GRUB2

阶段和模块

执行file /tmp/mbr-centos6会看到GRand Unified Bootloader, stage1 version 0x3,因为CentOS 6使用的GRUB Legacy需要分三个阶段(stage)执行。

  • Stage 1:存放在MBR前446字节,包含的内容是Stage 1.5或Stage 2存放的磁盘块(block)位置,作用就是通过读取磁盘块载入Stage 1.5或Stage 2。
  • Stage 1.5:存放在MBR之后、第一个分区(/boot)之前,包含的内容是Stage 2所在分区的文件系统的驱动,作用是加载文件系统驱动,然后通过读取文件路径载入Stage 2。对于ext4文件系统,GRUB不需要载入Stage 1.5。

    For some file system types such as ext4, GRUB does not need to load stage1_5.
    https://docs.oracle.com/cd/E37670_01/E41138/html/ch04s02.html#

  • Stage 2:存放在/boot/grub/stage2,作用是读取/boot/grub/grub.conf,决定如何载入内核。

而CentOS 7使用的GRUB2不再使用Stage1、1.5、2,而只分为两个阶段,所以file /tmp/mbr-centos7的输出就不会包含「stage1」字样。

另外,GRUB Legacy只支持很少的模块,而GRUB2支持许多模块,因此GRUB2第二阶段文件/boot/grub2/i386-pc/core.img体积更小。

图片来自 https://www.slideshare.net/iamumr/iv-showdown

定位磁盘、识别分区

  • GRUB Legacy使用物理和逻辑地址定位磁盘,GRUB2使用更可靠的UUID识别磁盘。
  • GRUB Legacy不能读取LVM和RAID分区,GRUB2可以。

磁盘分区号

  • GRUB Legacy硬盘分区号从0开始,GRUB2从1开始。

配置文件

  • GRUB Legacy的配置文件使用独特的格式,GRUB2的配置文件格式非常接近脚本语言。
  • GRUB Legacy有两个配置文件,GRUB2只有一个主要配置文件。
  • GRUB Legacy的配置文件普通用户很难修改,GRUB2可以使用grub-mkconfig自动修改。

GRUB Legacy加密

# 生成密码,默认使用SHA512算法
$ grub-crypt
Password:
Retype password:
$6$BgEb1xgc9uWgwAzi$Et1PRZaXN8HJXGIWbkYXyEoOwyLtkgZkZ2NTAkjxw91psHQJlvuyqIrZg5DHgELBBUF49A1xBg9PeQSecPBv4.

# 编辑`grub.conf`文件
vim /boot/grub/grub.conf

# 复制第一步生成的密码粘贴到`password --encrypted`后面,
# 注意,必须是放在同一行。
# 如果要取消GRUB加密,删除这一行即可。
password --encrypted $6$BgEb1xgc9uWgwAzi$Et1PRZaXN8HJXGIWbkYXyEoOwyLtkgZkZ2NTAkjxw91psHQJlvuyqIrZg5DHgELBBUF49A1xBg9PeQSecPBv4.

Leave A Comment