使用 GRUB 引导
GRUB:它既不是幼虫,也不是快餐,也不是 GNU 自由软件群中最可爱的首字母缩写。相反,GRUB 是 GNU GRand Unified Bootloader(GNU 通用引导加载程序)。而且,它确实是引导 Linux 以及几乎任何其他操作系统(开源或其他)的最佳加载程序,您可以将它们分散在您的磁盘上。
GRUB 独立于任何特定的操作系统,可以被认为是一个微小的、功能特定的操作系统。GRUB 内核的目的是识别文件系统并加载引导镜像,它提供菜单驱动和命令行界面来执行这些功能。特别是命令行界面非常灵活和强大,具有 bash shell 用户熟悉的命令历史记录和补全功能。
GRUB 在多引导、多磁盘系统中如鱼得水,这在 Linux 和开源冒险家中很常见,他们可能同时测试或跟踪多个 Linux 发行版、BSD、GNU/Hurd、BeOS,甚至可能为比尔先生保留一个残留分区。即使您坚持使用 LILO 作为系统的主要引导加载程序,保留一个 GRUB 引导软盘也是明智之举,因为如果您不小心破坏了主引导记录 (MBR),这是让您的系统恢复的最佳和最快方法。如果您进行过多次多引导安装,您就会确切地知道我在说什么。如果您需要更多考虑 GRUB 的理由,请查看边栏“为什么选择 GRUB”。让我们开始吧!
GRUB 的安装是一个两步过程。第一步是在主机操作系统环境中安装或构建 GRUB,为此,我们当然将使用 Linux。第二步是将 GRUB 安装并配置为系统的引导加载程序。
第一步是通常的步骤:下载源代码存档,解压,配置并执行 make install。假设您已经找到了一个源代码镜像(请参阅 www.gnu.org/software/grub/grub.html)并将源代码发行版下载到一个合适的工作目录中,请继续执行
tar -xzvf grub-0.5.96.1.tar.gz cd grub-0.5.96.1 ./configure make make install
这应该创建可执行文件:grub、grub-install 和 mbchk;在 /usr/local/share/grub/i386-pc/ 中安装支持文件,并安装 GNU 信息手册和 man 页面。
对于安装的第二步,我们将首先构建和使用 GRUB 引导软盘。这样,我们可以使用 GRUB 了解其功能,同时测试我们特定系统的各种配置。在熟悉了软盘上的 GRUB 设置后,我们将把它安装到系统第一个硬盘的 MBR 上。即使您决定不立即在硬盘上安装 GRUB,也没有什么坏处:您现在将拥有自己的 GRUB 引导软盘,可以用来救援引导加载程序损坏的系统。
GRUB 识别多种不同的文件系统类型,包括 Linux ext2fs、Reiser、MINIX、BSD 的 ffs 以及 FAT,因此可以使用这些文件系统中的任何一种制作 GRUB 引导软盘。但是,在本示例中,我们将坚持使用 FAT,因为它是最低公分母,并且大多数操作系统都有工具来挂载和读取/写入 FAT 软盘上的文件。这样,如果需要,我们将始终能够访问其菜单配置文件。
在您的杂物抽屉里翻找一些未使用的软盘(新的会更好),并对其进行全新格式化和 FAT 文件系统
fdformat /dev/fd0 mkfs -t msdos /dev/fd0
我们将在此磁盘上放置一些文件,所以继续挂载到您常用的软盘挂载点(这里我使用 /floppy)
mount -t msdos /dev/fd0 /floppy现在安装 GRUB 需要的目录和文件
mkdir -p /floppy/boot/grub cp /usr/local/share/grub/i386-pc/stage* /floppy/boot/grub然后可以卸载软盘,umount /floppy,但将其留在驱动器中。GRUB 软盘已准备就绪,可以进行最终安装,即将 GRUB 引导加载程序安装到软盘本身的 MBR 中。为此,我们将使用我们使用 Linux 安装构建的 grub 可执行文件。在 Linux 命令提示符下启动可执行文件:grub。
这将弹出一个 GRUB 命令行环境的模拟器,如图 1 所示。我们稍后将更详细地讨论此 shell 的功能。现在,在 grub 提示符下输入以下一系列命令
grub> root (fd0) grub> setup (fd0) grub> quit
就是这样!这一系列命令完成了在软盘上安装 GRUB 的过程。现在它是可引导的,并且允许我们引导系统上的任何其他操作系统。
要了解如何使用 GRUB 引导多种不同的操作系统,请考虑以下示例设置
第一个硬盘(SCSI,Linux /dev/sda):第 1 个主分区:Win98 第 2 个主分区:Linux-Slackware 第 3 个主分区:Linux-Debian 第 4 个主分区:Linux Swap 第二个硬盘(SCSI,Linux /dev/sdb)第 1 个主分区:FreeBSD 第 2 个主分区:OpenBSD 第 3 个主分区:BeOS
请注意,虽然 GRUB 和 Linux 能够处理扩展分区中的安装,但这里我们展示了尽可能使用主分区的偏好。主分区中的文件系统通常可以被其他操作系统挂载,而跨操作系统挂载扩展分区中的文件系统通常不受支持。
该系统有两个硬盘,七个分区上安装了六个不同的操作系统。您可能知道,每个操作系统都有自己的设备和分区命名法。例如,对于 Linux 来说,Slackware 安装将被称为 /dev/sda2(swap 在 /dev/sda4 上),而 FreeBSD 会将其文件系统识别为 /dev/da1s1a。或者,如果系统配置了 IDE 硬盘,Slackware 将在 /dev/hda2 上,FreeBSD 会将其根目录称为 /dev/ad1s1a。每当维护任何多引导设置时,您都会得到大量的这种字母汤。
由于 GRUB 也需要能够加载这些系统中的任何一个,因此它有自己的操作系统中立的命名约定来引用设备。硬盘都是 hd,软盘是 fd,设备编号从零开始,分区编号从零开始,完整的设备名称用括号括起来。
根据这些命名规则,软盘是 (fd0),Win98 分区是 (hd0,0),GRUB 分别将 Slackware 和 Debian 分区识别为 (hd0,1) 代表 slackware 和 (hd0,2) 代表 debian。
BSD 进一步细分了它们自己的分区(或 BSD 术语中的“slices”),GRUB 会将 FreeBSD 系统的根挂载称为 (hd1,0,a)。
好的,准备好让 GRUB 尝尝鲜了吗?将 GRUB 软盘滑入驱动器并重新启动系统(将系统的 BIOS 配置为从 A: 驱动器引导)。您应该看到 GRUB 简洁的引导消息,然后发现自己处于 GRUB 命令行环境中,如图 1 所示。
首先,让我们引导 Slackware。在 grub 提示符下输入以下命令
grub> root (hd0,1) grub> kernel /vmlinuz root=/dev/sda2 ro vga=791 grub> boot
砰、砰、砰,那张邮票大小的 Tux 出现在屏幕的左上角(是的,Slackware 配置为使用帧缓冲设备),Linux 以其快乐的方式引导进入光荣的存在。
另一个例子。再次使用 GRUB 软盘重新启动系统,并在 grub 提示符下输入以下命令
grub> rootnoverify (hd0,0) grub> makeactive grub> chainloader +1 grub> boot
现在您的屏幕变成了一片模糊的蓝色云,您认为自己犯了一个可怕的错误。然后您意识到这只是 Windows,您提醒自己总有一天要删除这个分区。
让我们仔细看看这些例子。在 Slackware 引导中,我们首先使用 GRUB root 命令来指定 GRUB 要访问的设备。如果设备具有 GRUB 识别的文件系统(即 ext2fs、reiser、ffs 等之一),它会尝试挂载它并获取其分区信息,然后在命令后报告其成功。因此,您会在屏幕上看到以下命令/响应对话框
grub> root (hd0,1) Filesystem type is ext2fs, partition type 0x83
接下来,我们使用 GRUB kernel 命令来指定 GRUB 要加载的引导镜像。kernel 命令的参数是引导镜像的文件名,相对于上面 root 命令指定的设备。内核镜像文件也可以用显式的 (device)/filename 术语指定,如下所示
grub> kernel (hd0,1)/vmlinuzkernel 命令为您提供了极大的灵活性,可以指定您希望加载的引导镜像。例如,如果我们将内核的先前版本保存到文件 /vmlinuz.old,我们可以使用以下命令指定它(这显示了 GRUB 的响应)
grub> kernel /vmlinuz.old root=/dev/sda2 ro vga=ask [Linux-bzImage, setup=0xe00, size=0xfad30]引导镜像名称后面的参数将传递给目标内核,与 GRUB 无关。对于 Linux,这些内核参数与您在 lilo.conf 中指定的参数非常相似。在我们的示例中,我们告诉内核要挂载哪个设备作为根分区 (root=/dev/sda2 ro),使用 Linux 期望的设备命名法。请注意,这里我们也使用 ro 标志来初始以只读方式挂载根文件系统,同时执行其文件系统检查。我们示例中的另一个内核参数只是演示了设置另一个内核变量 (vga=791) 以使用特定的 vga 模式进行帧缓冲显示。
最后,最后一个命令是 grub> boot。指定的内核镜像现在被加载并沿着通往引导王国的皇家大道滚滚而下。
第二个示例,使用 Win98,演示了 GRUB 的链式加载机制的使用。这种引导方法加载目标操作系统自己的引导链加载程序,而不是操作系统的内核镜像。在本例中,我们指定了
grub> rootnoverify (hd0,0) grub> chainloader +1
首先,rootnoverify 命令用于 GRUB 未专门识别的操作系统文件系统,以便 GRUB 不会尝试挂载分区。接下来,chainloader 命令将使用设备 (hd0,0) 的分区的第一扇区,并尝试引导在那里找到的任何内容。这是一种常见的引导操作系统的方法,这些操作系统将其自己的引导加载程序安装在安装它们的分区的第一个扇区中(这有时称为分区引导扇区或 PBR)。
最后,makeactive 命令在 root 命令指定的设备的分区表中设置活动标志,因为某些操作系统(如 Win98)需要这样做。
GRUB 命令行既简单又有趣,您应该多次引导系统上的不同操作系统,以掌握它。在您进行测试时,请务必记录下任何特定于成功加载特定内核的注意事项。当您配置 GRUB 的菜单系统以自动执行这些命令行步骤时,这些信息将非常有用。
但在我们离开命令行之前,这里还有一些 GRUB 命令值得一看。
help 命令将显示 GRUB 中大约 40 个可用命令的列表。在 help 之后键入特定命令的名称将生成该特定命令的在线帮助。因此,grub> help kernel 将告诉您有关使用 kernel 命令的所有信息。
cat 命令可用于查看文件的内容。例如,grub> cat (hd0,2)/etc/fstab 将显示 Debian 安装中的 /etc/fstab 文件的内容。如果您的普通引导加载程序被破坏,这是一种非常方便的方式来提取系统配置信息。另请注意,当您使用 GRUB 命令行时,就像 bash 一样,上下箭头将滚动浏览命令历史记录,而制表符将完成 GRUB 命令或文件名的名称。
最后,您可以使用 configfile 命令调用特定的菜单界面,如下所示
grub> configfile (fd0)/boot/grub/menu.lst
这将使 GRUB 切换到菜单模式,其界面由文件 menu.lst 定义。我们尚未创建该文件,但是——注意,转折来了!——这正是我们接下来要做的。
使用 GRUB 命令行很酷,但在启动系统数千次后,您可能会有点厌倦在 GRUB 提示符下输入相同的命令,并渴望更自动化一些。来自 GRUB 团队的好消息:您将获得一个完全可配置的菜单界面,无需额外付费!GRUB 引导菜单为您提供点击即选的引导选择、可配置超时后的无人值守默认引导、如果之前的引导失败的任意数量的后备引导、在命令行和菜单模式之间切换,以及菜单选择的交互式编辑和密码保护。这些功能使 GRUB 易于使用,与其强大的功能相匹配。
当 GRUB 引导时,它会自动在其引导设备上查找 /boot/grub/menu.lst 文件(最后三个字母是“ELL ess tee”,而不是“one ess tee”)。如果找到该文件,GRUB 会自动进入其菜单模式,并向用户呈现一个令人惊叹的界面,如图 2 所示。
清单 1 [可在 LJ 的网站上找到] 显示了负责此演示菜单的配置文件。如您所见,它是一个简单的文本文件,类似于许多 UNIX 配置文件,其中以井号 (#) 开头的行和空行将被忽略。
第一组命令设置通用配置变量。timeout 命令设置在用户进行选择之前等待的秒数,然后自动进行 default 引导。default 命令设置 GRUB 应尝试自动引导的以下引导节中的哪一个。引导节根据它们在配置文件中出现的顺序隐式编号,从零开始。此顺序也是它们在菜单中列出的顺序。
fallback 命令指定如果默认值应失败,则加载哪个引导节。可以设置多个后备,如示例所示。
color 命令让您可以为文本模式菜单屏幕注入一些活力。color 命令的语法是
color foreground/background [ hilite-fg/hilite-bg ]
其中每个前景色/背景色都使用来自 black、blue、green、cyan、red、magenta、brown 和 light-gray;dark-gray、light-blue、light-green、light-cyan、light-cyan、light-red、light-magenta、yellow 和 white 集合的名称指定。在这些颜色中,只有前八种用于背景。可选的高亮颜色对(如果指定)将用于显示当前菜单选择。如果未指定,GRUB 将使用普通颜色的反色。
配置文件的其余部分由我们演示系统的引导节组成。title 命令标记新引导节的开始,其参数是将在菜单中显示为其条目的标签,从第一个非空白字符到行尾。每个节中的其余命令与从 GRUB 命令行工作时使用的命令相同。这里的例外是我们不再需要给出 boot 命令;GRUB 会在不需要询问的情况下完成这项工作。
此示例配置仅给出了 GRUB 引导加载程序的许多灵活用途的示例。除了多个操作系统,您还可以使用 GRUB 为测试内核、救援内核、不同的内核选项等设置菜单选择。
总而言之,GRUB 配置文件将与您的 /etc/lilo.conf 非常相似。在使用了 GRUB 命令行和这些示例之后,启动您喜欢的文本编辑器并创建一个适合您自己的系统和首选项的菜单配置文件应该是一件简单的事情。如果第一次不完美,请不要担心;您会看到您可以交互式地进行更改,并且 GRUB 命令行始终可用作后备。
获得配置文件后,再次挂载您的 GRUB 软盘,并将文件(假设已另存为 mygrub.conf)复制到魔法位置
cp mygrub.conf /floppy/boot/grub/menu.lst
现在,当您使用 GRUB 软盘引导时——瞧!——您将看到一个像图 2 中那样可爱的引导菜单。如果您愿意,只需盯着它几秒钟,等待它从超时设置倒计时,然后它将自动引导进入您的默认操作系统。或者,使用箭头键突出显示要加载的操作系统,然后按回车键。或者,键入 c 进入现在熟悉的 GRUB 命令提示符。从命令提示符下,按 ESC 键再次返回引导菜单。
也可以编辑菜单中显示的条目。键入 e 将打开一个简单的类似 vi 的编辑器界面,用于突出显示的条目。这允许您在引导之前调整或添加任何设置。在此处进行的任何更改都将在 GRUB 会话期间保持有效。要进行永久更改,您稍后需要在引导磁盘上编辑配置文件,并使用文本编辑器保存更改。
试用您的 GRUB 软盘配置,直到您将其设置为您喜欢的方式。只需启动几次系统,您就会像在餐馆里甩卖土豆饼一样快速地使用 GRUB。
此时您可能会想,“好吧,GRUB 确实很厉害。但我必须一直从这张蹩脚的软盘启动吗?” 当然不是。从软盘启动是给胆小鬼用的。
在硬盘主引导记录上安装 GRUB 的操作与创建 GRUB 软盘类似。唯一的区别是我们的软盘在一个地方拥有 GRUB 需要的所有资源。也就是说,引导镜像、支持文件和配置文件都位于软盘设备 MBR 和 /boot/grub/ 目录中。在硬盘设置中,您可以选择这些资源的位置。
例如,您可以在第一个硬盘的第一个分区上设置一个 /boot/grub 目录,并将所有 GRUB 文件复制到其中,就像我们在软盘设置中所做的那样。在我们的演示系统中,这将是 Win98 分区,如果您愿意,可以选择这样做。但是您也可以在机器上具有 GRUB 支持的文件系统的任何设备/分区中设置 /boot/grub 目录。在实践中,通常最好将此支持目录安装在您最常用和/或最稳定的分区中;也就是说,您不会一直重新安装的分区。
在本示例中,我们将使用 Slackware 分区,因为它保持相当稳定,而且我倾向于在 Debian 系统中进行更多跟踪和安装。一旦做出此决定,其他一切都很简单。首先,引导进入 Slackware,创建 /boot/grub 目录并将 GRUB 的文件复制到其中(这些都是 GRUB 构建安装在 /usr/local/share/grub/i386-pc 目录中的所有文件)。确保也将您手工制作的 menu.lst 配置文件放在这里。
接下来,启动 GRUB,可以使用您在 Linux 中构建的 grub 可执行文件,也可以使用 GRUB 软盘重新启动。如果 GRUB 以菜单模式启动,请按 c 进入命令行模式。在 grub 提示符下输入以下命令
grub> root (hd0,1) grub> setup (hd0) grub> quit
您完成了。您的系统现在已完全 GRUB 化,安装在硬盘的 MBR 中。以 root 身份键入 reboot(或取出软盘并用旧的三叉戟戳一下键盘),并观看 GRUB 现在启动得有多快!
关于这些安装命令的一些解释。第一个命令 root (hd0,1) 告诉 GRUB 挂载此设备,在本例中是安装了 Slackware 的分区。所有文件现在都将相对于此设备,因此 GRUB 安装程序将知道在其 Slackware 分区中创建的 /boot/grub 目录中查找其支持文件。
第二个命令 setup (hd0) 是 GRUB install 命令的简化前端。请特别注意,我们将设备指定为 (hd0) 而不是 (hd0,0)。设备 (hd0) 会导致 GRUB 安装到主引导记录,这正是我们想要的。如果我们改为使用 (hd0,0),GRUB 将安装到第一个分区的引导扇区,而不是 MBR。区别至关重要;您的技术作者犯了这样的错误,这样您就不必犯了。虽然每个分区都可以有一个引导扇区,但您的硬盘只有一个主引导记录,BIOS 每次启动机器时都会加载它。除非您正在进行某种时髦的引导链,例如使用 LILO 引导 GRUB,否则您通常会希望将 GRUB 安装在主引导记录中。
当 GRUB 将自身安装到设备上时,它首先将其自身的一小部分复制到 MBR,它称之为 stage1。然后,它在 stage1 之后添加了足够的信息,说明在哪里可以找到 GRUB 的其余部分。在我们的示例中,GRUB 会将 stage1 放在 MBR 中,后面跟着一个指向 Slackware 分区的块列表。然后,GRUB 将在 /boot/grub 目录中找到它需要的其余部分(它的 stage2 文件)。
要检查此设置,只需随时编辑 Slackware 的 /boot/grub/menu.lst 中的菜单配置文件即可。任何更改都将反映在下次启动中。
如果您以某种方式搞砸了硬盘安装,或者想要从系统中卸载 GRUB,以下是您需要了解的内容。
首先,如果您想清除 MBR 中安装的任何内容,规范方法是使用 MS-DOS 引导软盘中的 fdisk 程序
A:> FDISK /MBR
当然,如果您只想回到 LILO 作为系统的引导管理器,则不必这样做。在这种情况下,只需确保您的 /etc/lilo.conf 文件有一行写着 boot=/dev/hda。然后,当 lilo.conf 文件的其余部分是您想要的方式时,只需重新运行 LILO。这将把 LILO 放回系统的 MBR 中。
如果您将 GRUB 安装在分区的引导扇区中,而不是 MBR 中(例如指定 setup (hd0,0) 而不是 setup (hd0)),您可能需要重新安装该操作系统的引导加载程序。对于 DOS/Windows,这意味着从您的 DOS/Windows 引导软盘运行 sys 命令:A:> SYS C:。
如果这是一个 Linux 分区,再次重新运行 LILO 是有效的,其中 /etc/lilo.conf 的引导节中有一行写着 root=/dev/hda1。
一般来说,大多数操作系统都会有一种方法来重新安装其分区的引导扇区,而无需从头开始进行完整重新安装。(对于 FreeBSD,请参阅 boot0cfg(8);对于 OpenBSD,请参阅 installboot(8)。)
在实践中,特别是如果您按照 GRUB 软盘示例进行操作,您应该会发现 GRUB 本身是您工具包中最好的救援和系统恢复工具之一。例如,如果您曾经在 lilo.conf 文件中犯过错误,您就会知道如果您的系统无法启动,您可能会遇到一些大麻烦。使用 GRUB,您始终拥有一个微型、独立的操作系统,它可以识别和挂载不同的文件系统、查找文件、定位内核并引导它们,从而使您的系统恢复生机,以便您可以对其进行操作。在这样的时刻,GRUB 可以拯救您的困境。
正如 GNU 软件的典型特征一样,GRUB 具有超出此处描述的功能的丰富功能。其中一些包括
重新映射磁盘和隐藏分区,因此您甚至可以在第一个硬盘以外的硬盘上运行多个版本的 DOS/Windows。
使用 BOOTP 和 DHCP 协议进行网络引导,以支持跨网络的双引导方案和无盘操作。
键盘重新映射、磁盘几何结构访问、内存读取、I/O 端口和处理器探测、密码保护、解压缩支持等。
有关这些主题的更多信息,请参阅 GNU 信息手册。GRUB 正在积极开发中,未来版本计划推出更多功能。
在这个勇敢的 GNU 世界中,拥有广阔的廉价硬盘空间和大量优秀的免费操作系统,您确实需要一个灵活且用户友好的引导加载程序来管理它们。抓住 GRUB 并试一试。
