由于2016年2月2日生效的最新变化,我们在此处发布的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论坛上的示例)。
在引导时从/boot/grub/grub.cfg
或/boot/grub2/grub.cfg
读取GRUB v2配置,而在v1中使用/boot/grub/grub.conf
或/boot/grub/menu.lst
。这些文件不应手动编辑,而是根据/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"
除了在线文档外,您还可以使用以下 info 找到 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(第四个条目)进行引导,则需要将 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"
为什么要修改默认的内核参数或传递额外的选项呢?简单来说,有时候您需要告诉内核某些硬件参数,这些参数内核本身可能无法确定,或者覆盖它本来会检测到的值。
不久前我遇到过这种情况,当时我在我那台十年前的笔记本电脑上尝试安装Vector Linux,这是Slackware的一个衍生版本。安装后,它没有检测到我的显卡的正确设置,所以我不得不修改通过GRUB传递的内核选项,以使其正常工作。
另一个例子是当您需要将系统切换到单用户模式执行维护任务时。您可以通过在GRUB_CMDLINE_LINUX
后附加单词single来实现这一点,然后重新启动:
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
编辑默认引导选项),并使用help将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 是最好记录的工具之一,您可以轻松地在安装的文档中或使用我们在本文中分享的资源在线找到帮助。
您有问题或评论吗?请不要犹豫,通过下面的评论表单告诉我们。我们期待您的来信!
Source:
https://www.tecmint.com/configure-and-troubleshoot-grub-boot-loader-linux/