首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

从失败的 Linux 引导中恢复-1

从失败的 Linux 引导中恢复-1

大多数 Linux 计算机使用 Grand Unified Bootloader (GRUB) — 更具体的讲是 GRUB 2 — 来控制从计算机的固件到内核的转移。GRUB 2 提供了复杂的引导时用户交互功能,为您提供了控制引导过程的能力。您可能不想每天都使用这些功能,但它们在处理问题的时候很重要,比如计算机在执行内核升级、磁盘更换或其他系统更改后无法引导的时候。一些技巧和 GRUB 命令可帮助您在这些情形下引导计算机,节省宝贵的时间。您也可以使用紧急引导磁盘引导您正常的 Linux 系统,即使在引导装载程序激活的常规初始阶段出现问题,也可以这样做。
一般来讲,GRUB 恢复能解决两种类型的问题:可使用 GRUB 的内置 shell 解决的问题和需要外部工具的问题。本文将介绍这两种类型的问题,并使用 Super GRUB2 Disk 作为一个可在必要时使用的外部工具的例子。(本文着重介绍了 GRUB 2,但这里提供的一些信息也适用于 GRUB Legacy。从 “” 中,可以了解 GRUB Legacy 与 GRUB 2 之间的区别。)
了解 GRUB 2 的控制结构在深入了解恢复细节之前,您应了解 GRUB 工作原理的一些基本知识。计算机的引导过程很复杂,如果引导过程偏离了引导路径,那么对引导路径有一定的了解可以帮助您解决问题。我首先将介绍引导代码和 GRUB 文件位于计算机上何处,以便您可找到它们,或者在某个缺少的文件导致出现问题时识别可能缺少了哪个文件。GRUB 配置文件格式的完整描述不属于本文的讨论范围,但我会介绍该配置的基本知识,帮助您更正简单的错误(比如错误指定的引导文件系统)。
找到 GRUB 文件大多数使用基本输入/输出系统 (BIOS) 的计算机上的引导过程都涉及到存储在磁盘上各个位置的代码。这些位包括主引导记录 (Master Boot Record, MBR)、未正式分配的磁盘扇区和分区的引导扇区(也称为分区引导记录 [Partition Boot Record, PBR])。这些记录可由其他引导装载程序改写,由病毒或具有与 GRUB 冲突的需求的低级磁盘改写,或者由于误用 dd 等低级实用程序而遭到损坏。在出现这些损坏时,GRUB 不太可能完全启动,您可能需要使用一个工具,比如 。
许多较新的计算机使用的是可扩展固件接口 (Extensible Firmware Interface, EFI) 而不是 BIOS。在这些系统上,GRUB 代码未存储在 MBR、PBR 或未正式分配的磁盘扇区中。它们位于 EFI 系统分区 (ESP) 上一个具有 .efi 扩展名的 EFI 引导装载程序文件中,ESP 是一个通常出现在磁盘开头并具有文件分配表 (File Allocation Table, 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 都包含全局选项和特定于操作系统或内核的引导代码节 (stanza)。Linux 发行版可针对大多数计算机正确设置其全局 GRUB 2 配置。如果您有一个不常见的配置,那么您可能需要分析全局 GRUB 2 配置来查找问题的原因。
GRUB 2 的引导选项定义了各个操作系统或内核。这些引导代码节通常位于 grub.cfg 文件的后半部分。清单 1 显示了一个示例:
清单 1. 引导 Linux 的示例 GRUB 2 代码节
1
2
3
4
5
6
7
8
9
10
11
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  菜单在正常引导过程中,可使用上下箭头键导航该菜单,然后按下 Enter 键选择想要的选项。在 Linux 系统上,GRUB 随后会加载内核和初始 RAM 磁盘,并将计算机的控制权转交给内核。
更改引导选项如果您看到一个类似 图 1 的 GRUB 选项,但您的选项尚未生效,那么可能是引导选项出了问题。GRUB 包含一个简单的文本编辑器,可在运行时使用它临时更改您的引导代码节。要更改引导选项,可在 GRUB 菜单中选择最接近您想要实现的目标的选项,然后按下 e 键。结果类似于图 2:
图 2. GRUB 文本编辑器图 2 中的各行与  中的引导代码节中的各行相同。您可以编辑这些选项,就像使用 Linux 中的文本模式编辑器一样。您在此编辑器中执行的所有更改都是临时性的。(要了解如何执行永久更改,请参阅本文后面的 。)
在文本编辑器中编辑引导代码节通常是为了执行一次性引导更改。例如,假设您希望引导到单用户模式来执行低级维护,但 GRUB 中没有单用户选项。要实现此目的,可编辑引导代码节,并将 single 添加到 linux 行末尾。完成上述操作后,按下 Ctrl-xF10 来进行引导,就像屏幕底部给出的提示一样。
如果创建一个新 GRUB 选项但它无法启动,那么您可以检查此引导选项来发现问题。或许该选项包含录入错误,比如写成了 linu 而不是 linux。或许您省略了 initrd 行。或许您指定了错误的引导文件系统。一般而言,可使用您的系统和 GRUB 2 配置的知识来更正这类问题。但是,在其他情况下,您可能缺乏相关的重要知识。例如,您可能需要了解引导文件系统的标识符是什么。在这些情况下,或者在问题变得更严重的时候,您可以使用 GRUB 2 shell。
返回列表