从失败的Linux启动中恢复

大多数Linux计算机使用Grand Unified Bootloader(GRUB)(更具体地说是GRUB 2)来控制从计算机固件到内核的切换。 GRUB 2提供了复杂的启动时用户交互功能,使您可以控制启动过程。 您可能不会每天使用这些功能,但是它们在处理问题情况时可能很重要,例如在内核升级,磁盘交换或其他系统更改后计算机无法启动。 一些提示和GRUB命令可以帮助您在这种情况下引导计算机并节省宝贵的时间。 即使启动引导加载程序的常规初始阶段出现问题,您也可以使用紧急启动磁盘来启动正常的Linux安装。

从广义上讲,GRUB恢复解决了两种类型的问题:使用GRUB的内置外壳可以解决的问题以及需要外部工具的问题。 在本文中,我以Super GRUB2磁盘为例介绍了两种类型的问题,您可以在需要时使用它作为外部工具的示例。 (本文着重介绍GRUB 2,但此处提供的某些信息也适用于GRUB Legacy。在“ 迁移到GRUB 2 ”中了解GRUB Legacy和GRUB 2之间的区别。)

了解GRUB 2的控制结构

在研究恢复细节之前,您应该了解GRUB工作原理的一些基础知识。 计算机的启动过程很复杂,如果启动过程偏离了启动路径,那么了解启动路径的相关信息可以帮助您解决问题。 我将从描述启动代码和GRUB文件在计算机上的位置开始,以便您可以找到它们-或确定如果由于文件丢失而导致问题的原因。 对GRUB配置文件格式的完整描述超出了本文的范围,但是我确实涵盖了配置基础,它可以帮助您纠正简单的错误(例如,错误指定的根文件系统)。

查找GRUB文件

大多数使用基本输入/输出系统(BIOS)的计算机上的引导过程都涉及存储在磁盘上各个位置的代码。 这些位置包括主启动记录(MBR),正式未分配的磁盘扇区和分区的启动扇区(也称为分区启动记录[PBR])。 这些记录可能会被其他引导加载程序覆盖,被病毒或低级磁盘实用程序覆盖,这些需求可能与GRUB冲突,或者由于滥用了dd等低级实用程序而损坏。 发生这种损坏时,GRUB根本不可能启动,您可能需要使用诸如Super GRUB2 Disk之类的工具。

许多较新的计算机使用可扩展固件接口(EFI)而不是BIOS。 在此类系统上,GRUB代码未存储在MBR,PBR或正式未分配的磁盘扇区中。 相反,它位于EFI系统分区(ESP)上的扩展名为.efi的EFI引导加载程序文件中-该分区通常具有文件分配表(FAT)格式,通常出现在磁盘的开头。 EFI系统不易受到与BIOS系统相同类型的低级启动加载程序损坏的影响,但由于更改计算机的非易失性RAM(NVRAM)设置,它们可能会发生故障。 在这种情况下,您可能需要执行紧急启动,然后使用efibootmgr实用程序将GRUB还原为默认启动加载程序。

除了低级BIOS或EFI引导文件之外,GRUB 2还依赖于/ boot / grub中的常规文件。 这些文件包括文件系统驱动程序,视频驱动程序,字体和GRUB配置文件(grub.cfg)。 由于这些文件驻留在普通的Linux文件系统中,因此较早的引导阶段必须至少包含一个基本的Linux文件系统驱动程序。 如果这些文件已损坏,则GRUB可能会正常启动,但无法启动您的操作系统。 或GRUB可能会启动,并且只显示grub>提示符。

编辑配置文件

在大多数系统上,GRUB 2配置文件是/boot/grub/grub.cfg或/boot/grub2/grub.cfg。 但是,某些基于EFI的安装会将其放在ESP上的目录中。 这可能是/boot/efi/EFI/grub/grub.cfg或其他类似位置。 但是在大多数情况下,grub.cfg文件并不意味着可以直接进行编辑; 相反,它由脚本拼凑而成。 您可以在/etc/grub.d目录中找到一些组件。 如果需要更改标准GRUB 2配置,请编辑这些文件。

