2007年1月26日星期五

GURB 与 MBR

系统启动

在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。BIOS 的第一个步骤是加电自检(POST)。POST 的工作是对硬件进行检测。BIOS 的第二个步骤是进行本地设备的枚举和初始化。

系统启动阶段依赖于引导 Linux 系统上的硬件。在嵌入式平台中,当系统加电或重置时,会使用一个启动环境。这方面的例子包括 U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平台通常都是与引导监视器搭配销售的。这些程序位于目标硬件上的闪存中的某一段特殊区域,它们提供了将 Linux 内核映像下载到闪存并继续执行的方法。除了可以存储并引导 Linux 映像之外,这些引导监视器还执行一定级别的系统测试和硬件初始化过程。在嵌入式平台中,这些引导监视器通常会涉及第一阶段和第二阶段的引导加载程序。给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码和运行时服务。当 POST 完成之后,它被从内存中清理了出来,但是 BIOS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务。

要引导一个操作系统,BIOS 运行时会按照 CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备,甚至是 USB 闪存。

通常,Linux 都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。MBR 是一个 512 字节大小的扇区,位于磁盘上的第一个扇区中(0 道 0 柱面 1 扇区)。当 MBR 被加载到 RAM 中之后,BIOS 就会将控制权交给 MBR。

提取 MBR 的信息

要查看 MBR 的内容,请使用下面的命令:

# dd if=/dev/hda of=mbr.bin bs=512 count=1
# od -xa mbr.bin

这个 dd 命令需要以 root 用户的身份运行,它从 /dev/hda(第一个 IDE 盘) 上读取前 512 个字节的内容,并将其写入 mbr.bin 文件中。od 命令会以十六进制和 ASCII 码格式打印这个二进制文件的内容。
















第一阶段引导加载程序

MBR 中的主引导加载程序是一个 512 字节大小的映像,其中包含程序代码和一个小分区表(参见图 2)。前 446 个字节是主引导加载程序,其中包含可执行代码和错误消息文本。接下来的 64 个字节是分区表,其中包含 4 个分区的记录(每个记录的大小是 16 个字节)。MBR 以两个特殊数字的字节(0xAA55)结束。这个数字会用来进行 MBR 的有效性检查。

第二阶段引导加载程序

次引导加载程序(第二阶段引导加载程序)可以更形象地称为内核加载程序。这个阶段的任务是加载 Linux 内核和可选的初始 RAM 磁盘。

在 x86 PC 环境中,第一阶段和第二阶段的引导加载程序一起称为 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由于 LILO 有一些缺点,而 GRUB 克服了这些缺点,因此下面让我们就来看一下 GRUB。(有关 GRUB、LILO 和相关主题的更多内容,请参阅本文后面的 参考资料 部分的内容。)

关于 GRUB,很好的一件事情是它包含了有关 Linux 文件系统的知识。GRUB 不像 LILO 一样使用裸扇区,而是可以从 ext2 或 ext3 文件系统中加载 Linux 内核。它是通过将两阶段的引导加载程序转换成三阶段的引导加载程序来实现这项功能的。阶段 1 (MBR)引导了一个阶段 1.5 的引导加载程序,它可以理解包含 Linux 内核映像的特殊文件系统。这方面的例子包括 reiserfs_stage1_5(要从 Reiser 日志文件系统上进行加载)或 e2fs_stage1_5(要从 ext2 或 ext3 文件系统上进行加载)。当阶段 1.5 的引导加载程序被加载并运行时,阶段 2 的引导加载程序就可以进行加载了。

当阶段 2 加载之后,GRUB 就可以在请求时显示可用内核列表(在 /etc/grub.conf 中进行定义,同时还有几个软符号链接 /etc/grub/menu.lst/etc/grub.conf)。我们可以选择内核甚至修改附加内核参数。另外,我们也可以使用一个命令行的 shell 对引导过程进行高级手工控制。

将第二阶段的引导加载程序加载到内存中之后,就可以对文件系统进行查询了,并将默认的内核映像和 initrd 映像加载到内存中。当这些映像文件准备好之后,阶段 2 的引导加载程序就可以调用内核映像了。

