关于linux建立u盘legacy启动方式引导

前言

我一直在用linux,但是我在linux制作pe启动盘无法实现,windows有很多制作pe启动盘的软件,如大白菜,u深度什么的,但是linux没有对应的软件,所以我想写一个类似的工具,那么就有必要研究一下,u盘启动方面的知识,到目前为止软件也写好了

u盘启动的方式

现在无论是电脑还有u盘,他们的启动方式只有两种:
1.uefi启动
2.legacy启动

关于uefi启动方式我之前有一篇文章详细说过,这里主要说一下legacy启动。也是一直困扰我很久的问题
与uefi启动不同的是,legacy启动是需要主引导记录的(或者分区引导记录),而主引导记录不是以文件的形式存在的,在硬盘或u盘里面存在的形式是存储到对应的数据块,这就导致坑了我很长时间
(关于更详细的解释,可以详细的看百度百科)

修改或查看主引导记录的软件

1.dg分区工具(查看对应扇区的二进制数据)
2.BOOTICE(查看或修改主引导记录)
在这里插入图片描述
点击 主引导记录按钮 就可以查看或修改主引导记录

grub4dos

大白菜启动盘legacy启动用的主引导记录是 grub4dos,占用16个扇区,一个扇区是512字节,这种引导方式也是大部分制作启动盘软件用的引导,可以启动windows也可以启动linux,而且这是个开源项目

怎么实现一个支持legacy启动的u盘

为了建立一个支持legacy启动的u盘,我使用grub4dos这种引导,可以通过bootice 这个软件将引导备份成二进制数据。

然后这个文件可以保存下来
在这里插入图片描述
图片中的主引导记录是windows nt 6.x mbr,所以你要提取出 grub4dos 的主引导记录,你可以下个大白菜启动盘制作工具,制作个启动盘,然后再从u盘中提取主引导记录。(不过这太傻了,所以我打算把资源放上来,会在文章结束给出链接)

然后使用dd工具将grub4dos主引导记录写入到新u盘

dd  if=mbr.bin  of=/dev/sdc  bs=446 count=1
dd  if=mbr.bin  of=/dev/sdc skip=1 seek=1 count=15

mbr.bin 为我备份出来的主引导记录
sdc 为我u盘的设备名
这里我跳过 第一扇区的66字节(四个分区表4x16字节+结束标志 2字节),写入了u盘的前16个扇区
这里的原因可以看百度百科关于主引导记录的解释

1.主引导程序即主引导记录(MBR)(占446个字节)
可在FDISK程序中找到,它用于硬盘启动时将系统控制转给用户指定的并在分区表中登记了的某个操作系统。
2.磁盘分区表项(DPT,Disk Partition Table)
由四个分区表项构成(每个16个字节)。
负责说明磁盘上的分区情况,其内容由磁盘介质及用户在使用FDISK定义分区时决定。(具体内容略)
3.结束标志(占2个字节)
其值为AA55,存储时低位在前,高位在后,即看上去是55AA(十六进制)。

也就是我跳过了磁盘分区表项和结束标志,因为如果不跳过写入的话,新u盘会变成我之前备份u盘的容量大小,比如我重32g u盘备份出来主引导记录,然后还原到4g u盘里面,那么4g u盘也会变成32g,容量错乱,结束标志都一样,所以还原不还原都一样

另外前446 个字节是主引导记录,为什么grub4dos占用16个扇区呢?
关于这个问题,我详细的研究了一下,我单独只还原前 446个字节不还原后15个扇区的数据,然后用 bootice 软件是可以识别到引导的,由此推断前446个字节可以声明引导类型,而主引导逻辑写到后15扇区了,由此我想到了我也可写一个类似bootice的软件(linux平台上的),毕竟linux上还没有bootice这么好用的软件,只判断前446个字节的数据,从而识别主引导记录类型

回归正题
然后在u盘里面放一个 grldr 和一个 menu.lst 文件就可以legacy 启动用到grub4dos引导了
grub4dos 启动 bootmgr 命令

chainloader /bootmgr
boot

这里给一个menu.lst文件例子:

title  Start
chainloader /bootmgr
boot

到这里支持legacy启动的u盘就已经制作好了,剩下的就是找一个较好的pe盘镜像了

其他

我制作了在linux上一件制作pe启动盘的软件
在这里插入图片描述
在这里插入图片描述
用pyqt5写的一个简单图形化界面。模拟启动调用的qemu 命令


补上: grub4dos主引导记录二进制数据+grldr下载地址

posted @ 2019-10-24 20:48  Hello_wshuo  阅读(217)  评论(0编辑  收藏  举报