黑入和 / - 磨合你的新靴子
几个月前,我不得不更换我最喜欢的一双鞋:黑色绒面革匡威 One Stars(经典款式,没有白色橡胶鞋头,谢谢)。我已经穿这双鞋好几年了,虽然鞋子的大部分都完好无损,但我已经完全磨破了鞋跟。现在,我不是那种会扔掉一双舒适鞋子的人。这双鞋已经是第九次或第十次用 Shoe-Goo 修补了,但最终还是没救了。它们必须被更换。这似乎是一件很简单的事情——毕竟,这些鞋子在我成年后一直都有售,但您猜怎么着,就在我需要另一双的时候,匡威停产了这款型号,并用帆布版本取代了它,带有类似 Chuck Taylor 的白色橡胶鞋头。我不得不找一双新鞋。
我来告诉你,一旦你找到了完美的运动鞋,就再也找不到替代品了。我看到的每双鞋都以我无法拥有的那双鞋为标准。过了一两个月,我终于找到了能胜任这项任务的鞋子,虽然我喜欢它们,但我仍然想念我的旧鞋(哦,您猜怎么着,现在我买了替代品,匡威又重新发布了我喜欢 One Stars 的款式)。
我真的应该习惯这种感觉。似乎每隔几年,一些开源项目就会决定抛弃整个代码库并从头开始。虽然 GNOME 和 KDE 在这方面最令人不安,但我也经历过 Enlightenment Project、SysV init 到 Upstart 的过渡、LILO 引导加载程序被逐步淘汰为 GRUB,以及现在 GRUB 被 GRUB2 取代。对于那些认为 GRUB2 和 GRUB1 之间的区别是“一”的人来说,你们是:擅长减法,有点自作聪明,并且即将迎来残酷的觉醒。在本文中,我将帮助您磨合您的新 GRUB2 引导加载程序,所以希望有一天,它会像原始 GRUB 一样让您感到舒适。
您可能会问的第一个问题是,我们为什么需要一个新的引导加载程序?GRUB 有什么问题?根据 GRUB2 开发人员的说法,答案是原始 GRUB 代码库相当旧,并且变得无法维护。该软件不断收到新的功能请求(例如支持新的硬件和平台),这些请求最终超出了原始代码的范围,因此决定放弃它并从头开始。由于这是一次完全的重写,开发人员决定借此机会彻底决裂,并重新设计配置文件的布局和语法。随着这些变化,GRUB2 已经能够添加新功能,例如救援模式、增强的图形菜单和启动画面支持、对 UUID 的完全支持以及对非 x86 平台(如 PowerPC)的支持。
在我深入探讨 GRUB2 如何改变事物之前,我将快速概述 GRUB1(或 GRUB Legacy,他们现在称之为),以帮助那些可能不熟悉任何一个引导加载程序的人突出显示这些变化。GRUB(以及之前的 LILO)一直是大多数 Linux 发行版使用的标准引导加载程序。当您启动计算机并看到一个菜单,让您可以在不同的 Linux 内核之间,或在双启动场景中不同版本的 Linux 和 Windows 之间进行选择时,您可能正在使用 GRUB。GRUB 的工作是让您在启动时在一个或多个操作系统之间进行选择,然后将相应的内核和 initrd 加载到内存中并启动其余的引导过程,或者启动其他操作系统(如 Windows)的引导代码。
GRUB 非常可配置,并将自身组织成几个核心程序和目录
/boot/grub/menu.lst:这是 GRUB 的默认配置文件,尽管在某些发行版上,它是指向 /boot/grub/grub.conf 的符号链接。GRUB 的所有配置都在此文件中,用户直接编辑此文件以更改任何 GRUB 选项。
/usr/sbin/grub:这是核心 GRUB 二进制文件,您可以使用它(如果您学习了所有语法)将 GRUB 安装到您的系统上。但是,语法有点棘手,因此最终出现了其他程序来帮助自动化该过程。
/usr/sbin/grub-install:此程序充当 /usr/sbin/grub 的前端,并使将 GRUB 安装到硬盘驱动器变得更加简单。
/usr/sbin/update-grub:此脚本有助于自动化 menu.lst 文件的配置。您无需手动将新内核添加到 menu.lst,只需运行此脚本,它将检测系统上可用的内核并为您构建 menu.lst。此外,此脚本可以读取 menu.lst 注释中的特殊配置选项,并进一步自动化提供救援模式、memtest86+ 和文件其他自定义的过程。
GRUB 的另一个重要功能是,即使有所有这些配置,如果您犯了错误,GRUB 也允许您从启动提示符更改几乎任何配置选项。在 GRUB 菜单中,您可以按 Esc 键来动态更改启动选项。
既然您已经了解(或刷新了您的记忆)关于 GRUB 的知识,您可能会立即忘记它,因为我上面说的大部分内容都已更改。首先(这会让你发疯),在启动时编辑 GRUB2 选项的默认键是 Shift,而不是 Esc。其次,主配置文件已从 /boot/grub/menu.lst 更改为 /boot/grub/grub.cfg。不仅文件名已更改,而且文件内部的语法也与您在 menu.lst 中找到的语法大不相同。
当我谈到语法更改时,GRUB2 所做的关键语法更改在于它如何对分区进行编号。在 GRUB 中,您的分区是从零开始计数的,而现在计数从一开始。为了使其更加混乱,磁盘设备仍然从零开始计数。感到困惑了吗?简而言之
GRUB1/dev/sda1 = (hd0,0)
GRUB2/dev/sda1 = (hd0,1)
这是 GRUB 的 menu.lst 中的一个示例节以及 GRUB2 的 grub.cfg 中的一个类似节,因此您可以比较它们的语法
GRUB
title Ubuntu karmic (development branch), kernel 2.6.31-14-generic uuid c7b6836f-ac57-47ed-9e7c-b16adbf8abed kernel /boot/vmlinuz-2.6.31-14-generic root=UUID= ↪c7b6836f-ac57-47ed-9e7c-b16adbf8abed ro quiet splash initrd /boot/initrd.img-2.6.31-14-generic quiet
GRUB2
menuentry 'Ubuntu, with Linux 2.6.31-20-generic' --class ubuntu ↪--class gnu-linux --class gnu --class os { recordfail insmod ext2 set root='(hd0,2)' search --no-floppy --fs-uuid --set ↪c7b6836f-ac57-47ed-9e7c-b16adbf8abed linux /boot/vmlinuz-2.6.31-20-generic ↪root=UUID=c7b6836f-ac57-47ed-9e7c-b16adbf8abed ↪ro quiet splash initrd /boot/initrd.img-2.6.31-20-generic }
在您坐下来研究新语法之前,我应该指出,我们不鼓励您直接编辑 grub.cfg。此文件是从一系列脚本和配置文件生成的,我稍后会讨论这些文件,因此您所做的任何更改都将在下次任何软件包更新时被覆盖,这些更新将触发 GRUB2 更新。
与 GRUB 一样,以下是 GRUB2 配置中涉及的核心文件和程序
/boot/grub/grub.cfg:这是核心 GRUB2 配置文件,但不应直接编辑。
/etc/default/grub:这是最终用户编辑的主配置文件。在此文件中,您可以配置 GRUB2 选项的有限子集,例如超时、基本内核引导选项以及是否使用图形控制台或 UUID。每次您对此文件进行更改时,都必须运行/usr/sbin/update-grub以反映更改。以下是文件中的一些示例行,让您对语法有所了解
GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX=""
/etc/grub.d/:此目录包含一系列脚本,这些脚本由 grub-mkconfig 程序按数字顺序执行,并将配置 grub.cfg 的不同部分。例如,在默认的 Ubuntu Lucid 安装中,您会找到以下文件
$ ls /etc/grub.d/ 00_header 10_linux 30_os-prober README 05_debian_theme 20_memtest86+ 40_custom
配置选项在 grub.cfg 中出现的顺序由其脚本在此目录中出现的顺序决定。因此,例如,如果您希望在菜单中的 Linux 选项之前显示不同的操作系统,您可以将脚本命名为 01_otheros。虽然当前存在的脚本做了一些复杂的事情,但本质上您的脚本需要以正确的 grub.cfg 语法输出您想要的配置信息,所以我认为它甚至可以是一系列 shell 脚本中的 echo 语句。但是,如果您想创建自定义配置脚本,Ubuntu 提供了 40_custom 脚本供您使用,而不会有被覆盖的风险。
/usr/sbin/grub-install:与 GRUB 一样,GRUB2 grub-install 程序是将 GRUB2 安装到设备上的推荐方法。它调用了许多其他脚本,这些脚本执行各种系统检查、设备探测以及将 GRUB2 安装到启动设备所需的一切。
/usr/sbin/update-grub:此脚本仍然存在,并且仍然是更新 GRUB2 配置文件的推荐方法,但现在这是一个非常短的 shell 脚本,它执行 grub-mkconfig。每当您编辑配置文件或脚本时,请在不带任何参数的情况下运行此命令以重建 grub.cfg 文件。
/usr/sbin/grub-mkconfig:此程序执行构建 grub.cfg 文件的真正繁重的工作。它是执行 /etc/grub.d 中各种脚本的程序。
除了上述更改之外,以下是 GRUB2 中一些额外的不同之处
GRUB2 在启动过程中不再有 stage 1.5。
在新的 Ubuntu 安装中,当没有其他操作系统时,GRUB2 不会在启动时显示菜单,而是直接启动到 Ubuntu 安装中。
重申一下,按住 Shift 键而不是 Esc 键来更改 GRUB2 启动选项。
如果您像我第一次发现所有这些更改时一样,那么现在您感觉就像脚下的地面被移走了一样。我的感觉很像我买不到一双新的黑色绒面革 One Stars 时一样。我所希望的是,随着时间的推移,就像我的新鞋一样,GRUB2 中不舒服的部分会逐渐磨合,我会感到舒适,也许有一天甚至会像喜欢 GRUB1 一样喜欢它们。
Kyle Rankin 是旧金山湾区的系统架构师,也是许多书籍的作者,包括 The Official Ubuntu Server Book、 Knoppix Hacks 和 Ubuntu Hacks。他目前是 North Bay Linux Users' Group 的主席。