本文將會向你介紹 GRUB 的知識,並會說明你為什麼需要一個引導程序,以及它是如何為系統增加功能的。
Linux 開機過程 是從你按下你的電腦電源鍵開始,直到你擁有一個全功能的系統為止,整個過程遵循著這樣的主要步驟:
在系列的第七講(「SysVinit、Upstart 和 Systemd」)中,我們介紹了現代 Linux 發行版所使用的一些服務管理系統和工具。在繼續學習之前,你可能會想回顧一下那一講的知識。
GRUB 引導程式介紹在現代系統中,你會發現有兩種主要的GRUB 版本(一種是有時被稱為GRUB Legacy 的v1 版本,另一種則是v2 版本),雖然說多數最新版本的發行版系統都預設使用了v2 版本。如今,只有 紅帽企業版 Linux 6 及其衍生系統仍在使用 v1 版本。
因此,在本指南中,我們將專注於 v2 版本的功能。
不管 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 是文档支持非常丰富的工具之一,你可以使用我们在文中分享的资源非常轻松地获取已安装的文档或在线文档。
你有什么问题或建议吗?请不要犹豫,使用下面的评论框告诉我们吧。我们期待着来自你的回复!
以上是如何設定並排除 GRUB故障的詳細內容。更多資訊請關注PHP中文網其他相關文章!