当前位置: 首页 > 科技观察

如何配置GNU引导加载程序(GRUB)并对其进行故障排除_0

时间:2023-03-20 10:05:37 科技观察

由于2016年2月2日生效的LFCS考试要求发生变化,我们在LFCS系列中添加了一些必要的主题。为了准备认证考试,我们还强烈建议您查看LFCE系列。本文将向您介绍GRUB,并解释为什么您需要引导加载程序以及它如何为您的系统添加功能。Linux引导过程从您按下计算机上的电源按钮开始,直到您拥有一个功能齐全的系统。整个过程遵循以下主要步骤:称为POST(开机自检)的过程会彻底检查硬件组件。当POST完成时,它将控制权交给引导加载程序,引导加载程序又将Linux内核(和initramfs)加载到内存中并执行它。内核首先检查并访问硬件,然后运行初始化过程(通常以其通用名称init为人所知),然后启动一些服务并最终完成系统引导过程。在本系列的第七讲(“SysVinit、Upstart和Systemd”)中,我们介绍了现代Linux发行版使用的一些服务管理系统和工具。在继续之前,您可能需要回顾一下您在该讲座中学到的内容。GRUBBootloader简介在现代系统上,您会发现GRUB的两个主要版本(v1,有时称为GRUBLegacy和v2),尽管大多数发行版系统都默认使用v2版本。今天,只有RedHatEnterpriseLinux6及其衍生版本仍在使用v1。因此,在本指南中,我们将重点介绍v2版本的功能。无论GRUB的版本如何,引导加载程序都允许用户:通过指定要使用的不同内核来修改系统的行为;选择从多个操作系统启动;添加或编辑配置块以更改引导选项等。如今,GNU项目维护着GRUB并在其网站上提供了大量文档。在阅读本指南时,我们强烈建议您查看官方GNU文档。当系统启动时,您将在主控制台中看到以下GRUB屏幕。一开始可以根据提示在多个内核版本中选择一个内核(默认系统会以最新的内核启动),可以进入GRUB命令行模式(使用c键),或者编辑启动项(按e键)。GRUB启动画面您可能考虑使用较旧内核引导的原因之一是之前运行良好的硬件设备在升级后“运行良好”(例如,您可以参考AskUbuntu论坛链接上的这个线程)。GRUBv2的配置文件在启动时从/boot/grub/grub.cfg或/boot/grub2/grub.cfg文件中读取,而GRUBv1使用的配置文件来自/boot/grub/grub.conf或/boot/grub/menu.lst。这些文件不应直接手动编辑,而应通过/etc/default/grub的内容和/etc/grub.d目录中的文件进行更新。在CentOS7上,初始安装系统时,会生成如下配置文件:GRUB_TIMEOUT=5GRUB_DISTRIBUTOR="$(sed's,release.*$,,g'/etc/system-release)"GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMINAL_OUTPUT="console"GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1rd.lvm.lv=centos_centos7-2/swapcrashkernel=autovconsole.font=latarcyrheb-sun16rd.lvm.lv=centos_centos7-2/rootrhgbquiet"GRUB_DISABLE_RECOVERY="true"在线文档除外另外,你也可以使用如下命令查阅GNUGRUB手册:#infogrub如果你对/etc/default/grub文件中可用的选项特别感兴趣,可以直接参考配置部分的帮助文档:#info-fgrub-n'Simpleconfiguration'使用上面的命令,你会发现GRUB_TIMEOUT用于设置启动画面出现和系统自动开始启动之间的时间(除非被用户中断)。当此变量的值为-1时,除非用户主动选择,否则不会启动启动。当在同一台机器上安装了多个操作系统或内核时,GRUB_DEFAULT需要使用一个整数来指定GRUB启动屏幕默认选择启动的操作系统或内核条目。我们可以通过上面的启动画面查看启动项列表,或者在CentOS和openSUSE系统上使用以下命令:#awk-F\''$1=="menuentry"{print$2}'/boot/grub2/grub。Ubuntu系统上的cfg#awk-F\''$1=="menuentry"{print$2}'/boot/grub/grub.cfg在下图所示的例子中,如果我们要使用3.10.0-版本123.el7.x86_64内核(第四项),我们需要将GRUB_DEFAULT设置为3(条目从零开始编号),如下:GRUB_DEFAULT=3Bootthesystemwithanolderkernel***一个需要特别注意的GRUB配置变量为GRUB_CMDLINE_LINUX,用于向内核传递选项。可以通过GRUB传递给内核的选项的详细文档可以在内核变量文件和man7bootparam中找到。我的CentOS7服务器上的当前选项是:GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1rd.lvm.lv=centos_centos7-2/swapcrashkernel=autovconsole.font=latarcyrheb-sun16rd.lvm.lv=centos_centos7-2/rootrhgbquiet"为什么你想修改默认的内核参数还是传递额外的选项?简单的说,在很多情况下,你需要告诉内核一些内核本身无法判断的硬件参数,或者覆盖一些内核检测到的值。不久前,当我在我有10年历史的笔记本电脑上试用VectorLinux(一种Slackware衍生产品)时,我就遇到了这种情况。安装后,内核没有检测到我的显卡的正确配置,所以我不得不通过GRUB传递修改后的内核选项才能让它工作。另一个例子是当您需要将系统切换到单用户模式以执行维护工作时。为此,您可以直接将single添加到GRUB_CMDLINE_LINUX变量并重新启动:GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1rd.lvm.lv=centos_centos7-2/swapcrashkernel=autovconsole.font=latarcyrheb-sun16rd.lvm.lv=centos_centos7-2/rootrhgbquietsingle"编辑/etc/default/grub后,需要运行update-grub(在Ubuntu上)或grub2-mkconfig-o/boot/grub2/grub.cfg(在CentOS和openSUSE上)命令更新grub.cfg文件(否则,更改将在系统引导时丢失)。此命令将处理前面提到的那些引导配置文件以更新grub.cfg文件。这种方法确保更改是持久的,而在引导时通过GRUB传递的选项仅在当前会话期间有效。修复LinuxGRUB问题如果您安装了第二个操作系统,或者您的GRUB配置文件由于人为错误而损坏,仍然有办法恢复并能够再次引导您的系统。在启动画面按c进入GRUB命令行模式(记住,你也可以按e来编辑默认引导选项),你可以在GRUB提示符下输入help命令获取可用的命令:FixingLinuxGrubConfigurationIssuesWe我们将专注于ls命令,它列出了已安装的设备和文件系统,我们将看看它找到了什么。在下图中,我们可以看到有4个硬盘(hd0到hd3)。好像只有hd0被分区了(msdos1和msdos2可以证明,其中1和2是分区号,msdos是分区方案)。现在让我们看看是否可以在第一个分区hd0(msdos1)上找到GRUB。这种方法可以让我们启动Linux,并使用高级工具修复配置文件,或者如果有必要,只需重新安装GRUB:#ls(hd0,msdos1)/从高亮区域可以发现grub2目录就在这个分区上:查找Grub配置一旦我们确定GRUB位于(hd0,msdos1),让我们告诉GRUB在哪里寻找它的配置文件并指示它尝试启动它的菜单:setprefix=(hd0,msdos1)/grub2setroot=(hd0,msdos1)insmodnormalnormal查找并启动Grub菜单然后,在GRUB菜单中,选择一个条目并按Enter键启动它。系统启动成功后,您可以运行grub2-install/dev/sdX命令来修复问题(将sdX更改为您要安装GRUB的设备)。然后将更新启动信息并恢复所有相关文件。#grub2-install/dev/sdX其他更复杂的情况及其建议的修复方法记录在UbuntuGRUB2故障排除指南中。本指南中描述的概念也适用于其他发行版。总结本文向您介绍了GRUB,指导您在哪里可以找到在线和离线文档,并解释了如果您的系统由于与引导加载相关的问题而无法正确引导时该怎么做。幸运的是,GRUB是具有非常丰富的文档支持的工具之一,您可以使用我们在本文中共享的资源非常轻松地安装或在线获取文档。