目录
摘要
本章描述如何配置 GRUB(SUSEŽ Linux Enterprise Desktop 中使用的引导加载程序)。一个特殊的 YaST 模块可用于配置所有设置。如果您不熟悉在 Linux 中进行引导的相关内容,请阅读下面几节获得一些背景信息。 本章还介绍了使用 GRUB 进行引导时经常遇到的一些问题和它们的解决方案。
![]() | 使用 UEFI 的计算机上无 GRUB |
|---|---|
配有传统 BIOS 的计算机和使用兼容支持模块 (CSM) 的 UEFI(统一可扩展固件接口)计算机上都例行安装了 GRUB。在未启用 CSM 的 UEFI 计算机上,将自动安装 | |
本章主要介绍引导加载程序 GRUB 的引导管理和配置。 第 9 章 引导和配置 Linux 系统中将引导过程作为一个整体进行了介绍。引导加载程序代表计算机 (BIOS) 和操作系统 (SUSE Linux Enterprise Desktop) 之间的接口。引导加载程序的配置直接影响到操作系统的启动。
本章经常出现以下术语,可能需要进行解释:
MBR 的结构是由独立于操作系统的约定定义的。 前 446 个字节为程序代码保留。 它们通常保存部分引导加载程序或操作系统选择器。 随后的 64 个字节为最多包含 4 项的分区表提供空间。分区表包含有关硬盘分区和文件系统类型的信息。 操作系统需要使用此表来处理硬盘。 如果 MBR 中有传统通用代码,则只应将一个分区标记为活动。 MBR 的最后两个字节包含静态“幻数”(AA55)。 一些 BIOS 会将包含不同值的 MBR 视为无效,因此引导时不会考虑此 MBR。
引导扇区是硬盘分区(除扩展分区之外)上的前几个扇区,扩展分区只充当其他分区的“容器”。 引导扇区具有 512 字节的空间,引导扇区储存用于引导安装在各个分区上的操作系统的代码。 这适用于经过格式化的 DOS、Windows 和 OS/2 分区的引导扇区,这些扇区还包含文件系统的一些重要的基本数据。相比之下,Linux 分区的引导扇区在设置文件系统(而不是 XFS)之后最初是空的。 因此,即使 Linux 分区包含内核和有效的 root 文件系统,它也不能通过自身进行引导。 储存了引导系统的有效代码的引导扇区具有与 MBR 中的最后两个字节 (AA55) 相同的幻数。
GRUB (Grand Unified Bootloader) 由两段组成。Stage 1 包含 512 个字节,它的唯一任务就是装载引导加载程序的第二段。随后,装载 stage 2。这一段包含引导加载程序的主要部分。
在一些配置中,可以使用中间段 1.5,它能从适当的文件系统中找到并装载第二段。 如果可能,将在安装时或使用 YaST 初始设置 GRUB 时默认选择此方法。
Stage 2 可以访问多个文件系统。当前,支持 Ext2、Ext3、ReiserFS、Minix,以及 Windows 使用的 DOS FAT 文件系统。 在某种程度上还支持 BSD 系统使用的 、XFS、UFS 和 FFS。 从版本 0.95 开始,GRUB 还能够从包含符合“El Torito”规范的 ISO 9660 标准文件系统的 CD 或 DVD 进行引导。即使是在引导系统之前,GRUB 也可以访问支持的 BIOS 磁盘设备(BIOS 检测到的软盘或硬盘、CD 驱动器和 DVD 驱动器)的文件系统。因此,对 GRUB 配置文件 (menu.lst) 进行更改不要求新安装引导管理器。当引导系统时,GRUB 重装载菜单文件以及内核或初始 ram 磁盘 (initrd) 的有效路径和分区数据,并对这些文件进行定位。
GRUB 的实际配置是基于四个文件进行的,下面对这四个文件进行介绍:
/boot/grub/menu.lst此文件包含有关可通过 GRUB 进行引导的分区或操作系统的所有信息。 没有这些信息,GRUB 命令行将提示用户如何继续(请参见第 10.1.1.3 节 “在引导过程中编辑菜单项”获取详细信息)。
/boot/grub/device.map此文件将 GRUB 和 BIOS 符号中的设备名转换为 Linux 设备名。
/etc/grub.conf此文件包含 GRUB 外壳正确安装引导加载程序所需的命令、参数和选项。
/etc/sysconfig/bootloader 此文件由使用 YaST 配置引导加载程序时和每次安装新内核时使用的 perl 引导加载程序库读取。其中包含默认情况下将添加到引导加载程序配置文件中的配置选项(如内核参数)。
可以通过多种方式控制 GRUB。 可以在图形菜单(启动屏幕)中选择现有配置的引导项。 配置是从文件 menu.lst 装载的。
在 GRUB 中,在引导前可以更改所有引导参数。 例如,可以通过这种方式更正编辑菜单文件时出现的错误。 还可以在输入提示符处以交互的方式输入引导命令(请参见第 10.1.1.3 节 “在引导过程中编辑菜单项”)。 GRUB 能够在引导前确定内核和 initrd 的位置。 通过这种方式,您甚至可以引导在引导加载程序配置中不存在任何项的已安装操作系统。
GRUB 实际上以两个版本存在:作为引导加载程序以及作为 /usr/sbin/grub 中的普通 Linux 程序。后者被称为 GRUB 外壳。它在已安装系统中提供 GRUB 的仿真,并且可用来安装 GRUB 或在应用新设置之前对其进行测试。 将 GRUB 作为引导加载程序安装在硬盘或软盘上的功能以 setup 命令的形式集成在 GRUB 中。当装载了 Linux 后在 GRUB shell 中可用。
带有引导菜单的图形启动屏幕基于 GRUB 配置文件 /boot/grub/menu.lst,该文件包含有关可以通过菜单引导的所有分区或操作系统的所有信息。
每次引导系统时,GRUB 都从文件系统装载菜单文件。 出于此原因,不必每次更改文件后都重安装 GRUB。 使用 YaST 引导加载程序修改 GRUB 配置,如 第 10.2 节 “使用 YaST 配置引导加载程序” 中所述。
菜单文件中包含命令。 语法非常简单。 每行都包含一条命令,后跟可选参数,可选参数之间用空格隔开,就像在 shell 中一样。 出于历史原因,某些命令允许在第一个参数前使用 =。 注释以井号 (#) 开头。
若要在菜单概述中标识菜单项,请为每项设置一个 title。 关键字 title 后的文本(包括任何空格)显示为菜单中的可选择选项。 当选择此菜单项时,将执行下一个 title 前的所有命令。
最简单的情况是重定向到其他操作系统的引导加载程序。 命令是 chainloader,参数通常是 GRUB 中另一个分区的引导块 block notation。 例如:
chainloader (hd0,3)+1
GRUB 中的设备名在 第 10.1.1.1 节 “硬盘和分区的命名约定” 中有所解释。 此示例指定第一个硬盘第四个分区中的第一个块。
使用命令 kernel 指定内核映像。 第一个参数是指向分区中内核映像的路径。 命令行上的其他参数将被传递到内核。
如果内核不具有访问根分区的内置驱动程序,或者使用了具有高级热插拨功能的最新 linux 系统,则必须用单独的 GRUB 命令指定 initrd,该命令的唯一参数便是指向 initrd 文件的路径。 因为 initrd 的装载地址会被写入装载的内核映像中,所以 initrd 命令必须紧接在 kernel 命令之后。
命令 root 简化了内核和 initrd 文件的指定。 root 的唯一参数是一个设备或分区。 此设备用于所有内核、initrd 或下一个 root 命令前未显式指定设备的其他文件路径。
每个菜单项的末尾都间接指定 boot 命令,因此无需将其写入菜单文件中。 但是,如果以交互方式使用 GRUB 进行引导,则必须在最后输入 boot 命令。 该命令本身没有参数。 它只引导装载的内核映像或指定的链装载程序。
在写入所有菜单项之后,将其中一项定义为 default 项。 否则,将使用第一项(项 0)。 您还可以指定在一段时间后引导默认项的超时值(以秒为单位)。timeout 和 default 通常在各菜单项前面。 示例文件在 第 10.1.1.2 节 “示例菜单文件” 中有所介绍。
GRUB 用于硬盘和分区的命名约定不同于普通 Linux 设备使用的命名约定。它更类似于 BIOS 执行的简单磁盘枚举,而语法类似于一些 BSD 衍生程序中使用的语法。 在 GRUB 中,分区的编号从 0 开始。它表示 (hd0,0) 是第一块硬盘的第一个分区。 在普通台式机上,作为 Primary Master(第一个 IDE 控制器上的主设备)连接的硬盘所对应的 Linux 设备名为 /dev/sda1。
4 个可能的主分区所分配的分区号为 }0 到 3。 逻辑分区的编号从 4 开始:
(hd0,0) first primary partition of the first hard disk (hd0,1) second primary partition (hd0,2) third primary partition (hd0,3) fourth primary partition (usually an extended partition) (hd0,4) first logical partition (hd0,5) second logical partition
GRUB 依赖于 BIOS 设备,它不区分 IDE、SATA、SCSI 和硬件 RAID 设备。 BIOS 或其他控制器识别的所有硬盘将按照 BIOS 中显示的引导顺序进行编号。
不过,通常不能将 Linux 设备名准确映射为 BIOS 设备名。 它借助某种算法生成这一映射并将其保存到文件 device.map 中,可以根据需要对该文件进行编辑。 有关文件 device.map 的信息在 第 10.1.2 节 “文件 device.map” 中有所介绍。
完整的 GRUB 路径包含写在括号中的设备名和指向指定分区的文件系统中文件的路径。 路径以斜线开头。 例如,在具有一个 IDE 硬盘(该硬盘的第一个分区中包含 Linux)的系统上,可以按如下方式指定可引导内核:
(hd0,0)/boot/vmlinuz
以下示例描述了 GRUB 菜单文件的结构。 此示例安装包括 /dev/sda5 下的 Linux 引导分区、/dev/sda7 下的 root 分区和 /dev/sda1 下的 Windows 安装。
gfxmenu (hd0,4)/boot/message color white/blue black/light-gray default 0 timeout 8 title linux root (hd0,4) kernel /boot/vmlinuz root=/dev/sda7 vga=791 resume=/dev/sda9 initrd /boot/initrd title windows rootnoverify (hd0,0) chainloader +1 title floppy rootnoverify (hd0,0) chainloader (fd0)+1 title failsafe root (hd0,4) kernel /boot/vmlinuz.shipped root=/dev/sda7 ide=nodma \ apm=off acpi=off vga=normal nosmp maxcpus=0 3 noresume initrd /boot/initrd.shipped
第一块定义了启动屏幕的配置:
背景图像 message 位于 /dev/sda5 分区的顶级目录中。
颜色模式:白色(前景)、蓝色(背景)、黑色(所选内容)、浅灰色(所选内容的背景)。颜色方案对启动屏幕没有任何影响,它只影响通过按 Esc 键退出启动屏幕后所访问的可自定义的 GRUB 菜单。
第一个菜单项 title linux 是默认情况下引导的对象。
如果 8 秒钟后无任何用户输入,GRUB 将自动引导默认项。 要检测自动引导,请删除 timeout 行。 如果设置 timeout 0,GRUB 将立即引导默认项。
第二块(也就是最大的块)列出了各个可引导的操作系统。 各个操作系统的不同部分由 title 引出。
第一项 (title linux) 负责引导 SUSE Linux Enterprise Desktop。内核 (vmlinuz) 位于第一块硬盘的第一个逻辑分区(引导分区)。 内核参数(例如引导分区和 VGA 方式)也被追加在此处。 root 分区是根据 Linux 命名约定 (/dev/sda7/) 指定的,因为此信息将由内核读取而与 GRUB 无关。initrd 也位于第一块硬盘的第一个逻辑分区中。
第二项负责装载 Windows。 Windows 将从第一块硬盘的第一个分区 (hd0,0) 引导。 命令 chainloader +1 将导致 GRUB 读取并执行指定分区的第一个扇区。
下一项支持从软盘进行引导,而无需修改 BIOS 设置。
引导选项 failsafe 用一组内核参数启动 Linux,这些参数使 Linux 甚至可以在有问题的系统上引导。
随时可以根据需要更改菜单文件。GRUB 会在下次引导时使用修改后的设置。 使用 YaST 或所选的编辑器对文件进行永久编辑。 或者,使用 GRUB 的编辑功能可以按交互方式进行临时更改(请参见第 10.1.1.3 节 “在引导过程中编辑菜单项”)。
在图形引导菜单中,使用箭头键选择要引导的操作系统。 如果选择 Linux 系统,则可以在引导提示符处输入其他引导参数。 若要直接编辑个别菜单项,请按 Esc 键退出启动屏幕并进入 GRUB 基于文本的菜单,然后按 E 键。 通过这种方式进行的更改仅适用于当前引导,不会被永久采用。
![]() | 引导过程中的键盘布局 |
|---|---|
US 键盘布局是引导时唯一可用的键盘布局。 请参见图 28.3 “美式键盘布局”。 | |
编辑菜单条目简化了无法再进行引导的有问题系统的修复工作,因为可以通过手动输入参数规避引导加载程序中有问题的配置文件。 在引导过程中手动输入参数还可用于测试新设置而避免损坏本机系统。
在激活编辑方式后,可以使用箭头键选择要编辑其配置的菜单项。 若要使配置可以编辑,请再次按 E 键。 通过这种方式,可以编辑不正确的分区或路径指定,从而防止它们对引导进程产生负面影响。 按 Enter 键退出编辑方式并返回菜单。 随后按 B 键引导此项。 可以进行的进一步操作显示在底部的帮助文本中。
若要永久输入更改的引导选项并将它们传递到内核,则以 root 用户身份打开文件 menu.lst 并将相应的内核参数追加到现有的行上,用空格分隔:
title linux
root(hd0,0)
kernel /vmlinuz root=/dev/sda3 additional parameter
initrd /initrdGRUB 会在下次引导系统时自动采用新参数。 或者,还可以通过 YaST 引导加载程序模块进行此更改。 将新参数追加到现有的行上,用空格分隔。
文件 device.map 将 GRUB 和 BIOS 设备名映射为 Linux 设备名。 在包含 IDE 和 SCSI 硬盘的混合系统中,GRUB 必须通过特殊过程尝试确定引导顺序,因为 GRUB 不能访问 BIOS 上有关引导顺序的信息。 GRUB 会将此分析的结果保存在文件 /boot/grub/device.map 中。 对于 BIOS 中引导顺序设置为 IDE 在 SCSI 之前的系统,文件 device.map 如下所示:
(fd0) /dev/fd0 (hd0) /dev/disk-by-id/DISK1 ID(hd1) /dev/disk-by-id/DISK2 ID
因为 IDE、SCSI 和其他硬盘的顺序取决于各种因素,并且 Linux 无法标识映射,所以可以在文件 device.map 中手动设置顺序。如果在引导时遇到问题,请检查此文件中的顺序是否对应于 BIOS 中的顺序,如果需要,使用 GRUB 提示符对其进行临时修改。引导了 Linux 系统之后,便可以使用 YaST 引导加载程序模块或所选的编辑器对文件 device.map 进行永久编辑。
在手动更改 device.map 之后,请执行以下命令重安装 GRUB。 此命令导致重装载文件 device.map 并且执行 grub.conf 中列出的命令:
grub --batch < /etc/grub.conf
除了 menu.lst 和 device.map 之外,第三个重要的 GRUB 配置文件就是 /etc/grub.conf。此文件包含 GRUB 外壳正确安装引导加载程序所需的命令、参数和选项。
setup --stage2=/boot/grub/stage2 --force-lba (hd0,1) (hd0,1) quit
该命令将告知 GRUB 使用位于第一个硬盘 (hd0,1) 的第二个分区上的引导映像将引导加载程序自动安装到同一分区上。需要 --stage2=/boot/grub/stage2 参数在已装入的文件系统中安装 stage2 映像。一些 BIOS 具有不正确的 LBA 支持实施,--force-lba 提供了解决方案以忽略这些故障。
此配置文件仅当使用 YaST 配置引导加载程序时和每次安装新内核时才使用。它由 perl 引导加载程序库评估,此库会相应地修改引导加载程序配置文件(例如,对于 GRUB 为 /boot/grub/menu.lst)。/etc/sysconfig/bootloader 不是特定于 GRUB 的配置文件 - 值将应用于安装在 SUSE Linux Enterprise Desktop 上的任何引导加载程序。
![]() | 内核更新后的引导加载程序配置 |
|---|---|
每次安装新内核时,perl 引导加载程序都会使用在 | |
LOADER_TYPE
指定在系统(例如 GRUB 或 LILO)上安装的引导加载程序。请勿修改、使用 YaST 来更改引导加载程序—请参见过程 10.6, “更改引导加载程序类型”了解细节。
DEFAULT_VGA / FAILSAFE_VGA / XEN_VGA
引导期间使用的 framebuffer 的屏幕分辨率和颜色深度是通过内核参数 vga 配置的。这些值定义对于默认引导项、failsafe 和 XEN 项使用哪种分辨率和颜色深度。以下值为有效值:
表 10.1. 屏幕分辨率和颜色深度参考
|
640x480 |
800x600 |
1024x768 |
1280x1024 |
1600x1200 | |
|---|---|---|---|---|---|
|
8bit |
0x301 |
0x303 |
0x305 |
0x307 |
0x31C |
|
15bit |
0x310 |
0x313 |
0x316 |
0x319 |
0x31D |
|
16bit |
0x311 |
0x314 |
0x317 |
0x31A |
0x31E |
|
24bit |
0x312 |
0x315 |
0x318 |
0x31B |
0x31F |
DEFAULT_APPEND / FAILSAFE_APPEND / XEN_KERNEL_APPEND
自动追加到引导加载程序配置文件中的默认引导项、failsafe 和 XEN 引导项的内核参数(vga 除外)。
CYCLE_DETECTION / CYCLE_NEXT_ENTRY
配置是否要使用引导周期检测,如果要使用,则配置在重引导周期要从 /boot/grub/menu.lst 引导的备用项(例如 Failsafe)。请参见 /usr/share/doc/packages/bootcycle/README 了解详细信息。
即使是在引导操作系统之前,GRUB 也支持对文件系统的访问。 没有根权限的用户可以访问 Linux 系统中的文件,而一旦引导系统后,他们将无权访问这些文件。 要阻止此类访问或防止用户引导某些操作系统,请设置引导密码。
![]() | 引导密码和启动屏幕 |
|---|---|
如果对 GRUB 使用引导密码,则不显示通常的启动屏幕。 | |
以 root 用户身份按如下步骤设置引导密码:
在根提示符处,使用 grub-md5-crypt 加密密码:
# grub-md5-crypt Password: **** Retype password: **** Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
将经过加密的字符串粘贴到 menu.lst 文件的全局部分:
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
现在,只有在按 P 键并输入密码后,才可以在引导提示符处执行 GRUB 命令。 但是,用户仍可以从引导菜单引导所有操作系统。
要防止从引导菜单引导一个或多个操作系统,请将项 lock 添加到 menu.lst 中不输入密码就不能引导的每个部分。 例如:
title linux kernel (hd0,4)/vmlinuz root=/dev/sda7 vga=791 initrd (hd0,4)/initrd lock
在重引导系统并从引导菜单中选择 Linux 项后,将显示以下错误消息:
Error 32: Must be authenticated
按 Enter 键进入该菜单。 然后按 P 键,系统将提示您输入密码。 在输入密码并按 Enter 键之后,将引导所选的操作系统(在本例中为 Linux)。