BIOS 和 EFI 平台启动光盘的制作

来源:互联网 发布:2030年人工智能 编辑:程序博客网 时间:2024/05/29 07:01

Legacy BIOS boot 介绍及启动光盘制作


Legacy BIOS boot 介绍

首先了解一下 Legacy BIOS 如何启动或引导。当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。这个位置在基本输入 / 输出系统(BIOS) 中,它保存在主板上的闪存中。CPU 会调用这个重置向量来启动一个位于闪存 /ROM 中的已知地址处的程序。通常,它执行一个启动自测(POST)来检查机器。最后,它从引导驱动器上的主引导记录(MBR)加载第一个扇区。

这时第一阶段的引导加载程序开始了。引导程序 boot loader 就位于 MBR 第一个扇区里面。此时 boot loader 就被装入 RAM 并执行。这个引导加载程序在大小上小于 512 字节(一个扇区),其作用是加载第二阶段的引导加载程序。

当第二阶段的引导加载程序被装入 RAM 并执行时,通常会显示一个动画屏幕,并将 Linux 和一个可选的初始 RAM 磁盘(临时根文件系统)加载到内存中。在加载映像时,第二阶段的引导加载程序就会将控制权交给内核映像,然后内核就可以进行解压和初始化了。在这个阶段 中,第二阶段的引导加载程序会检测系统硬件、枚举系统链接的硬件设备、挂载根设备,然后加载必要的内核模块。完成这些操作之后启动第一个用户空间程序(init),并执行高级系统初始化工作。


图 1. 开机过程示意图

图 1. 开机过程示意图

制作支持 EFI 平台的启动光盘的步骤

ELILO 是一种基于 EFI 开发的 boot loader,而不是基于 BIOS 平台 , ELILO 允许用户在系统开机过程中自己选择哪个系统或内核,同时也支持用户传参数给内核。 ELILO 的配置文件,一般位于 EFI 启动分区。下面的实例就是将 elilo 作为 EFI 平台的 boot loader。

步骤一:配置 elilo.conf

EFI 文件从 Suse 11 SP1 的光盘中获得,路径是 /boot/x86_64/efi.


清单 4. 查看 efi 文件命令
 mount -o loop /boot/x86_64/efi efiimg 

在 efiimg/efi/boot 文件下,可以看到如下四个文件:

 bootx64.efi  elilo.conf  initrd  linux 

如果需要按自己需求更改 efi 文件,自己定制 efi boot image 方法如下

首先需要按自己需求更改 elilo.conf 文件,比如我的配置如下:


清单 5. 配置 elilo.conf 文件
 prompt   timeout=80   default=myEFIiso   image=img2au      label=myEFIiso      initrd=img3au      append="vga=0x317 root=/dev/ram0 rw ramdisk_size=140000 \     debug_level=1 silent_boot=no boot_src=3 media_boot=no iommu=soft"

参数详解如下:

prompt —设定默认行为为交互模式

timeout=tsecs — 设置在菜单到自动启动系统前的时间,单位是 1/10 秒。无论是选定了默认开机选项或者没有设定默认开机项目,当超时时间过后,第一个开机选项会被选中。

default=name — 设置默认开机选项,这个参数的值必须和 label 参数中的值匹配。如果没有设定默认开机选项,那么第一个开机选项将会被选中。

image=kernel — 设定 Linux 开机的内核,通常情况下是 vmlinuz 文件

label=name — 这个参数的值是设定为可以指向读取的开机选项

initrd=image — 指定 initrd 文件,用于初始化和启动 linux 内核。这个镜像文件通常位于 EFI 分区

root=diskptn —指定 mount 为磁盘根分区的目标文件

append="options" — 指定内核载入开机中传递给内核的参数

步骤二:定制 EFI 文件

当自己定制的 elilo.conf initrd linux 准备完毕后,在 RHEL6.0 或者更高版本 :


清单 6. 定制 EFI 文件
 # dd if=/dev/zero of=efibootimg bs=1M count=36  # mkfs.vfat efibootimg  # mkdir -p /mnt/loop  # mount -o loop efibootimg /mnt/loop  # mkdir -p /mnt/loop/efi/boot/  # cp efiimg/efi/boot/bootx64.efi /mnt/loop/efi/boot/bootx64.efi  # cp img2au /mnt/loop/efi/boot/              # cp img3au /mnt/loop/efi/boot/              # cp efiimg/efi/elilo.conf /mnt/loop/efi/boot/           # umount /mnt/loop 

步骤三:制作 EFI 平台启动光盘


清单 7. 制作 EFI 平台启动光盘的命令
 # genisoimage -e efibootimg -no-emul-boot -J -R -c boot.catalog \ -hide boot.catalog -hide efibootimg -o /tmp/testcdimage.iso . 

其中参数 -e FILE 是指定 EFI boot image


制作同时满足 EFI 平台和 BIOS 平台的引导要求的启动光盘

在准备完制作支持 EFI 平台的启动光盘所需文件后,将定制好的 efibootimg 放在需要打包成 iso 格式的文件根目录下,目录结构如下


清单 8. MyBIOSEFIiso 目录结构
 |---isolinux  | |---isolinux.bin  | |---isolinux.cfg  |---efibootimg  |---kernel  |---initrd  |---readme 


清单 9. 制作同时满足 EFI 平台和 BIOS 平台的引导要求的启动光盘命令
 # mkisofs -quiet -b isolinux/isolinux.bin -c boot.cat -no-emul-boot \ -boot-load-size 4 -boot-info-table -eltorito-alt-boot \ -e efibootimg -no-emul-boot -R -J  -o /tmp/testcd.iso . 

原创粉丝点击