但是,它是内置的,grub.cfg由全局选项和特定于操作系统或内核的引导节组成。 Linux发行版为大多数计算机正确设置了其全局GRUB 2配置。 如果您有异常的配置,则可能需要研究全局GRUB 2配置以查找问题原因。

GRUB 2的引导节定义了各个OS或内核。 引导节通常出现在grub.cfg文件的后半部分。 清单1显示了一个示例:

清单1.启动Linux的示例GRUB 2节
menuentry 'Ubuntu, with Linux 3.2.0-24-generic-pae' {
   recordfail
   gfxmode $linux_gfx_mode
   insmod gzio
   insmod part_gpt
   insmod reiserfs
   set root='(hd0,gpt6)'
   search --no-floppy --fs-uuid --set=root 313324f5-a9ed-4e80-b541-dc9e5eeb89fc
   linux   /vmlinuz-3.2.0-23-generic-pae root=/dev/sda7 ro quiet splash $vt_handoff
   initrd  /initrd.img-3.2.0-23-generic-pae
}

有关清单1中的条目的一些关键点包括:

  • insmod命令加载驱动程序模块。
  • set root行标识了从中读取内核和初始RAM磁盘的分区,但是search行将覆盖此值,并通过其包含的文件系统的通用唯一标识符(UUID)编号来定位该分区。
  • linux行标识一个Linux内核,并设置传递给它的选项。
  • initrd行标识了传递给内核的初始RAM磁盘文件。

引导时与GRUB 2交互

为了能够解决问题,您首先应该了解正常的引导过程以及调整过程。 通常,您可以使用GRUB 2的内置编辑器来调整引导选项,从而解决一些小问题。 有时,您可以使用GRUB 2的内置shell从更严重的问题中恢复。

了解正常的启动过程

传统上,GRUB显示一个文本模式菜单,类似于图1所示的菜单,其中显示了您的引导选项。 (在当今的许多安装中,除非您按任意键,否则GRUB会隐藏此菜单。)

图1. GRUB菜单
简单的GRUB文本模式菜单的屏幕截图,显示了您的启动选项。在此示例中,选项为Ubuntu,Ubuntu(恢复模式),先前的Linux版本和两个内存测试。

在正常启动中,您可以使用向上和向下箭头键浏览菜单,然后按Enter键选择所需的条目。 然后,在Linux系统上,GRUB加载内核和初始RAM磁盘,并将计算机的控制权传递给内核。

更改启动选项

如果进入类似于图1所示的GRUB菜单,但是选择无法启动,则引导项可能存在问题。 GRUB包含一个简单的文本编辑器,因此您可以在运行时临时更改启动节。 要更改引导选项,请在GRUB菜单中选择最接近您想要实现的条目,然后按e键。 结果类似于图2:

图2. GRUB文本编辑器
GRUB文本编辑器中出现的引导节的屏幕截图

图2中的行与清单1中的boot节中的行相同。 您可以像在Linux中使用文本模式文本编辑器一样编辑这些条目。 您在此编辑器中所做的任何更改都是临时的。 (要了解如何使更改永久生效,请参阅本文后面的进行永久修复 。)

在文本编辑器中编辑引导节的一个常见原因是进行单引导更改。 例如,假设您想引导到单用户模式以执行低级维护,但是GRUB中没有单用户条目。 您可以通过编辑boot节并在linux行的末尾添加single来实现您的目标。 完成后,按Ctrl-xF10进行引导,屏幕底部的提示会提醒您。

如果创建新的GRUB条目而无法启动,则可以通过检查引导条目来发现问题。 该项或许包含拼写错误,如linu ,而不是linux 。 也许您省略了initrd行。 也许您指定了错误的根文件系统。 通常,您可以通过使用系统知识和GRUB 2配置知识来纠正此类问题。 但是,在其他情况下,您可能缺少关键知识。 例如,您可能需要了解根文件系统的标识符是什么。 在这种情况下,或者当问题更加严重时,可以使用GRUB 2 shell。

使用GRUB 2 Shell

