LFCS:如何配置和排除 Grand Unified Bootloader (GRUB) 故障 - 第 13 部分
由于 LFCS 认证考试目标自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论坛中的此链接作为示例)。
GRUB v2配置在启动时从/boot/grub/grub.cfg
或读取/boot/grub2/grub.cfg
,而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"
除了在线文档之外,您还可以使用以下信息找到 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"
为什么要修改默认内核参数或传递额外选项?简而言之,有时您可能需要告诉内核某些它自己无法确定的硬件参数,或者覆盖它检测到的值。
不久前,我在我十年前的笔记本上尝试Vector Linux ( Slackware的衍生产品)时就遇到了这种情况。安装后,它没有检测到我的显卡的正确设置,因此我不得不修改通过 GRUB 传递的内核选项才能使其正常工作。
另一个例子是,当你需要将系统置于单用户模式来执行维护任务时。你可以通过在后面添加单词 singleGRUB_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 是文档最齐全的工具之一,您可以使用我们在本文中分享的资源在已安装的文档或在线轻松找到帮助。
您有任何问题或意见吗?请随时使用下面的评论表告诉我们。我们期待您的回复!