LFCS:如何配置 Grand Unified Bootloader (GRUB) 并对其进行故障排除 - 第 13 部分
由于自2016 年 2 月 2 日起生效的 LFCS 认证考试目标最近发生了变化,我们正在将所需主题添加到此处发布的 LFCS 系列中。为了准备这项考试,我们强烈建议您也遵循 LFCE 系列。
在本文中,我们将向您介绍 GRUB,并解释为什么需要引导加载程序,以及它如何为系统添加多功能性。
从按下计算机电源按钮到获得功能齐全的系统的 Linux 启动过程遵循以下高级顺序:
- 1. 称为POST(开机自检)的进程会对计算机的硬件组件执行全面检查。
- 2. 当POST完成时,它将控制权传递给引导加载程序,引导加载程序又将Linux内核加载到内存中(以及initramfs) )并执行它。 Linux 中最常用的引导加载程序是GRand Unified Boot loader,简称为GRUB。
- 3.内核检查并访问硬件,然后运行初始进程(通常称为“init”),该进程又通过启动完成系统启动服务。
在本系列的第 7 部分(“SysVinit、Upstart 和 Systemd”)中,我们介绍了现代 Linux 发行版使用的服务管理系统和工具。在继续操作之前,您可能需要先查看该文章。
GRUB 引导加载程序简介
现代系统中可以找到两个主要的 GRUB 版本(v1 有时称为 GRUB Legacy 和 v2),尽管大多数发行版在其最新版本中默认使用v2。目前,只有 Red Hat Enterprise Linux 6 及其衍生版本仍在使用 v1。
因此,我们在本指南中将主要关注 v2 的功能。
无论 GRUB 版本如何,引导加载程序都允许用户:
- 1).通过指定要使用的不同内核来修改系统的行为方式,
- 2). 在备用操作系统之间进行选择以启动,并且
- 3). 添加或编辑配置节以更改引导选项等。
如今,GRUB 由 GNU 项目维护,并在其网站上有详细记录。我们鼓励您在阅读本指南时使用 GNU 官方文档。
当系统启动时,您将在主控制台中看到以下 GRUB 屏幕。最初,系统会提示您在备用内核之间进行选择(默认情况下,系统将使用最新内核启动),并允许输入 GRUB 命令行(使用 c
)或编辑启动选项(按 e
键)。
您考虑使用较旧内核启动的原因之一是硬件设备曾经正常工作,并且在升级后已开始“运行”(请参阅 AskUbuntu 中的此链接 论坛为例)。
GRUB v2 配置在启动时从 /boot/grub/grub.cfg
或 /boot/grub2/grub.cfg
读取,而 /boot/grub/grub.conf
或 /boot/grub/menu.lst
用于v1。这些文件不能手动编辑,而是根据 /etc/default/grub
的内容和 /etc/grub.d
中找到的文件进行修改。
在 CentOS 7 中,以下是首次安装系统时创建的配置文件:
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
除了在线文档之外,您还可以找到 GNU GRUB 手册,使用信息如下:
info grub
如果您对 /etc/default/grub 可用的选项特别感兴趣,您可以直接调用配置部分:
info -f grub -n 'Simple configuration'
使用上面的命令,您会发现GRUB_TIMEOUT
设置了从出现初始屏幕到系统自动启动开始之间的时间,除非被用户中断。当此变量设置为-1
时,只有在用户做出选择后才会启动引导。
当同一台计算机上安装多个操作系统或内核时,GRUB_DEFAULT 需要一个整数值来指示默认情况下应选择 GRUB 初始屏幕中的哪个操作系统或内核条目进行引导。条目列表不仅可以在上面显示的启动屏幕中查看,还可以使用以下命令查看:
在 CentOS 和 openSUSE 中:
awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
在Ubuntu中:
awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg
在下图所示的示例中,如果我们希望使用内核版本 3.10.0-123.el7.x86_64(第 4 项)启动,我们需要设置 GRUB_DEFAULT
到 3
(条目内部编号从零开始)如下:
GRUB_DEFAULT=3
最后一个特别令人感兴趣的 GRUB 配置变量是 GRUB_CMDLINE_LINUX,它用于将选项传递给内核。可以通过 GRUB 传递到内核的选项在内核参数文件和 man 7 bootparam 中有详细记录。
我的 CentOS 7 服务器中的当前选项是:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
为什么要修改默认内核参数或传递额外选项?简而言之,有时您可能需要告诉内核某些它可能无法自行确定的硬件参数,或者覆盖它检测到的值。
不久前,当我在我用了 10 年的笔记本电脑上尝试 Vector Linux(Slackware 的衍生品)时,就发生了这种情况。安装后,它没有检测到我的显卡的正确设置,因此我必须修改通过 GRUB 传递的内核选项才能使其正常工作。
另一个例子是当您需要将系统置于单用户模式以执行维护任务时。您可以通过将单词 single 附加到 GRUB_CMDLINE_LINUX 并重新启动来完成此操作:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"
编辑 /etc/defalt/grub
后,您需要运行 update-grub
(Ubuntu) 或 grub2-mkconfig -o /boot/grub2/grub。 cfg
(CentOS 和 openSUSE),然后更新 grub.cfg
(否则,更改将在启动时丢失)。
此命令将处理前面提到的引导配置文件以更新 grub.cfg
。此方法可确保更改是永久性的,而引导时通过 GRUB 传递的选项仅在当前会话期间有效。
修复 Linux GRUB 问题
如果您安装了第二个操作系统,或者您的 GRUB 配置文件因人为错误而损坏,您可以通过多种方法让系统恢复正常并能够再次启动。
在初始屏幕中,按 c
获取 GRUB 命令行(请记住,您也可以按 e
编辑默认启动选项),并使用帮助来获取可用的GRUB 提示符下的命令:
我们将重点关注ls,它将列出已安装的设备和文件系统,我们将检查它找到的内容。在下图中,我们可以看到有 4 个硬盘(hd0
到 hd3
)。
似乎只有 hd0
已分区(由 msdos1 和 msdos2 证明,其中 1 和 2 是分区号,msdos 是分区方案)。
现在让我们检查 hd0
(msdos1) 上的第一个分区,看看是否可以在那里找到 GRUB。这种方法将允许我们启动 Linux,并使用其他高级工具来修复配置文件或在需要时完全重新安装 GRUB:
ls (hd0,msdos1)/
正如我们在突出显示的区域中看到的,我们在该分区中找到了 grub2 目录:
一旦我们确定 GRUB 驻留在 (hd0,msdos1) 中,我们就告诉 GRUB 在哪里可以找到其配置文件,然后指示它尝试启动其菜单:
set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal
然后在 GRUB 菜单中,选择一个条目并按 Enter 键以使用它进行引导。系统启动后,您可以发出 grub2-install /dev/sdX
命令(将 sdX
更改为您要安装 GRUB 的设备)。然后启动信息将被更新,所有相关文件将被恢复。
grub2-install /dev/sdX
Ubuntu GRUB2 故障排除指南中记录了其他更复杂的场景及其建议的修复。其中解释的概念也适用于其他发行版。
概括
在本文中,我们向您介绍了 GRUB,指出了您可以在哪里找到在线和离线文档,并解释了如何处理系统由于引导加载程序相关问题而停止正常引导的情况。
幸运的是,GRUB 是记录最齐全的工具之一,您可以在已安装的文档中或使用我们在本文中共享的资源在线轻松找到帮助。
您有疑问或意见吗?请随时使用下面的评论表告诉我们。我们期待您的回音!