linux grub2
在研究上个月的文章“ Linux 引导和启动过程简介”时 ,我开始对GRUB2的学习感兴趣。 本文提供了有关配置GRUB2的快速介绍,为简单起见,我通常将其称为GRUB。
格鲁布
GRUB代表GRand Unified Bootloader 。 它的功能是在引导时从BIOS接管,加载自身,将Linux内核加载到内存中,然后将执行移交给内核。 一旦内核接管,GRUB便完成了工作,不再需要它。
GRUB支持多个Linux内核,并允许用户在启动时使用菜单在它们之间进行选择。 我发现这是一个非常有用的工具,因为在许多实例中,我遇到了由于特定内核版本而失败的应用程序或系统服务的问题。 很多时候,引导到较旧的内核可以避免诸如此类的问题。 默认情况下,当使用yum或dnf进行升级时,将保留三个内核(最新的内核和两个先前的内核)。 软件包管理器删除内核之前保留的内核数量可以在/etc/dnf/dnf.conf或/etc/yum.conf文件中配置。 我通常将installonly_limit值更改为9,以保留总共九个内核。 当我不得不恢复到低版本几个版本的内核时,这已经派上用场了。
GRUB菜单
GRUB菜单的功能是在默认内核不是所需内核的情况下,允许用户选择已安装的内核之一进行引导。 使用向上和向下箭头键,您可以选择所需的内核,然后按Enter键继续使用所选内核进行引导过程。
GRUB菜单还提供了超时,因此,如果用户未进行任何其他选择,则GRUB将继续使用默认内核进行引导,而无需用户干预。 按下键盘上除Enter键之外的任何键,将终止控制台上显示的倒数计时器。 按Enter键立即使用默认内核或可选的内核继续引导过程。
GRUB菜单还提供了一个“救援”内核,用于故障排除或常规内核由于某种原因无法完成启动过程时使用。 不幸的是,该救援内核无法启动到救援模式。 本文稍后将对此进行更多介绍。
grub.cfg文件
grub.cfg文件是GRUB配置文件。 它是由grub2-mkconfig程序使用一组主要配置文件和grub默认文件作为用户配置规范的源生成的。 是/ boot / GRUB2 /文件的grub.cfg Linux安装过程中首先产生并安装一个新的内核时再生。
grub.cfg文件包含类似Bash的代码和按安装顺序排列的数组中的已安装内核列表。 例如,如果您有四个已安装的内核,则最新的内核将位于索引0,先前的内核将位于索引1,而最早的内核将位于索引3。如果您可以访问grub。 cfg文件,您应该看一下它以了解一下外观。 grub.cfg文件太大,无法包含在本文中。
GRUB配置文件
grub.cfg的主要配置文件集位于/etc/grub.d目录中。 该目录中的每个文件都包含GRUB代码,这些代码将收集到最终的grub.cfg文件中。 这些配置文件的名称中使用的编号方案旨在提供顺序,以便最终的grub.cfg文件组装成正确的顺序。 这些文件中的每个文件都有一个注释来表示该部分的开头和结尾,并且这些注释也是最终grub.cfg文件的一部分,因此可以查看从哪个文件生成了每个部分。 分隔注释如下所示:
### BEGIN /etc/grub.d/10_linux ###
### END /etc/grub.d/10_linux ###
除非您是GRUB专家并且了解所做的更改,否则不要修改这些文件。 即使这样,您也应该始终保留原始的工作grub的备份副本。 cfg文件。 特定文件40_custom和41_custom旨在用于生成对GRUB配置的用户修改。 您仍然应该意识到对这些文件进行任何更改的后果,并维护原始grub的备份。 cfg文件。
您也可以将自己的文件添加到/etc/grub.d目录。 这样做的一个原因可能是为非Linux操作系统添加菜单行。 只需确保遵循命名约定,以确保在配置文件中的10_linux条目之前或之后立即添加了附加菜单项。
GRUB默认文件
原始GRUB的配置非常简单明了。 我只要修改/boot/grub/grub.conf即可。 我仍然可以通过更改/ boot / grub2 / grub来修改GRUB2 。 cfg ,但是新版本比原始GRUB复杂得多。 另外,在安装新内核时, grub.cfg可能会被覆盖,因此所有更改都可能消失。 但是,GNU.org GRUB手册确实讨论了/boot/grub2/grub.cfg的直接创建和修改。
一旦您真正知道如何做,更改GRUB2的配置就非常容易。 我只是在研究GRUB2的上一篇文章时才发现的。 秘密公式位于/ etc / default目录中,其中自然有一个名为grub的文件,然后将其与简单的终端命令配合使用。 / etc / default目录包含一些程序的配置文件,例如Google Chrome,useradd和grub。
/ etc / default / grub文件非常简单。 grub默认文件已经列出了许多有效的键/值对。 您可以简单地更改现有键的值或添加文件中尚未存在的其他键。 下面的清单1显示了未修改的/ etc / default / gru b文件。
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="rd.lvm.lv=fedora_fedora25vm/root
rd.lvm.lv=fedora_fedora25vm/swap
rd.lvm.lv=fedora_fedora25vm/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
清单1:Fedora 25的原始grub默认文件。
GRUB手册的第5.1节包含有关grub文件中可能包含的所有可能密钥的信息。 除了修改grub默认文件中已经存在的某些键的值外,我不需要做任何其他事情。 让我们看一下每个键的含义以及一些不出现在grub默认文件中的键。
- GRUB_TIMEOUT此项的值确定显示GRUB选择菜单的时间长度。 GRUB提供了保持多个内核同时安装并在启动时使用GRUB菜单在它们之间进行选择的功能。 该键的默认值为5秒,但我通常将其更改为10秒,以留出更多时间查看选项并做出选择。
- GRUB_DISTRIBUTOR此项定义一个sed表达式,该表达式从/ etc / system-release文件中提取发行版本号。 此信息用于为GRUB菜单中显示的每个内核发行版生成文本名称,例如“ Fedora”。 由于发行版之间系统发行文件中数据结构的差异,因此此sed表达式在您的系统上可能会有所不同。
- GRUB_DEFAULT确定默认情况下引导哪个内核。 那就是“保存的”内核,它是最新的内核。 这里的其他选项是一个数字,代表grub.cfg中内核列表的索引。 但是,使用索引(例如3)加载列表中的第四个内核将始终加载列表中的第四个内核,即使在安装了新内核之后也是如此。 因此,使用索引将在安装新内核后加载其他内核。 确保引导特定内核版本的唯一方法是将GRUB_DEFAULT的值设置为所需内核的名称,例如4.8.13-300.fc25.x86_64。
- GRUB_SAVEDEFAULT通常,在grub默认文件中未指定此选项。 当选择其他内核进行引导时,该内核仅被引导一次即可正常运行。 默认内核未更改。 当设置为“ true”并与GRUB_DEFAULT = saved一起使用时,此选项会将其他内核保存为默认值。 当选择其他内核进行引导时会发生这种情况。
- GRUB_DISABLE_SUBMENU有些人可能希望为GRUB菜单屏幕创建内核的分层菜单结构。 该密钥以及grub中内核节的一些其他配置。 cfg允许创建这样的层次结构。 例如,一个主菜单可能带有“ production”和“ test”子菜单,其中每个子菜单都包含相应的内核。 将此设置为“ false”将启用子菜单。
- GRUB_TERMINAL_OUTPUT在某些环境中,可能需要或需要将输出重定向到其他显示控制台或终端。 默认设置是将输出发送到默认终端,通常是“控制台”,它等同于Intel级PC上的标准显示。 另一个有用的选项是在使用串行终端或Integrated Lights Out(ILO)终端连接的数据中心或实验室环境中指定“串行”。
- GRUB_TERMINAL_INPUT与GRUB_TERMINAL_OUTPUT一样 ,可能希望或必须重定向来自串行终端或ILO设备的输入,而不是标准键盘输入。
- GRUB_CMDLINE_LINUX此项包含在引导时将传递给内核的命令行参数。 请注意,对于所有已安装的内核,这些参数将添加到grub.cfg的内核行中。 这意味着所有已安装的内核在引导时将具有相同的参数。 我通常会删除“ rhgb”和“ quiet”参数,以便在引导和启动过程中可以看到内核和systemd输出的所有非常有用的消息。
- GRUB_DISABLE_RECOVERY此项的值设置为“ false”时,将在GRUB菜单中为每个已安装的内核创建一个恢复条目。 设置为“ true”时,不会创建恢复条目。 无论此设置如何,最后一个内核条目始终是“救援”选项。 但是,我在使用救援选项时遇到了问题,我将在下面详细讨论。
在这里我没有介绍的其他键可能对您有用。 它们的描述位于GRUB手册2的 5.1节中。
生成grub.cfg
完成所需的配置后,必须生成/ boot / grub2 / grub。 cfg文件。 这可以通过以下命令完成。
grub2-mkconfig > /boot/grub2/grub.cfg
此命令按顺序获取/etc/grub.d中的配置文件以构建grub。 cfg文件,并使用grub默认文件的内容来修改输出以实现最终所需的配置。 grub2-mkconfig命令尝试查找所有已安装的内核,并在grub的10_Linux部分为每个内核创建一个条目。 cfg文件。 它还创建一个“救援”条目,以提供一种方法来从阻止Linux启动的重大问题中恢复。
强烈建议您不要编辑grub。 手动cfg文件,因为对文件的任何直接修改都会在下次安装新内核或手动运行grub2-mkconfig时被覆盖。
问题
我遇到了GRUB2的一个问题,如果您不了解,可能会导致严重的后果。 救援内核不引导,而是引导其他内核之一。 我发现它是列表中索引1处的内核,即列表中的第二个内核。 其他测试表明,无论使用原始grub还是发生此问题。 cfg配置文件或我生成的文件。 我已经在虚拟和真实硬件上进行了尝试,但每个问题都相同。 我仅在Fedora 25上尝试过此操作,因此在其他Fedora版本中可能不是问题。
请注意,从“救援”内核生成的“恢复”内核条目确实可以工作并引导至维护模式登录名。
我建议在grub默认文件中将GRUB_DISABLE_RECOVERY更改为“ false”,并生成自己的grub.cfg 。 这将在GRUB菜单中为每个已安装的内核生成可用的恢复条目。 这些恢复配置将按预期运行,并在命令行中根据runlevel命令引导至运行级别1,该命令行要求输入密码以进入维护模式。 您也可以按Ctrl-D组合键以继续正常启动到默认运行级别。
结论
GRUB是在BIOS之后发生的一系列事件中的第一步,这些事件将Linux计算机引导到可用状态。 理解如何配置GRUB对于从各种问题中恢复或规避是很重要的。
多年来,我不得不多次引导至恢复或救援模式,以解决许多类型的问题。 其中一些问题是由于诸如/ etc / fstab或其他配置文件中的条目不正确之类的东西导致的实际引导问题,而其他问题则是由于与最新内核不兼容的应用程序或系统软件所引起的。 硬件兼容性问题也可能阻止特定内核启动。
希望这些信息可以帮助您开始使用GRUB配置。
翻译自: https://opensource.com/article/17/3/introduction-grub2-configuration-linux
linux grub2