GRUB包含自己的内置外壳,您可以在其中键入与在Bash或其他Linux文本模式外壳中键入的命令类似的命令。 按照Linux标准,GRUB shell很简单,但是足以应付许多紧急维护任务。 要从GRUB主菜单( 图1 )进入外壳,请按c 。 要从GRUB编辑器输入外壳程序( 图2 ),请按Ctrl-cF2 。 结果类似于图3:

图3. GRUB外壳
启动后GRUB Shell的屏幕截图。

GRUB 2 Shell支持一系列命令,其中许多命令与grub.cfg中用于控制菜单驱动的引导过程的命令相似或相同。 如果您对GRUB 2配置文件格式足够熟悉,则可以通过在Shell上键入命令来引导计算机。 实际上,您更有可能使用Shell进行恢复操作。 表1列出了在这方面最有用的一些命令。 GRUB 2支持许多其他命令,您可以在GRUB文档中阅读这些命令。

表1.常见的GRUB 2命令行命令
命令 选件 说明
boot 没有 引导已经定义的内核或链加载程序。
cat filename 显示指定文件的内容。
configfile filename 加载指定的配置文件。
help [ command ] 显示帮助-命令列表或指定命令的帮助。
initrd filename 加载指定的初始RAM磁盘文件。
insmod module_name 加载指定的模块(驱动程序)。
linux filename 加载指定的Linux内核。
ls [ arg ] 列出设备或设备上的文件。
reboot 没有 重新启动计算机。
set envvar=value 将环境变量设置为等于值。

可能促使使用GRUB命令行的一个问题是GRUB无法定位其自己的配置文件。 正如我在本文的进行永久性维修部分中所述,重新安装GRUB是长期的解决方案。 但是,与此同时,您可以发出一些命令来调出常规GRUB菜单并引导Linux。 首先,您必须标识安装GRUB的分区。 您可以在ls命令的帮助下执行此操作。 如果不带任何选项使用, ls显示GRUB可以检测到的磁盘和分区。 然后,您可以通过在设备的名称后面加上斜杠( / )来查看特定的分区,如清单2所示:

清单2.使用ls查看设备或文件系统的内容
grub> ls
(hd0) (hd0,gpt5) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)
grub> ls (hd0,gpt5)/
abi-3.2.0-22-generic grub/ initrd.img-3.2.0-22-generic
memtest86+bin System.map-3.2.0-22-generic vmcoreinfo-3.2.0-22-generic
vmlinuz-3.2.0-22-generic

清单2中的示例显示了具有单个磁盘(hd0)的计算机,该磁盘包含五个全局唯一标识符(GUID)分区表(GPT)分区。 (hd0,gpt5)的内容似乎是Linux / boot分区,包括GRUB配置目录(grub /)。 您可能需要先窥视其他分区,然后才能找到Linux / boot分区。 如果系统不使用单独的/ boot分区,则必须寻找Linux根(/)分区。

识别出GRUB配置文件的主目录后,您可以通过设置prefixroot环境变量来告诉GRUB在哪里找到它。 这些变量分别标识grub.cfg所在的目录和它所在的分区:

grub> set prefix=(hd0,gpt5)/grub
grub> set root=(hd0,gpt5)

从这里,您可以加载normal模块并启动它以调出GRUB菜单:

grub> insmod normal
grub> normal

使用Super GRUB2磁盘

在某些情况下,GRUB甚至不会给您grub>提示,否则即使使用该提示,您也可能无法解决问题。 在这些情况下, Super GRUB2 Disk救援工具可以提供帮助。

备灾

即使您现在可以成功启动,我还是建议您手头上有Super GRUB2 Disk的副本,以便在需要时立即使用。 Super GRUB2 DISK下载是带有.iso扩展名的混合图像文件。 您可以使用dd将此文件复制到软盘,CompactFlash(CF)磁盘,通用串行总线(USB)闪存驱动器或类似类型的磁盘。 或者,您可以使用cdrecord或GUI光盘工具将文件复制到CD-R。

创建启动媒体后,建议您(最好在多台计算机上)对其进行测试,以使该工具熟悉并验证它是否可以在您使用的硬件上正常工作。

使用Super GRUB2磁盘引导

准备Super GRUB2磁盘后,可以像其他任何可引导磁盘一样引导它。 在某些情况下,您可能需要在引导过程中按一个键来更改引导顺序。 F2,F10和F12是常见的选择,但是您应该查阅计算机手册以了解详细信息。 引导Super GRUB2 Disk时,会出现类似图4所示的显示,其中包括检测OS或启用各种类型的支持的选项:

图4.引导Super GRUB2 Disk时显示的GRUB菜单
Super GRUB2 Disk引导后显示的菜单的屏幕截图

如果您的计算机使用独立磁盘(RAID)或逻辑卷管理(LVM)的冗余阵列-或依赖于较旧的并行ATA(PATA)磁盘或外部USB磁盘-您可能需要通过选择它们并按Enter来激活这些功能。 完成后,您可以尝试检测选项。 我发现,检测任何GRUB2配置文件(grub.cfg)和检测任何GRUB2安装(即使MBR被覆盖)选项通常最适合恢复损坏的GRUB安装。 但是“检测任何操作系统”选项也可能值得尝试。

如果检测成功,您应该会看到一个新的GRUB菜单选项。 在单操作系统安装中,此菜单可能仅包含一个条目,该条目通过(hd0,gpt5)/grub/grub.cfg中的路径来标识GRUB配置文件。 当您选择此选项时,将显示安装的常规GRUB屏幕。 (字体和颜色可能有所不同,但是菜单选项应该可以正常工作。)

进行永久性维修

到目前为止,我所描述的修理都是无常的。 您可能会成功启动Linux,但是一旦您重新启动,您将得到原始的GRUB屏幕。 要使更改永久生效,您需要采取其他措施。

这些步骤中最简单的就是调整GRUB配置文件。 尽管您可以直接编辑grub.cfg来更改设置,但这种方法还是不可取的,因为每当您升级发行版提供的内核时,自动化脚本都可能从其他文件中重建文件。 而是在/etc/grub.d中编辑文件,在/ etc / default / grub中编辑默认全局设置。 然后,您可以使用grub-mkconfig在Linux命令提示符下生成一个新的grub.cfg文件:

grub-mkconfig -o /boot/grub/grub.cfg

如果您的问题是GRUB仅显示grub>提示或根本没有启动,则必须将GRUB重新安装到硬盘上:

grub-install /dev/sda

在某些情况下,您可能需要安装到/ dev / sda以外的设备,例如/ dev / sdb。 通常不建议将GRUB 2安装到分区。 如果要将GRUB安装到基于BIOS的计算机上的GPT磁盘上,请确保该计算机包含BIOS引导分区。 没有它,GRUB可能会拒绝安装或不可靠。 如果要将GRUB安装到基于EFI的计算机上,请省略设备规格并确保ESP已安装在/ boot / efi。 grub-install将必要的文件自动复制到此目录(并因此复制到ESP)。 如果由于NVRAM设置不正确而导致GRUB无法在基于EFI的计算机上启动,则您可能能够在固件本身中对其进行修复,但是具体实现因实施而异。 另外,如果可以在EFI模式下引导紧急系统,则可以使用efibootmgr还原引导加载程序:

efibootmgr -c -l \\EFI\\loaderdir\\loadername.efi -L MenuName

结论

GRUB 2是用于直接引导Linux(和其他几个)操作系统内核的灵活工具。 但是由于引导过程中的漏洞以及GRUB自身的复杂性,可能会出现一些问题,使系统无法启动。 在这种情况下,了解如何编辑单个GRUB节,使用GRUB命令行以及使用Super GRUB2 Disk是非常宝贵的技能。 通过使用这些技术,您可以从各种启动问题中恢复并启动到常规安装中。 此时,您可以编辑GRUB 2配置文件或重新安装引导加载程序以使您的修复永久。


翻译自: https://www.ibm.com/developerworks/opensource/library/l-GRUB2-features/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值