因为LFCS考试需求的变动已于2016年2月2日生效,因而我们向LFCS系列添加了一些必要的话题。为了打算认证考试,我们也强烈推荐你去瞧瞧LFCE系列。
LFCS系列第十三讲:配置并排除Grub引导加载程序故障。
本文将会向你介绍GRUB的知识,并会说明你为何须要一个引导加载程序,以及它是怎样给系统降低功能的。
Linux引导过程是从你按下你的笔记本电源键开始,直至你拥有一个全功能的系统为止,整个过程遵守着这样的主要步骤:
在该系列的第七讲(“SysVinit、Upstart和Systemd”)中,我们介绍了现代Linux发行版使用的一些服务管理系统和工具。在继续学习之前,你可能想要回顾一下那一讲的知识。
GRUB引导装载程序介绍
在现代系统中,你会发觉有两种主要的GRUB版本(一种是有时被称为GRUBLegacy的v1版本,另一种则是v2版本),虽然多数最新版本的发行版系统都默认使用了v2版本。现在,只有红帽企业版Linux6及其衍生系统仍在使用v1版本。
为此,在本手册中中国linux,我们将注重关注v2版本的功能。
不管GRUB的版本是哪些,一个引导加载程序都容许用户:
通过指定使用不同的内核来更改系统的行为;从多个操作系统中选择一个启动;添加或编辑配置区块来改变启动选项等。
现在,GNU项目负责维护GRUB,并在它们的网站上提供了丰富的文档。当你在阅读这篇手册时,我们强烈建议你看下GNU官方文档。
当系统引导时,你会在主控制台见到如下的GRUB画面。最开始,你可以按照提示在多个内核版本中选择一个内核(默认情况下,系统将会使用最新的内核启动),而且可以步入GRUB命令行模式(使用c键),或则编辑启动项(按下e键)。
GRUB启动画面
你会考虑使用一蒙自版内核启动的诱因之一是之前工作正常的某个硬件设备在一次升级后出现了“怪毛病(actingup)”(譬如,你可以参考AskUbuntu峰会中的这条链接)。
在启动时会从/boot/grub/grub.cfg或/boot/grub2/grub.cfg文件中读取GRUBv2的配置文件grub2命令行启动linux,而GRUBv1使用的配置文件则来自/boot/grub/grub.conf或/boot/grub/menu.lst。那些文件不应当直接自动编辑,而应通过/etc/default/grub的内容和/etc/grub.d目录中的文件来更新。
在CentOS7上,当系统最初完成安装后,会生成如下的配置文件:
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"
不仅在线文档外,你也可以使用下边的命令查阅GNUGRUB指南:
# 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,它是拿来给内核传递选项的。我们可以在内核变量文件和man7bootparam中找到就能通过GRUB传递给内核的选项的详尽文档。
我的CentOS7服务器上当前的选项是:
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的VectorLinux。完成安装后,内核并没有检查出我的主板的正确配置,所以我不得不通过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文件。这些方式可以确保改动持久化grub2命令行启动linux,而在启动时刻通过GRUB传递的选项仅在当前会话期间有效。
修补LinuxGRUB问题
假如你安装了第二个操作系统,或则因为人为失误而造成你的GRUB配置文件受损了,仍然有一些方式可以让你恢复并才能再度启动系统。
在启动画面中按下c键步入GRUB命令行模式(记住,你也可以按下e键编辑默认启动选项)linux mint,并可以在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
其它愈加复杂的情境及其修补建议都记录在UbuntuGRUB2故障排除手册中。该手册中探讨的概念对于其它发行版也是有效的。
总结
本文向你介绍了GRUB,并指导你可以在何处找到线上和线下的文档,同时说明了怎样面对因为引导加载相关的问题而造成系统未能正常启动的情况。
辛运的是,GRUB是文档支持极其丰富的工具之一,你可以使用我们在文中分享的资源十分轻松地获取已安装的文档或在线文档。
你有哪些问题或建议吗?请不要迟疑,使用下边的评论框告诉我们吧。我们期盼着来自你的回复!
via:
作者:GabrielCánepa译者:ChrisLeeGit校对:wxy
本文由LCTT原创翻译,Linux中国荣誉推出