GRUB 阶段引导加载程序
/boot/grub 目录中包含了 stage1stage1.5stage2 引导加载程序,以及很多其他加载程序(例如,CR-ROM 使用的是 iso9660_stage_1_5

============================================================================================================

1, MBR 总共有 512 个字节,前面446个字节是一个最简单的 boot loader,这个boot loader 的任务很简单,就是将第一个要启动的分区的第一个扇区装入内存。boot loader 之后64个字节是分区表,最后两个字节是 0x55AA.
2, M$ dos 下的 fdisk /mbr 命令就是将 M$ 的boot loader 写入 MBR 的前 446 个字节。M$ 的位于 mbr 的 boot loader 是根据分区的 activity 信息来决定装入哪个分区的。
3, Linux 的 grub-install /dev/hda 也会将自身的 stage1 内容写入 MBR 的前 446 个字节。实际上 grub 是一个很大的 boot loader,不可能全部放在 MBR 的 446 个字节里面,其他内容放在 /boot/grub 下面(debian sarge为例)。grub 比 M$ 的boot loader 智能,支持用户选择所配置的启动分区,然后装入这个分区的启动扇区。

综上所述,如果系统的 MBR 坏了,最简单的办法是用 DOS 启动盘启动系统后执行 fdisk /mbr 命令或者用 Linux 的启动盘启动系统后,chroot 到原来的 Linux 根目录下运行 grub-install /dev/sda 命令。

4, 关于 dd

4.1, dd if=/dev/hda of=/mbr.bak bs=446 count=1

这样可以把可用的 MBR 备份出来。

4.2, dd if=/mbr.bak of=/dev/hda bs=446 count=1

将原来备份的 MBR 恢复到硬盘上。

4.3, dd if=/dev/zero of=/dev/hda bs=446 count=1

将 MBR 上的 boot loader 删除掉,这样之后系统是不能启动的了,因为 BIOS 根据用户配置找到要启动的设备后没有boot loader 的入口了。这个命令看起来没有用,但是当 grub-install 或者 fdisk /mbr 在某些特殊情况下运行失败的情况下,先执行上述清空命令后往往可以解决问题。

附:上述 hda 表示硬盘为 IDE, sda 表示硬盘为SCSI 或者 SATA; grub 不仅可以安装在 MBR,grub-install 命令还支持将 grub 安装到指定分区的头部。

===============================================================================================================

参考资料

学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • Boot Records Revealed 是有关 MBR 和各种引导加载程序很好的资源。这个资源不仅仅是有关 MBR 的资料的汇编,还讨论了 GRUB、LILO 和各种 Windows® 引导加载程序的问题。

  • 请查看 Disk Geometry 页面来理解磁盘及其结构。您会发现有关磁盘的有用属性。

  • live CD 是一个可以从 CD 或 DVD 上引导的操作系统,它不需要使用硬盘。

  • 引导加载程序之争:了解 LILO 和 GRUB”(developerWorks,2005 年 8 月)详细介绍了 LILO 和 GRUB 引导加载程序。

  • 在 developerWorks 上的 LPI 考试准备 系列教程中,我们可以学习有关引导 Linux 系统的详细介绍,以及在准备参加系统管理员认证考试时需要准备的 Linux 基础知识。

  • LILO 是 GRUB 的先驱,但是我们可能发现它依然可以引导 Linux。

  • mkintrd 命令用来创建初始的 RAM 磁盘映像。这个命令可以用来构建初始的根文件系统,它可以用来引导允许提前加载访问真正根文件系统所需要的块设备的配置。

  • Debian Linux Kernel Project 中,我们可以找到更多有关 Linux 内核、引导和嵌入式开发的信息。

  • developerWorks Linux 专区 中可以找到为 Linux 开发人员准备的更多资源。

  • 随时关注 developerWorks 技术事件和网络广播

获得产品和技术
  • MicroMonitor 为各种小型的目标设备提供了引导环境。我们可以使用这个监视器在嵌入式环境中引导 Linux。它已经移植到 ARM、 XScale、MIPS、PowerPC、Coldfire 和 Hitachi 的 Super-H 上了。

  • GNU GRUB 是一个具有众多选项和灵活性的引导 shell。

  • LinuxBIOS 是 BIOS 的一个替代品。LinuxBIOS 不但可以引导 Linux,而且它本身就是一个压缩的 Linux 内核。

  • OpenBIOS 是另一个可移植的 BIOS 项目,可以在很多体系结构上进行操作,例如 x86、Alpha 和 AMD64。

  • kernel.org 上可以找到最新的内核树。

  • 订购免费的 SEK for Linux,它有两张 DVD,其中包括最新的 IBM for Linux 的试用版软件,这些软件包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。

  • 使用 IBM 试用版软件 改进您的下一个开发项目,从 developerWorks 上可以直接下载这些软件。


没有评论: