grub的理解

1 前言

本文主要用来整理和描述在工作过程中使用grub遇到的问题和查阅的相关资料并做了个人总结,并未涉及到对grub的源码分析。

最近要将我很久之前为公司移植到一个新的硬件平台(Intel Bay Trail)上的系统进行备份,用来给生产人员在出厂硬件平台上将系统烧写进去。

由于硬件平台上的磁盘大小有32G,系统中用到的只有2G,所以没有进行全盘备份,只是使用dd指令分别备份MBR+GRUB和系统分区。然而,就是在备份GRUB的时候便出了问题,这篇文章就是在解决完问题后的一个总结。


2 问题描述

在我之前备份GURB的时候都是直接备份磁盘的起始64个扇区,这样就可以直接将stage1和stage1.5同时备份下来,但是这次备份这个硬件平台就不行了。于是便开始了grub资料的查询。


3 GRUB的工作流程

GRUB的全称是 GRand Unified Bootloader,俗称统一的引导程序。GRUB支持引导Linux、DOS、Windows或者BSD系统。
要明白GRUB是如何工作的,我们首先得了解PC操作系统的启动流程。从整体上看,启动流程为:BIOS->GRUB->Kernel->文件系统。

3.1 上电时(BIOS)

当设备上电时,设备的主板首先会从主板中的BIOS ROM中加载和启动BIOS。BIOS会对设备的硬件进行检查和初始化,其中比较重要的就是便是初始化内存、屏幕和磁盘等存储设备了。在完成自检和初始化后,BIOS会根据用户设置或者默认配置选择一个设备作为启动设备。然后读取该设备的第一个扇区中的前446字节到内存中,并将控制权移交给这446字节中代码。

3.2 GRUB登场

在BIOS完成使命后便会将控制权交给上面所说的446字节的程序,而这个446字节里放的程序就是我们所说的BootLoader了。这个446可以根据用户的需求安装不同的BootLoader,如Windows的Bootloader和Linux GRUB。既然这篇文章是讲GRUB的,那么我们当然假设这个446字节安装的就是GRUB了。这个446个字节就是GURB的stage1了。

由于只有446字节,因此GRUB stage1也做不了啥大事,就只能打印打印点信息,找找GRUB的stage2。而问题也就是在这里发生的了。

3.3 stage1.5?

相信看这篇文章的同学们或多或少都对grub有一点的基础了,相信大家也知道grub还有个阶段是stage1.5。在正常的情况下stage1.5是安装在第一个扇区之后的63个扇区中的。他的作用也比较明确,那就是识别文件系统,在文件系统中加载stage2和grub的配置文件了。

在Linux系统中,grub stage2经常存储在/boot/grub/目录下,你们也可以看看你们的这个目录下是不是有个叫stage2的文件,这个文件就是grub的stage2,加载完grub后,既可以正常加载Linux内核和挂载文件系统了。然而,问题在于stage1.5是可选的!!!。这就是为什么我使用备份有stage1.5的方法来备份系统会引导不起来。

在使用了stage1.5的系统中,grub在磁盘中的布局如下:
来源:https://unix.stackexchange.com/questions/259143/how-does-grub-stage1-exactly-access-load-stage-2
来源:https://unix.stackexchange.com/questions/259143/how-does-grub-stage1-exactly-access-load-stage-2

那加不加stage1.5的区别在哪里呢?

3.4 stage2

刚刚我们也说了,在有stage1.5的系统上,stage2是直接放在文件系统中的,直接通过stage1.5就可以加载了。那么在没有stage1.5的系统中stage2是在哪里呢?

没错,就是放在和stage1.5的位置那里。但是不止63个扇区。它可以放在第一个扇区到第一个分区的第一个扇区前的空间中,那么这个空间就大了,可以容纳得下stage2的庞大身躯了。这样一来,在执行完stage1后就可以直接运行stage2了。

所以有无stage1.5的区别在于,前者只需要备份设备的前64个扇区,后面的需要备份到第一个分区前的所有扇区。


4 真相大白

现在我们就知道问题出在哪里了。我使用的是备份有stage1.5的方法,来备份没有stage1.5的系统。

$ sudo dd if=/dev/sda of=grub.img bs=512 count=64

这将导致stage2只被备份了一部分,超过64个扇区的部分就没有被备份到,所以才会一直无法正确启动。
使用下面的指令就可以正常的备份无stage1.5的系统了。

$ sudo dd if=/dev/sda of=grub.img bs=512 count=150

这里的count大家需要去看你们系统中的第一个分区的起始扇区在哪来修改。


5 总结

总得来说,问题很简单和简单,遇到这个问题的根本原因就是,我之前查阅的大部分国内资料对于gurb的描述都是一样的,都是没有描述grub stage1.5可选的问题,也由于我对grub不够了解的原因(当前也一样)。


6 参考文档

1,GRUB全解析 https://www.dedoimedo.com/computers/grub.html
2,Linux启动过程解析 https://linoxide.com/booting/boot-process-of-linux-in-detail/
3, GRUB stage1是如何访问stage2的 https://unix.stackexchange.com/questions/259143/how-does-grub-stage1-exactly-access-load-stage-2
4,GRUB的官方安装教程 https://www.gnu.org/software/grub/manual/legacy/Installation.html#Installation

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值