认证目标5.02 引导程序与GRUB 2程序
Red Hat企业版Linux(RHEL)的标准引导程序是GRUB 2,它是统一引导加载程序版本2(GRand Unified Bootloader version 2)的缩写符。根据Red Hat考试的要求,RHCSA考试要求考生知道如何通过GRUB 2菜单引导到不同的目标,以及诊断并且纠正由引导程序错误引起的引导失败。RHEL 6默认使用GRUB版本1。在该版本中,相应的配置文件比较容易理解和个性化。但是,虽然GRUB 2.0的菜单与在RHEL 6中类似,但配置引导程序需要的步骤却相差很大,本章后面将看到这一点。
5.2.1 GRand统一引导加载程序——GRUB
Red Hat已将GRUB 2实现为其Linux发行版的唯一引导程序。通常情况下将其配置为引导到一个默认的内核。GRUB 2会在/boot目录中找到配置并且显示一个菜单,此菜单看起来与图5-2相似。我们可以利用GRUB 2菜单引导在Linux安装过程中检测到的任何操作系统,或者其他任何已经添加到合适配置文件中的操作系统。
GRUB 2相当灵活。不仅可以从CLI轻松地生成配置,而且可以直接通过GRUB 2菜单进行编辑。在图5-2显示菜单中,可以按E键临时编辑配置文件,或按C键打开GRUB 2命令提示符。本节关注如何引导到不同的systemd目标。
引导到不同目标
为把一个参数通过GRUB 2传递给内核,在第一个GRUB菜单中按E键。这允许编辑要发送给内核的引导参数。找到以指令linux16开头的一行。必要时使用下方向键向下滚动。然后会看到如下的一个命令行:
linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap crashkernel=auto vconsole.keymap=uk rhgb quiet LANG=en_GB.UTF-8
这里出现的许多信息,稍后将要解释。对于RHCSA考试,真正重要的是在该行的末尾添加更多的命令。例如,如果在这一行的末尾添加字符串systemd.unit=emergency.target,然后按Ctrl+X,则Linux就会以紧急目标模式启动,在此模式下将运行一个急救shell。
在紧急目标模式中,输入exit。系统将进入默认目标,通常是多用户或图形目标。如果已做某些修改或者已对分区做过修理,则下一步就是用systemctl reboot命令重新引导计算机。在某些情况下,在Red Hat考试中所做的修改必须重新引导后才可以得到验证。
实际经验
在RHEL 7中,shutdown、reboot和halt命令是systemctl的符号链接。它们的效果分别与systemctl poweroff、systemctl reboot和systemctl halt命令相同。
考试提示
在RHCSA考试中,所做的修改必须在重新引导后依然有效。因此,应该重启系统至少一次,以确定即使在重新引导后,各个需求也能满足。
在一定程度上,systemd目标的概念与RHEL 6中的运行级类似,本章稍后将详细介绍。现在,只需要知道当RHEL 7已设置为引导到一个GUI环境时,则默认它会配置为引导到图形目标。通过在内核命令行的末尾添加字符串systemd.unit=name.target,可以改变这个目标。
如果在系统引导到GUI环境的过程中出现问题,则首先在内核命令行的末尾添加systemd.unit=multi-user.target。如果引导成功,则RHEL 7会引导到文本模式,即一个命令行的基于控制台的登录。
如果需要直接访问恢复shell,则要在内核命令行末尾添加字符串systemd.unit=rescue.target。在很少情况下系统会出现严重的故障,它们甚至无法引导到急救目标。这时可以使用其他两个选项:
● systemd.unit=emergency.target 除了以只读模式挂载root文件系统外,不挂载其他任何文件系统。
● init=/sysroot/bin/sh 启动shell并以只读模式挂载root文件系统,不需要口令。
紧急和急救目标需要使用root管理员口令进行登录并获得完整的root管理员权限。如果忘记了root管理员口令,需要在内核命令行的末尾添加字符串init=/sysroot/bin/sh或rd.break,然后按照练习5-2进行操作。因为这支持完整的管理员权限,包括修改root管理员口令,所以使用口令保护GRUB 2菜单很重要。一些人能够修改引导顺序并使用可引导的U盘实现相同目的,所以保护BIOS或UEFI并确保系统仅在引导本地磁盘时不需要口令也非常重要。
现在已经知道了如何在引导过程中引导到不同的目标。正如Red Hat考试培训课程指出的,把以下明确作为RHCSA考试的一个要求:
手动把系统引导到不同的目标。
考试提示
Red Hat考试是“闭卷考试”。虽然在考试中能够使用在RHEL安装中可找到的所有文档,但是在恢复过程或紧急过程中,不能访问man帮助文档或其他文档资源。因此,不借助任何文档完成本章的练习极其重要。考生应该记住引导进入紧急shell或者恢复root管理员口令的步骤;否则,不只在RHCSA考试中会遇到麻烦,在现实工作中履行自己作为Linux系统管理员的职责时也会出现问题。
5.2.2 练习5-1:将系统引导到不同的目标
如何引导到不同的systemd目标是一项关键技术。本练习假设你已经按照第2章的要求配置了RHEL 7,它把图形化目标设为默认目标。执行ls -l /etc/systemd/system/default.target命令确认这一点。如果当前系统运行在默认设置下,则此文件应该是/usr/lib/systemd/system目录中的graphical.target文件的符号链接。也可以运行以下命令:
# systemctl get-default
它应当返回字符串“graphical.target”。现在开始这个练习。
(1)使用reboot命令重新引导系统。
(2)当看到以下消息时,必须按任意键进入GRUB菜单:
The selected entry will be started automatically in 5s.
(3)按E键编辑当前菜单项。
(4)使用下方向键向下滚动,定位到以linux16开头的一行。首先删除内核选项rhgb quiet。然后,在该行末尾处输入systemd.unit=multi-user.target,然后按Ctrl+X引导此内核。
(5)注意观察引导消息。会看到什么样的登录屏幕?
(6)登录此系统。可用使用任何现有的账户。
(7)运行reboot重新启动系统。
(8)重复步骤(2)到步骤(4),但是向内核传递systemd.unit=rescue.target选项,以便把系统引导救援目标。
(9)注意观察引导消息,会出现哪种类型的登录屏幕?挂载了哪些文件系统?
(10)重复步骤(2)到步骤(4),但向内核传递systemd.unit=emergency.target选项,以便把系统引导到紧急目标。
(11)注意观察引导消息,会出现哪种类型的登录屏幕?需要登录吗?挂载了哪些文件系统?
(12)重复步骤(2)到步骤(4),但是这次在内核那一行中添加rd.break。
(13)注意观察引导消息,会出现哪种类型的登录屏幕?需要登录吗?root文件系统是从硬盘挂载的吗?
(14)运行exit继续引导过程。
(15)重复步骤(2)到步骤(4),但是传递字符串init=/sysroot/bin/sh,把这个系统引导到紧急shell。
(16)注意观察引导消息,会出现哪种类型的登录屏幕?
(17)输入reboot退出并重启系统。
5.2.3 练习5-2:恢复root口令
如果将RHEL 7系统引导到救援或紧急目标,会提示输入root口令。如果忘了这个口令该怎么办?本练习将说明如何为root用户重置丢失的口令。在口令恢复过程中,很可能无法查看文档。因此,应当认真练习下面的过程,直到能够在发生危急情况时完成此过程:
(1)使用下面的命令,将root口令改为一个随机字符串。此命令对你隐藏随机口令:
# pwmake 128 | passwd --stdin root
(2)退出会话。试着作为root用户再次登录。使用旧口令将无法登录系统。
(3)重新引导服务器。
(4)看到下面的消息时,按下按键来访问GRUB菜单:
The selected entry will be started automatically in 5s.
(5)按E键编辑当前菜单项。
(6)使用下方向键向下滚动,找到以linux16开头的一行。按Ctrl+E或End键定位到该行末尾,然后输入字符串rd.break。
(7)按Ctrl+X键引导系统。
(8)rd.break指令在正确挂载root文件系统之前中断引导过程。运行ls /sysroot命令确认这一点。如果知道root文件系统的内容,则该命令的输出看起来会很熟悉。
(9)以读写模式重新挂载root /sysroot文件系统,将根目录改为/sysroot:
# mount -o remount, rw /sysroot # chroot /sysroot
(10)修改root口令:
# passwd
(11)因为SELinux没有运行,所以passwd命令不保留/etc/passwd文件的上下文。为确保用正确的SELinux上下文给/etc/passwd文件添加标签,使用下面的命令,告诉Linux在下次引导时给所有文件重新赋予标签:
# touch /.autorelabel
(12)输入exit,关闭chroot监狱,然后再次输入exit,以重新引导系统。
(13)SELinux可能需要几分钟的时间来给所有文件重新赋予标签。看到登录提示后,确认能够作为root用户登录系统。
5.2.4 修改系统的引导程序
RHCSA考试专门要求考生必须了解如何“修改系统的引导程序”。这意味着考生需要掌握GRUB 2配置文件的细节。这些配置信息保存在/etc/grub2.cfg文件中,该文件是一个符号链接,指向在BIOS模式下配置的系统的/boot/grub2/grub.cfg文件,或者使用UEFI引导管理器的服务器的/boot/efi/EFI/redhat/grub.cfg文件。在本章剩余部分,我们假定所运行的是传统的基于BIOS的系统,或者是在BIOS模式下运行支持UEFI的系统。这里将/boot/grub2/grub.cfg作为配置文件的标准路径。
grub.cfg文件分为头部和不同的menuentry节,每一节对应于系统上安装的一个内核。图5-3显示了该文件的一个节选。每个menuentry节都包含以linux16和initrd16指令开头的两行,指出了内核的路径以及在引导过程中加载的RAM磁盘文件系统的路径。在前一节看到,linux16这一行特别重要。在引导过程中可以编辑这个条目,以传递额外的内核参数,或者引导进入非默认的systemd目标。
图5-3 grub.cfg文件的节选
虽然grub.cfg文件中的选项和指令的数量很多,但是不必惊慌。我们并不需要直接修改此文件。正确的方法是使用grub2-mkconfig工具,基于/etc/default/grub配置文件和/etc/grub.d/目录中的脚本生成该文件的新版本。相对于grub.cfg文件,/etc/default/grub更容易理解、更安全,也更便于编辑。修改了/etc/default/grub文件后,运行下面的命令来生成新的GRUB配置文件:
# grub2-mkconfig -o /boot/grub2/grub.cfg
实际经验
不要手动编辑/etc/grub2/grub.cfg文件。该文件是在安装或者更新内核时自动生成的,所以直接对该文件做出的修改将会丢失。使用grub2-mkconfig和/etc/default/grub文件来修改grub.cfg。
接下来对典型的/etc/default/grub文件进行详细分析:
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=rhel/root vconsole.font=latarcyrheb-sun16 ↲ rd.lvm.lv=rhel/swap crashkernel=auto vconsole.keymap=uk rhgb quiet" GRUB_DISABLE_RECOVERY="true"
在第一行,GRUB_TIMEOUT变量指定了等待多少秒后,GRUB 2会自动引导默认操作系统。按任意键可中断倒数过程。如果此变量被设为0, GRUB 2将不显示可引导的内核列表,除非在BIOS初始屏幕中按下并按住一个字母数字按键。
在标准的RHEL安装上,GRUB_DISTRIBUTOR变量的值返回“Red Hat Enterprise Linux Server”,并显示在每个内核启动的条目的前面。如果愿意,可将此条目修改为你选择的任意字符串。
下一个指令是GRUB_DEFAULT,它与GRUB 2在引导时加载的默认内核有关。值“saved”告诉GRUB 2在/boot/grub2/grubenv文件中寻找saved_entry变量。每次安装一个新的内核时,将用最新的内核的名称更新该变量。
通过使用grub2-set-default命令,可更新saved_entry变量,并告诉GRUB 2引导一个不同的默认内核。例如,
# grub2-set-default 1
将/etc/grub2.cfg中的第二个菜单项设为默认内核。这可能令人感到困惑,其原因在于,GRUB 2是从0开始计数的。因此,grub2-set-default 0命令指向/etc/grub2.cfg中的第一个可用菜单项。类似的,如果配置文件中包含更多项,则grub2-set-default 1命令指向第二个内核项,依此类推。
/etc/default/grub中的下一行定义了变量GRUB_DISABLE_SUBMENU。该变量默认被设为true,以便在引导时禁用任何子菜单项。然后是指令GRUB_TERMINAL_OUTPUT,它告诉GRUB 2使用文本控制台作为默认的输出终端。文件中定义的最后一个变量是GRUB_DISABLE_RECOVERY,它禁止生成恢复菜单项。
指令GRUB_CMDLINE_LINUX更值得关注,它指定了要传递给Linux内核的选项。例如,rd.lvm.lv给出了包含root文件系统和交换分区的逻辑卷的名称。接下来的选项vconsole.font和vconsole.keymap分别列出默认字体和键盘映射。crashkernel选项为kdump保留一些内存,当系统崩溃时,调用kdump来捕捉内核转储。最后,在该行末尾,rhgb quiet指令默认启用Red Hat图形化引导并隐藏引导消息。如果想启用冗长的引导消息,可在该行中删除quiet选项。
5.2.5 如何更新GRUB
如果用户以前曾经在MBR上安装了另一个引导加载程序,如微软的NTLDR或BOOTMGR,只需要运行grub2-install命令。如果它没有自动把GRUB 2指针写入到MBR上或者存在多个可用的硬盘驱动器,则需要插入/dev/sdb这样的硬盘驱动器。也可以在移动硬盘建立GRUB 2,只需要在命令中指定此设备。
当使用grub2-mkconfig生成GRUB 2配置文件时,不需要额外命令。MBR的指针会自动读取/boot/grub2/grub.cfg文件的最新版本。
5.2.6 GRUB 2的命令行
grub.cfg配置文件中的一个错误可能会导致系统无法启动。例如,如果GRUB 2确定错误卷为根分区(/),则Linux会在引导过程中挂起。/boot/grub2/grub.cfg文件的其他配置错误也会在引导过程中引起内核恐慌。
既然我们已经分析了GRUB 2配置文件,就能看到此文件的错误带来的影响。如果一些文件名或分区出现错误,GRUB 2无法找到类似Linux内核等关键文件。如果GRUB 2配置文件完全丢失,将看到下面的提示:
grub>
该菜单显示时,可按C键访问GRUB 2命令行。想要查看可用的命令列表,只要在grub>提示后按下Tab键,或者输入help命令。
命令补全功能也是可用的。例如,如果忘记了内核文件的名字,则输入linux /,然后按Tab键,就可以看到/boot目录中的可用文件。
使用ls命令,应该能够在标准PC机上的BIOS/UEFI菜单检测到全部的硬盘驱动器。举个例子,我们来找到该系统上的/boot分区和grub.cfg文件。默认情况下,/boot目录是挂载在一个独立的分区上。首先,在grub>命令行中运行ls:
grub> ls (proc)(hd0)(hd0, msdos1)(hd0, msdos2)
字符串hd0表示第一个硬盘,msdos1表示第一个分区,是用MBR格式(msdos)创建的。如果使用新的GPT分区格式对服务器进行分区,GRUB 2将识别第一个分区为gpt1而不是msdos1。类似地,hd0, msdos2表示第一个硬盘上的第二个分区。
接下来,使用这些信息找到grub.cfg文件:
grub> ls(hd0, msdos1)/grub2/grub.cfg grub.cfg
如果此文件不在指定分区上,则会看到“error: file '/grub2/grub.cfg' not found”错误消息。如果指定分区不包含有效的文件系统,还可能看到“error: unknown filesystem”错误消息。
我们知道/boot目录在(hd0, msdos1)上。为确认grub.cfg的位置,执行下面的命令:
grub> cat(hd0, msdos1)/grub2/grub.cfg
在输出中可看到grub.cfg文件的内容。按下按键滚动该文件的内容,直到回到GRUB 2命令行。
还有一种方法可以确定/boot目录所在的分区。执行search.file命令可找到grub.cfg:
grub> search.file /grub2/grub.cfg
GRUB 2应该返回包含/boot目录的分区。在本例中,就是第一个硬盘上的第一个分区:
hd0, msdos1
现在可以用GRUB 2配置文件中的那些命令从grub>命令行引导Linux。如果通常情况下顶级根目录也挂载在一个分区上,则甚至可以用下面的命令验证/etc/fstab文件的内容:
grub> cat(hd0, msdos2)/etc/fstab
如果根文件系统包含在一个LVM卷上,则上面的命令将返回“error: unknown filesystem”消息。为解决这个问题,用下面的命令加载LVM模块:
grub> insmod lvm
现在,ls命令的输出中应该也会包含逻辑卷:
grub> ls (proc)(hd0)(hd0, msdos2)(hd0, msdos1)(lvm/rhel-root)(lvm/rhel-swap)
最后,为了输出/etc/fstab的内容,执行下面的命令:
grub> cat(lvm/rhel-root)/etc/fstab
5.2.7 练习5-3:使用GRUB 2命令行
本练习将手动引导RHEL 7。观察/etc/grub2.cfg文件的内容,并找出需要用到的命令。现在按以下步骤操作:
(1)引导系统。当看到屏幕顶部出现以下行内容时,按任意键进入GRUB 2菜单:
The selected entry will be started automatically in 5s.
(2)按下C键切换到GRUB命令行接口。将会看到grub>提示符。
(3)输入下面的命令来加载LVM模块:
grub> insmod lvm
(4)列出所有分区和逻辑卷:
grub> ls
(5)找出根分区。其名称可能类似于(lvm/rhel-root)。可能需要做几次尝试才能找出根分区(例如,试着从GRUB 2之前列出的所有设备中显示/etc/fstab文件)。
grub> cat(lvm/rhel-root)/etc/fstab
(6)将root变量设为包含根文件系统的设备:
grub> set root=(lvm/rhel-root)
(7)输入linux命令,指定内核和根目录分区。这一行很长,但是可以使用命令补全(按Tab键)来快速输入。另外,此行中重要的地方仅是内核文件和顶层根目录的位置。
linux(hd0, msdos1)/vmlinuz-3.10.0-123.el7.x86_64↲ root=/dev/mapper/rhel-root
(8)输入initrd命令,指定初始RAM磁盘命令和文件位置。同样,可以使用Tab键来补全文件名。
initrd(hd0, msdos1)/initramfs-3.10.0-123.el7.x86_64.img
(9)现在输入boot命令。如果成功,Linux现在可以引导选定的内核和初始的RAM硬盘,就如我们从GRUB 2配置菜单选择选项那样。
5.2.8 重新安装GRUB 2
在一些情况中,可能需要从头重新安装GRUB 2。如果grub2-mkconfig不能工作,或者由于脚本文件损坏或不正确,其生成的配置文件包含错误,就可能发生这种情况。此时,需要重新安装grub2-tools RPM包。在完成此操作前,显示并删除所有GRUB 2配置和脚本文件。这可以使用下面的命令完成:
# rpm -qc grub2-tools /etc/default/grub /etc/grub.d/00_header /etc/grub.d/10_linux /etc/grub.d/20_linux_xen /etc/grub.d/20_ppc_terminfo /etc/grub.d/30_os-prober /etc/grub.d/40_custom /etc/grub.d/41_custom # rm -f /etc/default/grub # rm -f /etc/grub.d/*
然后,执行下面的命令重新安装GRUB 2:
# yum reinstall grub2-tools
第7章将详细介绍rpm和yum命令。
最后,重新生成grub.cfg配置文件。在运行传统的BIOS固件的机器上,grub2-mkconfig命令如下所示:
# grub2-mkconfig -o /boot/grub2/grub.cfg
当然,如果GRUB 2配置文件丢失,无法引导系统并显示GRUB 2菜单,就可能需要求助于另一个选项:急救模式。
5.2.9 从GRUB 2引导的一个选项:急救模式
RHCE考试培训课程的以前版本中的故障排除考试目标要求考生能从完全引导失败的过程中恢复系统,例如GRUB 2配置文件损坏或丢失。换言之,当我们从前面提到的grub>提示符直接引导系统失败后,就需要使用一个所谓的急救模式的选项,这需要访问DVD安装盘或网络引导盘。
考试提示
RHCSA和RHCE认证目标不再包含与急救模式有关的内容。但是,由于对不能启动系统的急救是一项重要技能,因此它可能会出现在这些考试之一的未来版本中。
为此,需要从这些选项中选择一个引导媒介。当我们看到安装屏幕出现以下选项时:
Install Red Hat Enterprise Linux 7.0 Test this media & install Red Hat Enterprise Linux 7.0 Troubleshooting
选择Troubleshooting选项,并按下回车键。将看到包含以下选项的屏幕:
Install Red Hat Enterprise Linux 7.0 in basic graphics mode Rescue a Red Hat Enterprise Linux system Run a memory test Boot from local drive Return to main menu
选择Rescue a Red Hat Enterprise Linux system选项,并按回车键。急救模式会在本地机上运行RHEL 7操作系统的一个最小稳定版本。实际上,它是其他Linux发行版(如Knoppix、Ubuntu甚至科学Linux重构发行版)上Live DVD可用媒介的一个文本版本。
实际经验
对于RHEL 7系统来说,最好使用RHEL 7的急救媒介。这些媒介使用一个由Red Hat编译的内核,并为支持它的软件进行定制。尽管如此,像Knoppix等发行版本都是很不错的选择。
可使用急救环境来恢复无法引导的系统。如果之前使用过RHEL 6中的急救模式,在这里就可以如鱼得水。图5-4显示了大部分情况下的下一个步骤。
图5-4 急救环境的选项
Continue选项(如图5-5所示)将检测到的所有卷挂载为/mnt/sysimage目录的子目录。Read-Only选项以只读模式挂载检测到的卷。Skip选项直接移动到命令行接口。选择Continue。确认之后,将看到一个shell提示符,如图5-6所示。
图5-5 在急救环境中挂载根文件系统
图5-6 急救环境的shell
在shell提示接口中输入chroot /mnt/sysimage命令。由于系统的普通顶层根目录已挂载到/mnt/sysimage目录,因此chroot命令修改根目录,就像/mnt/sysimage文件系统被挂载到/之下。
一定要练习本节介绍的有关GRUB 2的内容,这有助于你在真正遇到问题时进行恢复,Red Hat也声称其考试都是“真实环境的任务”。但是,不要假定在Red Hat考试期间能够访问CD或DVD。如果急救媒介不可用,则说明至少还有一种方法可以解决问题。