本文将提供有关GRUB(GNU GRand Unified Bootloader)的知识,并解释为什么您需要一个引导加载程序,以及它如何增强系统功能。
Linux引导过程从按下电脑电源键开始,直到系统完全启动。该过程包括以下主要步骤:
-
POST(上电自检):在计算机硬件上执行全面的自检。 -
引导加载程序接管控制权:在POST完成后,引导加载程序将控制权交给Linux内核以及initramfs(初始RAM文件系统),并将它们加载到内存中执行。 -
内核初始化:内核首先检查和访问硬件,然后启动初始化进程(通常称为init),该进程负责启动其他服务和完成系统启动过程。
在本文第七讲中介绍了SysVinit、Upstart和Systemd等现代Linux发行版使用的一些服务管理系统和工具。如果需要,您可以回顾该讲座的内容。
GRUB引导加载程序介绍
现代系统中有两个主要版本的GRUB:v1版本(有时称为GRUB Legacy)和v2版本。大多数最新的发行版使用了v2版本,只有红帽企业版Linux 6及其衍生系统仍在使用v1版本。
在本指南中,我们将重点介绍v2版本的功能。GRUB是一个功能强大的引导加载程序,它的主要作用是加载操作系统并启动系统。它提供了创建多重引导环境的能力,允许用户在单个系统上同时安装和启动多个操作系统。此外,GRUB还支持在系统引导时加载内核模块、修改引导参数并进行系统维护等功能。
使用GRUB,您可以轻松地选择启动不同的操作系统或操作系统的不同内核版本。它提供了一个友好的菜单界面,您可以使用键盘或可视化界面来选择所需的启动选项。此外,GRUB还支持脚本语言,使用户能够编写自定义的引导菜单和操作。
总结而言,GRUB是一个功能强大而灵活的引导加载程序,它在系统启动过程中起到至关重要的作用。它提供了多重引导、内核模块加载、引导参数修改等功能,为用户提供更多的选择和控制权。
不管 GRUB 的版本是什么,一个引导加载程序都允许用户:
-
通过指定使用不同的内核来修改系统的行为; -
从多个操作系统中选择一个启动; -
添加或编辑配置区块来改变启动选项等。
如今,GNU 项目负责维护 GRUB,并在它们的网站上提供了丰富的文档。当你在阅读这篇指南时,我们强烈建议你看下 GNU 官方文档。
当系统引导时,你会在主控制台看到如下的 GRUB 画面。最开始,你可以根据提示在多个内核版本中选择一个内核(默认情况下,系统将会使用最新的内核启动),并且可以进入 GRUB 命令行模式(使用 c 键),或者编辑启动项(按下 e 键)。
GRUB 启动画面
你会考虑使用一个旧版内核启动的原因之一是之前工作正常的某个硬件设备在一次升级后出现了“怪毛病(acting up)”(例如,你可以参考 AskUbuntu 论坛中的这条链接)。
在启动时会从 /boot/grub/grub.cfg 或 /boot/grub2/grub.cfg 文件中读取GRUB v2 的配置文件,而 GRUB 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 的内核(第四个条目),我们需要将 GRUB_DEFAULT 设置为 3(条目从零开始编号),如下所示:
GRUB_DEFAULT=3
使用旧版内核启动系统
最后一个需要特别关注的 GRUB 配置变量是 GRUB_CMDLINE_LINUX,它是用来给内核传递选项的。我们可以在 内核变量文件 和 man 7 bootparam 中找到能够通过 GRUB 传递给内核的选项的详细文档。
我的 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 年的老笔记本上尝试了衍生自 Slackware 的 Vector Linux。完成安装后,内核并没有检测出我的显卡的正确配置,所以我不得不通过 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/default/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 提示中输入 help 命令获得可用命令:
修复 Linux 的 Grub 配置问题
我们将会着重关注 ls 命令,它会列出已安装的设备和文件系统,并且我们将会看看它查找到的东西。在下面的图片中,我们可以看到有 4 块硬盘(hd0 到 hd3)。
貌似只有 hd0 已经分区了(msdos1 和 msdos2 可以证明,这里的 1 和 2 是分区号,msdos 则是分区方案)。
现在我们来看看能否在第一个分区 hd0(msdos1)上找到 GRUB。这种方法允许我们启动 Linux,并且使用高级工具修复配置文件,或者如果有必要的话,干脆重新安装 GRUB:
# ls (hd0,msdos1)/
从高亮区域可以发现,grub2 目录就在这个分区:
查找 Grub 配置
一旦我们确信了 GRUB 位于 (hd0, msdos1),那就让我们告诉 GRUB 该去哪儿查找它的配置文件并指示它去尝试启动它的菜单:
set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal
查找并启动 Grub 菜单
然后,在 GRUB 菜单中,选择一个条目并按下回车键以使用它启动。一旦系统成功启动后,你就可以运行 grub2-install /dev/sdX 命令修复问题了(将 sdX 改成你想要安装 GRUB 的设备)。然后启动信息将会更新,并且所有相关文件都会得到恢复。
# grub2-install /dev/sdX
其它更加复杂的情景及其修复建议都记录在 Ubuntu GRUB2 故障排除指南 中。该指南中阐述的概念对于其它发行版也是有效的。
总结
本文向你介绍了 GRUB,并指导你可以在何处找到线上和线下的文档,同时说明了如何面对由于引导加载相关的问题而导致系统无法正常启动的情况。
幸运的是,GRUB 是文档支持非常丰富的工具之一,你可以使用我们在文中分享的资源非常轻松地获取已安装的文档或在线文档。
你有什么问题或建议吗?请不要犹豫,使用下面的评论框告诉我们吧。我们期待着来自你的回复!
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !