GRUB2 中文手册 word 版 - 图文

更新时间:2024-03-11 04:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

GNU GRUB 中文手册

修订次数:1

不保证含义准确仅供参考。若发现有谬误之处可发送邮件到:grub2_cn_manual@126.com

邮件主题必须以 grub2: 开始,否则系统不接收。

针对 grub 版本 v1.99 info 手册翻译,并且添加插图和注解。

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software

Foundation; with no Invariant Sections.

译者:三寸断梁

1 grub 前言

搭建 GRUB2 LINUX 实验环境。由于 GRUB 是启动加载器,因此你修改配置文件后需要重启电脑才

能看到改变,为了避免反复重启。在这里推荐使用 VirtualBox 虚拟机。

本人实验配置是:Fedora 16-i386-DVD 完全安装,VirtualBox 4.2.2 for linux 。Grub 1.99 。

syslinux 4.05 ,你的 linux 主机应该安装有 grub2 。下文所述,在我的机器 3 个镜像成功加载。

1. 准备虚拟机。如果你发现鼠标消失了,按下 右 ctrl 。

???从 https://www.virtualbox.org/wiki/Linux_Downloads 下载 VirtualBox 4.2.2 。我选择 的是 All distributions 。 80M 左右的体积。

???

新建一个虚拟机,操作简单直接下一步下一步。设置为使用 128M 内存,使用虚拟硬盘文 件,512M 硬盘。显存 23M 。不要启动虚拟机,完成下面的步骤。

2. 准备 memdisk

???使用 syslinux 是因为实验中的实例需要 memdisk,它是包括在 syslinux 中的。可以用来

加载一些 Win 下的 img 镜像,比如: Ghost82.img MaxDOS.img 读者可到网 下载这 两个文件。

???

从 ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/ 下载 syslinux-4.05.tar.gz 它是

syslinux 源代码。新版本 syslinux 中的 memdisk 能自动计算镜像文件的 c h s 参数。解压

源代码到某个路径例如 主目录~

???

编译 memdisk(我们只需要 memdisk)。编译需要 nasm 编译器,执行如下命令:

cd ~/syslinux-4.05/memdisk make

1

它会生成名为 memdisk 的文件。这个文件可以在 GRUB2 中使用 linux16 加载。

3. 准备用来创建光盘镜像的 iso 目录

???

mkdir -p ~/iso/boot/grub{,2}

???

在 ~/iso/boot/grub 下建立配置文件 grub.cfg 内容如下:

set root=\

menuentry 'Ghost82.img' { linux16 /boot/memdisk initrd16 /Ghost82.img }

menuentry 'MaxDos.img' { linux16 /boot/memdisk initrd16 /MaxDOS.img }

menuentry 'win7pe-cn.iso' { linux16 /boot/memdisk iso initrd16 /Win7PE-CN.iso

#你需要自己准备一个 Win iso,使用 memdisk 在虚拟机中加载 ISO 需要等待较长时间。而且需要大量内 存。我们最初设置的 128M 不够用。所以正文没有提及。 }

set timeout=-1

? 复制 Ghost82.img MaxDOS.img 到~/iso ;复制 ~/syslinux-4.05/memdisk/memdisk 到

~/iso/boot/;复制所有 GRUB2 模块到~/iso/boot/grub2 。GRUB2 模块在 i386 /usr/lib/grub2/i386-pc/ 。

应该在:

4. 创建 grub.iso ,这个文件将用虚拟机加载。

? 在主目录下执行命令:grub2-mkrescue -o grub.iso iso

因为当前处在主目录下,命令中的 iso 就指向 ~/iso 目录。创建的 grub.iso 光盘,包含:

~/iso/* 下的所有文件,并且包含有 GUB2 启动区块。这个 iso 可以写入 CD。如果希望写入 U

盘需要使用 grub2-install 命令。

5. 在虚拟机的镜像列表中添加 grub.iso,然后启动虚拟机。

当你修改了 iso/boot/grub/grub.cfg 配置文件,重新执行第四步,然后重启虚拟机就看以看到 改变。

2

如果你没有出错且幸运的话,虚拟机 应该能够得到 图。尝试前两个选项,她们应该能够正确运行。

1.1 概论 简而言之:grub 是一个引导加载器,即计算机系统启动时第一个运行的程序。它是为了加载操作系统和 转移控制权给操作系统内核。内核再继续启动完整的操作系统。

GNU GRUB 是一个非常强大的引导加载器,它可以加载种类繁多的操作系统。还支持链式加载\chain- loading\ 。

GRUB 最大的特性就是可扩展性。GRUB 支持文件系统和内核可执行格式,因此你可以用很多方式加载

你的 OS,而不用记录下 OS 在磁盘 的物理地址。比如使用分区名,路径和文件名指定文件。

当 GRUB 加载系统时,可以使用命令行交互模式,也可以使用菜单选择模式。使用命令行模式你需要指 定内核的文件名和分区名。在菜单模式下,你只需要移动箭头来选择一个菜单然后按下 enter。菜单使用 一个配置文件来说明。

1.2 GRUB 的历史 略

1.3 与以前版本的不同点 GRUB2 是重写 GRUB 后的升级版本。二者有很多相同的特性。但是也有很多地方发生了改变。 1. 新的配置文件名:/boot/grub/grub.cfg 而不是/boot/grub/menu.lst or grub.conf ,配置文件有新的语法。因此不能直接使用 grub1 的配置文件。

2. grub.cfg 由 grub2-mkconfig 命令产生。它方便升级内核版本。 3. 分区编号从 1 开始,而不是 0.

3

4. 配置文件现在是一个完整的脚本语言,它支持:变量,条件,循环。 5. save_env 和 load_env 支持对启动状态的本地保存。

6. GRUB2 拥有更加聪明的算法用来找寻它所需要的文件。使用 search 命令你可以通过卷标或者

UUID 来选择磁盘。

7. GRUB2 支持多找其他类型的系统:PC EFI,PC coreboot,PowerPC,SPARC,MIPS ?.. 8. 支持多种文件系统,不仅仅限于:ext4,HFS+,NTFS 9. GRUB2 可以直接从 LVM 和 RAID 中读取文件。 10. 支持图形终端和菜单系统。

11. GRUB2 交互界面可以被翻译,包括菜单项的名字。 12. 镜像文件,发生变化。

13. GRUB2 有动态加载的模块可用于支持更多的文件系统和其他功能。

2 加载器的作用

引用自 Gordon Matzigkeit,GRUB 爱好者:

大多数人在谈论电脑的时候总是讨论操作系统和内核。因此她们总是说\或者\。 其他多数人认为内核是系统中最重要的部分,因此他们把 GNU OS 称作 Linux 系统。

我个人认为那种看法是非常片面的,因为启动加载器才是所有软件最重要的。我过去常常把以上的系统称 作:\ 和 GRUB 系统

1

可惜的是没人支持我的见解,因此我现在只用 GNU 指代 GRUB。

因此如果你听到有人说 GNU 系统,那你一定要想到那其实是围绕这 GRUB 展开的。

作为 GRUB 的维护者,我们并不支持 Gordon 这种程度的发烧友。但是他的话可以帮助理解 GRUB 的 作用。

2.1 命名规范

GRUB 为用的设备语法相对与以前发生了重要变化。

(fd0)

首先 GRUB 需要设备名称被扩在圆括号内,fd 表示软盘,数字 0 表示编号为 0 的设备(第一个软盘设 备),编号从零开始计数。

(hd0,msdos2)

hd 意思是硬盘,数字 0 代表设备号,意味着是第一块硬盘。Msdos 指出了分区类型,数字 2 代表分区编

号。分区编号从 1 开始计数,而不是 0 。因此 面的代码指定了第一个硬盘的第二个分区为 msdos 格式。 当你选择了分区时 GRUB 会尝试解析文件系统,并从分区中读取资料。

1 LILO , LInux LOader ,一个很多人使用但是很少有人喜欢的加载器。

4

(hd0,msdos5)

这指定了第一个硬盘的第一个扩展分区。由于主分区最多为 4,所以扩展分区从 5 开始编号。

(hd1,msdos1,bsd1)

第 2 块硬盘 的第一个 BSD slice (BSD 使用 slice 管理磁盘,概念类似于主分区)。 想让 GRUB 真实的访问磁盘和分区,你需要在命令行中按照 述语法指定分区。例如:

set root=(fd0)

parttool (hd0,msdos3) hidden-

如果你不知道磁盘中的分区方法,可以使用 grub 的补全功能。只输入

set root=(

然后按下 tab 键,GRUB 会自动显示设备列表,分区名,文件名。

注意 GRUB 不从 SCSI 识别 IDE,它简单的从 0 开始给设备编号,而忽略设备类型。同差 IDE 设备的编 号小于 SCSI 设备。如果你在 BIOS 中改变了 IDE 和 SCSI 的引导顺序,那编号大小就说不准了。 现在考虑一个问题,如何指定一个文件

(hd0,msdos1)/vmlinuz

它在指定分区 指定文件 vmlinuz。依次类推,可以指定任意路径。

3 安装 GRUB

在类 unix 系统中安装 GRUB 请在 root 权限调用 grub2-install 程序。

命令参数比较简单,只需要指定目标磁盘设备文件名。

# grub2-install /dev/hda

在 GNU/hurd 系统下使用这个命令

# grub2-install /dev/hd0

面的两个命令会把 GRUB 镜像放置到/boot 文件夹。如果你希望它把文件放到其他文件夹需要指定

--boot-directory 参数。这里有个创造软盘启动的实例。

# mke2fs /dev/fd0

# mount -t ext2 /dev/fd0 /mnt # mkdir /mnt/boot

# grub2-install --boot-directory=/mnt/boot /dev/fd0 # umount /mnt

有些 BIOS 在使用 USB 设备的第一个分区作为软盘时有 bug。此时把 USB 设备当作硬盘来启动。俗称:

USB-FDD 启动。这种情况下你需要这样安装 GRUB。:

# losetup /dev/loop0 /dev/sdb1 # mount /dev/loop0 /mnt/usb

# grub2-install --boot-directory=/mnt/usb/bugbios --force --allow-floppy /dev/loop0

这个安装方法不和标准方法冲突。因为她们被安装到其他文件夹里。

目前 grub2-install 只是一个 shell 脚本。脚本调用了 grub2-mkimage 和 grub2-setup 。你也可以直接使 用这两个命令。不建议这样做,非常熟悉 grub 者除外。安装引导加载器到正在运行的 OS 中可能导致严 重错误。

5

文件 /etc/default/grub 控制 grub2-mkconfig 的行为。它也是 shell 脚本,所以应该使用 POSIX shell 语法。通常,文件内只是定义了一系列的

shell 变量:

[root@localhost] 0 /etc/grub.d # cat /etc/default/grub GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR=\

GRUB_DEFAULT=saved GRUB_CMDLINE_LINUX=\ KEYTABLE=us quiet rhgb LANG=zh_CN.UTF-8 rd.luks=0\

可用的变量为:

GRUB_DEFAULT

默认菜单项的编号或者标题。编号从 0 开始。变量值为 saved 有特殊含义。当菜单启动时,光标会定位 到变量所指定的菜单项中。当输入等待超时时,自动进入所指定的菜单项。

实例:

假设你有一个菜单项:

menuentry 'Example GNU/Linux distribution' --class gnu-linux { ...

} 使用这个命令设置为默认:

GRUB_DEFAULT='Example GNU/Linux distribution'

GRUB_DEFAULT 值为 saved,那么默认菜单项为 GRUB_SAVEDEFAULT 和 grub2-set-default 或者 grub2-reboot。

默认值为 0

可用的变量:

GRUB_SAVEDEFAULT

如果此选项值为\且 GRUB_DEFAULT =\时,那么手动进入一个菜单项后自动把它设置为下 一次启动时的默认菜单项。

GRUB_DEFAULT =\命令不一定必须 GRUB_SAVEDEFAULT=\ 。也可以和 grub2-set- default 或者 grub2-reboot 命令连用。

GRUB_TIMEOUT

值为一个数值,表示时间秒。显示菜单后,等待键盘输入。如果指定时间内没有键盘操作,那么自动加载

GRUB_DEFAULT 变量所指定的菜单项。默认是 5 。 如果值为 0 那么直接加载默认菜单项而不显示菜单。

如果为-1 那么 永远等待输入,不自动加载。

GRUB_HIDDEN_TIMEOUT

值为一个数值,表示时间秒。在显示菜单之前等待键盘输入,如果指定时间内没有键盘操作,那么自动加载

GRUB_DEFAULT 变量所指定的菜单项。无默认值。

GRUB_HIDDEN_TIMEOUT_QUIET

与 GRUB_HIDDEN_TIMEOUT 连用。如果设置为\ 那么不显示倒计时。无默认值。

`GRUB_DEFAULT_BUTTON' `GRUB_TIMEOUT_BUTTON'

`GRUB_HIDDEN_TIMEOUT_BUTTON' `GRUB_BUTTON_CMOS_ADDRESS'

11

与没有_BUTTON 后缀的变量对应,用来支持电源键。

`GRUB_DISTRIBUTOR'

由 GRUB 的发布者设置,用来鉴别 GRUB。

`GRUB_TERMINAL_INPUT'

选择终端输入设备。变量值可以是用空格隔开的多个设备名。可用的名称依赖与你的硬件平台。可用名包括

console (PC BIOS 和 EFI 控制台),serial (串行终端),ofconsole (open firmware 控制台),at_keyboard ( PC AT 键盘,对 Coreboot 1 也有用),usb_keyboard (使用 HID 启动协议的 USB 键盘)。默认值是当前平

台 的终端输入设备。

`GRUB_TERMINAL_OUTPUT'

选择输出终端。变量值可以是用空格隔开的多个设备名。可用名包括:console (PC BIOS 和 EFI 控制台),

serial (串行终端),gfxterm (图形模式输出),ofconsole (open firmware 控制台),ga_text (VGA 文本模式

输出,对 Coreboot 有用)。默认值是当前平台 的终端输出设备。

GRUB_TERMINAL

如果设置了这个选项,会把`GRUB_TERMINAL_INPUT' 和`GRUB_TERMINAL_OUTPUT' 设置为相同 值。

`GRUB_SERIAL_COMMAND'

这个命令配置串行终端的端口。

`GRUB_CMDLINE_LINUX'

对于 linux 内核添加的命令行参数。

`GRUB_CMDLINE_LINUX_DEFAULT'

除非 GRUB_DISABLE_RECOVERY 设置为 true,否则为每个 linux 内核产生两个菜单项,一个是普通模 式,一个是救援模式。在普通模式下 linux 内核参数会跟 `GRUB_CMDLINE_LINUX' 的值后再跟

GRUB_CMDLINE_LINUX_DEFAULT 的值。

`GRUB_CMDLINE_NETBSD'

`GRUB_CMDLINE_NETBSD_DEFAULT'

类似与 GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUX_DEFAULT,只不过用于 NetBSD.

`GRUB_CMDLINE_XEN'

`GRUB_CMDLINE_XEN_DEFAULT'

类似与 GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUX_DEFAULT,只不过用于 linux 和 xen。

`GRUB_DISABLE_LINUX_UUID'

通常 grub2-mkconfig 使用 root=UUID=XXX 内核参数,用 UUID 表示根文件系统。如果你希望关闭它设 置这个选项值为\

`GRUB_DISABLE_RECOVERY'

如果此选项值为 \那么不自动产生救援模式菜单。

`GRUB_VIDEO_BACKEND'

如果图形卡支持,并且正在使用 gfxterm 图形终端,或者设置了 GRUB_GFXPAYLOAD_LINUX 变量。 纳克 grub2-mkconfig 会加载所有可用的 GREB 图形驱动,然后使用最合适的那个。如果你希望改变这个行

1Coreboot 是一个以 Linux 为基础的开源韧体,它的开发目的在于取代目前市售计算机 都会看到的 BIOS,而

且它可以只在开机时运行特定的程序,从而节省系统资源。

12

为,你可以设置这个变量。在 grub2-install 执行后,可用的图形驱动名被放置到 /boot/grub2/video.ist

`GRUB_GFXMODE'

设置 gfxterm 图形终端的分辨率。如果你的图形卡支持 VBE(VESA BIOS Extensions)你可以使用这个模 式。本地 LCD 面板分辨率可能无效。默认是 640x480

`GRUB_BACKGROUND'

设置 gfxterm 的背景图片。它的值必须是在 GRUB 启动时就能够读取到的文件。类型可以是.png .tga .jpg

.jpeg.(需要载入对应的 png jpg tga 模块)图像会被缩放到匹配屏幕分辨率。

`GRUB_THEME'

设置 gfxterm 图形终端的主题文件。

`GRUB_GFXPAYLOAD_LINUX'

1. 设置为\强制 linux 内核以文本模式启动;

2. \ 保持图形模式,使用 GRUB_GFXMODE , WIDTHxHEIGHT[xDEPTH] 的设置孤行模式相关参

数;

3. 设置为逗号或者分号分割的列表,用来选择图形模式。

根据你的内核、发行版、你的显卡还有概率性问题,使用这个选项可能导致 linux 产生很多显示问题,特别 是在引导早期。如果你启动出了问题,请设置为 text。

`GRUB_DISABLE_OS_PROBER'

通常 grub2-mkconfig 会使用外部程序 os-prober 。这个程序会发现电脑 安装的其他系统。并且产生合适 的菜单项。设置此选项值为 \可以关闭这个选项。

`GRUB_INIT_TUNE'

在 GRUB 启动时同步的在扬声器 播放声音。这对于没有显示器的人有用。选项的值被直接传递到 play 命 令。

`GRUB_BADRAM'

如果开启了这个选项,GRUB 会使用 badram 命令过滤掉错误的内存区域。

`GRUB_PRELOAD_MODULES'

选项值为用空格分割的一系列 GRUB 模块名。这些模块会在 grub.cfg 加载之前加载。

你可以从 grub2-mkconfig 的输出中看到更多信息。你可以修改 /etc/grub.d 目录下的脚本,

/etc/grub.d/40_custom 通常用来添加某些菜单项。你可以把改动写到/etc/grub.d 下的任意的脚本里,通

常使用 40_custom 来添加某些菜单项,请不要修改这个文件内的头两行。

5.2 完整的配置文件

grub.cfg 的文件内容使用 grub 内置的脚本语言。它的语法类似与 bash 。

单词 words

word 定义为一个连续的字符集合。一行字符串被元字符分割成若干 word。元字符是在脚本中有特殊含

义的符号。元字符包括 空格、tab、换行 还有:

{ } | & $ ; < >

双引号和单引号扩住的字符串可以包含元字符。

保留字

13

保留字是在 GRUB 中有特殊含义的 word1。以下 word 被识别为保留字:

! [[ ]] { }

case do done elif else esac fi for function if in menuentry select then time until while

并不是所有保留字目前都有作用,它们中的某些为未来的扩展而保留。

引号

引号用来移除元字符 和保留字 的特殊含义,把它们变成普通字符。 有 3 种引用机制:转义序列,单引号 ,双引号

未被引号扩住的反斜线 \\ 是转义序列,它让下一个字符成为普通字符而不是元字符。它后面也可以直接 是换行字符。

单引号字符串,保持在引号内的所有字符都是普通字符,而不是元字符。字符串中出现单引号需要被转 义。除了单引号和反斜线自身,单引号字符串内不接受其他的转义序列。

双引号字符串,在字符串内可以使用\\ 转义序列,可以使用$ 变量扩展。如果需要 $ \\ \以普通字符出现, 需要将她们转义。反斜线紧接着换行,会当作续行符,它在进行语法解析前会从输入流中删除。例如:

line=\ _line2\

会产生字符串 \ ,续行符只是让脚本格式更好。

变量扩展

美元符号 $ 用来做变量扩展。变量名可以被扩在花括号内,也可以省略。

var=\ pre=\ suf=\

echo \

输出 P_med_ILS,如果你不使用花括号${var}IL,而是使用$varIL,那么系统会扩展搜索名为 varIL 的变量, 由于这个变量不存在因此会被扩展为空。

位置变量代指名为数字的变量。它们用来代指函数输入参数。例如:$1 代表函数第一个参数,$2 代表第 二个参数,等等。。。

$? 用来代指 一个命令的退出状态。

$@ 代指所有的位置变量,扩展成这样:\ $* 代指所有的位置变量,扩展成这样:$1 $2 $3 ... ... $# 代指有效的位置变量的总数。

注释

以 #开始的 word 到行尾都被当作是注释,直接被忽略。#出现在字符串里或者被转义时除外。 简单命令

1word 被识别为保留字,前提是这个 word 没有被引号扩住,且出现在脚本语法可以出现保留字的地方

比如命令的第一个 word,for 语句的第 3 个 word。

14

一个简单命令是指一个 word 序列。其中第一个 word 被当作命令名,剩下的 word 被当作这个命令的参 数。分号可以用来在同一行内分割多个命令。

命令返回值是命令的退出状态。如果保留字 ! 出现在命令前,那么对退出状态进行逻辑否运算。 复杂命令

复杂命令是包括选择 循环在内的流程控制命令,以及函数和菜单命令。

for NAME in WORD ...; do LIST; done

NAME 是任意变量名。WORD 是单词的列表。循环会在列表中迭代,每次循环 NAME 的值为列表中的某 一元素。for 语句的退出状态为最后一个执行的命令的退出状态。如果 WORD 列表为空,那么循环一次也 不执行,退出状态为 0.

if if_LIST; then then_LIST; [elif elif_LIST; then el_then_LIST;] ... [else LIST;] fi

if_LIST 被作为命令来执行,如果命令退出状态为 0(退出状态为 0 表示成功,不为 0 表示失败) 。那么执行 then_LIST 命令,并且跳过其他的 elif 和 else 。否则判断 elif_LIST 条件是否成立如果成立就执行 el_then_LIST,并且跳过其他的 elif 和 else .依次类推如果所有的 elif 条件都不成立那么执行 else LIST。

while COND; do LIST; done until COND; do LIST; done

while 命令,当 COND 命令退出状态为 0 时,反复执行 LIST,直到 COND 退出状态不为 0。 until 命令,当 COND 命令退出状态不为 0 时,反复执行 LIST,直到 COND 退出状态为 0。

function NAME { COMMAND; ... }

定义名为 NAME 的函数。花括号内为一系列命令。函数定义命令不影响$? 。函数定义之后,函数名就是一 个可用的命令名。退出状态为最后一条命令的退出状态。

menuentry TITLE [`--class=class' ...] [`--users=users'] [`--hotkey=key'] { COMMAND; ... }

用来建立菜单项,参见 menuentry 。

内建命令

内建命令用来控制脚本流程。

break [n]

从 for while until 循环中退出。n 代表退出层级。n 必须 >=1 。如果 n 大于循环嵌套层数那么退出所有循环。 break 的退出状态为 0,如果 n 小于 1 那么退出状态非 0.

continue [n]

立刻开始下一轮 for while until 循环,continue n 代表跳转到向外第 n 层循环。n 必须>=1 。如果 n 大于循 环嵌套层数。那么重新开始最外层循环。continue 退出状态为 0,n 小于 1 时退出状态非 0.

return [n]

用在函数体内,导致函数退出状态值为 n。如果 n 省略,那么退出状态为函数体内最后一条函数的退出状态。 如果 return 用在非函数体中,退出状态非 0 。

shift [n]

n 为一非负整数。对于位置变量 $1 $2 ... $n $n+1 ... $n+z 。执行 shift n 后,向左移动 n 位。导致$n+1 移 动到$1 ,$n+2 => $2 ... $n+z => $z . n 默认值为 1. 如果 n 为 0,那么不产生任何变化。如果 n > $# ($# 是 有效的位置变量总数),也不会造成任何变化。如果 n > $# 或者 n<0 那么位置退出状态非 0 ,否则退出状

15

为了得到电源键的完整功能你应该把 GRUB 安装到 MBR 中。如果你的笔记本拥有类似的特性但是没有 出现在 面的列表中,请你指出你的硬件地址并且报告它。 为了得到硬件地址请做以下事情:

1. 使用普通电源键启动 linux。使用 root 权限执行如下命令:

# modprobe nvram

# cat /dev/nvram | xxd > normal_button.txt

文件的输出如下:

2. 使用附加电源键启动 linux。使用 root 权限执行相同的命令:

# modprobe nvram

# cat /dev/nvram | xxd > normal_vendor.txt 并且对比这两个文本文件,找出它们不同点。

在 Dell XPS :第 0x47 字节 :20 --> 28。这实际 意味着这个字节的第 4 位被取反了。第四个位的位 索引为 3 。 0x47 等于十进制 71,在 linux 的 nvram 中,输出剔除了 CMOS 最开始的 14byte,因此真 实的 CMOS 地址为 14+71=85 字节。完整的硬件地址就是: 85:3

10 GRUB 镜像文件

10.1GRUB2 镜像文件列表

GRUB 由若干镜像文件组成。多种类型的引导镜像( boot image ),一个 GRUB 内核镜像(kernel image),一系列模块( GRUB modules )。它们共同组成核心镜像(core image) boot.img

PC BIOS 系统中,这个镜像是 GRUB 第一个运行的。它通常写入到硬盘的主引导记录(MBR),或者分

区的引导区段。由于 PC 引导区段只有 512 byte,所以 boot.img 的大小等于 512 byte

boot.img 的功能是加载 core.img 的第一个区段。由于 512 字节的容量限制所以 boot.img 不能理解文件系统。

在执行 grub2-setup 时,boot.img 内编码了 core.img 第一个区块的硬件地址。

diskboot.img

当从硬盘启动时,核心镜像 core.img 的第一个区块内容为 diskboot.img 。它用来读取剩余的核心镜像,并 且加载 GRUB 内核。diskboot.img 也不能理解文件系统,它内部编码了核心镜像的区块地址列表。

cdboot.img

当从 CD 中启动时,核心镜像 core.img 的第一个区块内容为 cdboot.img。它的功能类似于 diskboot.img

pxeboot.img 26

当使用 PXE 从网络启动时,核心镜像 core.img 的第一个区块内容为 pxeboot.img。它的功能类似于

diskboot.img。

lnkboot.img

lnkboot.img 放在 core.img 的开始,可以让 core.img 类似于 Linux 内核。此时 core.img 可以被其他加载器

作为 linux 内核加载。例如 LILO 使用 image=XXX

kernel.img

GRUB 内核镜像,包含了 GRUB 核心功能,她们是 GRUB 的本质。包括设备的处理,文件的处理,环境变

量,救援模式,和命令行语法解析器 等等。它很少被直接使用,通常都是嵌入到 core.img 中。

core.img

这是 GRUB 加载时 MBR 中的 Boot.img 跳转的文件,此文件内包含了一个 XXboot.img ,和 kernel.img 还有任意数目的模块,也许还有一个配置文件。参考 grub2-mkimage

*.mod

GRUB 的附加功能来自于可动态加载的模块。这些模块可以被嵌入到 core.img 中,以便于在 GRUB 不能访

问文件系统时加载。也可以放在文件系统中在 GRUB 启动后使用 insmod 命令加载。

10.2GRUB legacy 用户

GRUB2 和 GRUB legacy 有很多设计 的不同。GRUB2 可能没有类似某些 GRUB legacy 的镜像。这 里有个简短的列表用来阐述 GRUB legacy 镜像和 GRUB2 镜像的对应关系:

stage1

它的功能类似于 boot.img

*_stage1_5

stage1_5 包含了文件系统代码去从初始文件系统中访问 stage2 . 这个功能类似与 core.img 。但是 core.img

通过组合不同的镜像和模块和配置文件。可以包含更加灵活和复杂的功能。另外 GRUB2 可以从 LVM 和

RAID 中读取文件。GRUB legacy 可以不使用 stage1.5 ,但是 GRUB2 必须使用 core.img

stage2

GRUB2 没有单独的 stage2 镜像。取而代之,GRUB2 在运行时动态载入模块。

stage2_eltorito

在 GRUB2 中,从 CD 引导现在使用,cdboot.img 镜像和 core.img 。确认 core.img 包含 iso9660 模块。你 最好使用 grub2-mkrescue 程序创建镜像。

nbgrub

GRUB2 中没有 nbgrub 的等价物。

pxegrub

在 GRUB2 中使用 pxeboot.img core.img 来完成 PXE 网络启动。core.img 中必须包含 pxe 和 pxecmd 模块。11 文件系统语法和语义

GRUB 使用特殊的语法去表示能够被 BIOS 访问的磁盘驱动器。由于 BIOS 的限制 GRUB 不能区分 IDE,ESDI,SCSI 设备。你必须自己去区分它们。通常如果你查看设备内的文件,或者使用 search 命

27

令,那么设备是很容易区分的。

11.1 如何指定设备

`(DEVICE[,PART-NUM][,BSD-SUBPART-LETTER])'

[]内的东西可以省略。DEVICE 应该是 fd 或者 hd 后面跟 数字,例如 fd0,你也可是使用 16 进制或者 10 进制整数来表示 BIOS 驱动器的代号。因此以下设备是相同的:

(hd0) (0x80) (128)

PART-NUM 代表指定设备 的分区号。主分区从 1 开始,扩展分区从 5 开始。BSD-SUBPAT- LETTER 代表 BSD 子分区的卷标。例如 a 或者 e。表示 bsd 分区的简单写法是:`(DEVICE,BSD- SUBPART-LETTER)' 在这种情况下,GRUB 搜索第一个包含 BSD 卷标的分区,然后在这个分区中搜

索指定的子分区卷标。

(hd0,a)

(hd0) 代表使用整个磁盘(当安装 GRUB 时代表使用它的 MBR)。(hd0,1) 代表指定磁盘 的第一个分区

(当安装 GRUB 时代表使用此分区的引导区块)。

如果你开启了网络支持,可以使用特殊 的(pxe) 设备。 在使用网络驱动器之前你需要初始化网络。 如果你从 CD 中引导 GRUB,那么可以使用特殊 的 (cd) 设备。

11.2 指定文件路径

有两种方式指定文件。一种是使用绝对路径,另一种是使用问区块列表。

绝对路径使用 Unix 文件名语法,使用 / 分割目录。例如: (hd0,1)/boot/grub2/grub.cfg 。它意味着在 第一块硬盘的第一个分区中搜索文件/boot/grub2/grub.cfg。如果路径中不包含设备文件:/boot/grub2/

grub.cfg 。那么它会自动使用 set root 所设定的根设备作为目标分区。

set root=(hd1,1)

/boot/kernel 代表了(hd1,1)/boot/kernel

11.3 指定区块列表

区块列表用在 GRUB 不能处理文件系统时。语法是:

`[OFFSET]+LENGTH[,[OFFSET]+LENGTH]...'。

这里有个例子:

`0+100,200+1,300+300'

它代表从 0 区块开始读取 100 字节,再从 200 区块开始读取 1 字节,从 300 区块开始读取 300 字节。如 果你省略了 offset 那么默认为 0. 如果区块列表没有指定设备,那么自动使用根设备。

区块列表:(hd0,2)+1 ,等价于 set root=(hd0,2) 时; 的 \

28

12 GRUB 交互界面

GRUB 有两种交互方式,菜单交互和命令行交互。当 GRUB 启动时 GRUB 会搜索它的配置文件。如果

发现了配置文件,那么会激活菜单界面,并且显示配置文件中定义的菜单项。如果没有找到配置文件, 或者你在菜单界面中选择了\ command-line \ ,那么进入命令行模式。

12.1命令行界面

类似于 Unix 和 DOS 命令行界面会显示命令提示符然后等待输入。在按下 enter 后,命令行中的命令立 刻执行。除了在命令行中运行命令,所有命令都可以在配置文件中运行。 光标的移动快捷键类似于 bash

向右移动一个字符。

向左移动一个字符

移动到当前行的第一个字符

移动到当前行的最后一个字符

删除光标下的一个字符

删除光标左端的一个字符

删除从光标到行尾所有字符

删除从光标到行开始所有字符

粘帖删除的文本到光标缓冲区。

29

向 查阅历史记录

向下查阅历史记录

处在命令行交互下,可以使用 tab 进行命令补全。当光标在第一个 word 里面或者前面的时候按下 tab 或 者 会显示当前可用的命令列表。如果光标在第一个 word 后面,tab 会根据 下文进行补全:设 备名、分区 和文件绝对路径和文件名。提示:如果想获得可用设备的列表,先输一个左圆括号 ( ,然后按 下 tab 。

注意,当处在 TFTP 文件系统时无法使用补全。因为 TFTP 的安全机制不支持文件名列表的获取。

12.2菜单界面

菜单界面很容易使用。它会在屏幕 显示容易理解的标题和菜单项。当然菜单项需要通过配置文件定义。

一般来说菜单交互界面会提供一个由配置文件定义的引导项目的列表。

当你选择了这个项目时:

??????

按下 enter 就能运行这个菜单项所对应的命令,通常这些命令用于 boot 一个 OS。如果你的项目 被密码保护,那么执行命令之前你需要输入密码。

按下 c ,会进入命令行模式,显示命令提示符并且等待输入。此时按下 可以退回菜单模式。 按下 e ,会显示当前菜单项对应的命令,并且可以修改这些命令。修改完成后按下 就可 以执行修改以后的代码。修改是临时的,下一次启动又恢复到未修改状态。

??????

按下 p,输入对应项目的密码。

12.3编辑菜单项

菜单项编辑器类似于一个菜单交互界面。但是每一行显示一条命令。在编辑器中按下 会放弃修改 回到菜单界面。使用 添加新行。修改完成后按下 就可以执行修改以后的代码。修改是 临时的,下一次启动又恢复到未修改状态。

???

在编辑器中按下 ,会丢弃所有修改,返回到菜单但状态。

,会在当前行后面添加一个新行。

???在编辑器中按下

???在编辑器中按下 ,执行修改过后的条目。 GRUB 不支持单步撤销。你只能丢弃所有修改然后重新编辑。

13 GRUB 环境变量

30

GRUB 支持环境变量,定义和使用变量,类似与 Unix-like OS 的 Shell 。环境变量有个名字,和一个

值,值可以是任意字符串。你可以使用 set XX=value 定义变量,也可以使用 unset XX 删除变量。使用

$XX 或者${XX} 读取变量。

某些特殊名称的环境变量对 GRUB 有特殊意义,请勿随意修改。其他名称的环境变量可以随意使用。

13.1特 环境变量

13.1.1 biosnum

当链式加载时,GRUB 需要知道根设备的 BIOS 驱动器号。如果 BISONUM 变量正确设置,GRUB 就 不需要猜测驱动器号了。它会改变 BIOS 驱动器在链式加载系统中的映射关系。

13.1.2 chosen

当执行菜单项时,GRUB 自动设置 CHOSEN 变量为当前菜单项标题。如果当前在单项是某个菜单的子 菜单,那么 CHOSEN 会包含它的父菜单标题,各个父菜单之间使用 > 分割 。例如 :

\表示当前菜单标题是 fedora_16,它的 级菜单是 fedora,更 级菜单是other。依此类推。

13.1.3 color_highlight

这个选项包含了终端的高亮显示的前景色和背景色的设定,她们之间使用斜线 / 分割。改变这个选项可 以改变默认的基本色彩。默认值是:\black/white\

13.1.4 color_normal

这个变量包含了普通显示时的前景和背景色。由斜线分割。默认是:\white/black\

色彩必须是以下之一:

black blue green cyan red magenta brown yellow white light-gray drak-gray

light-blue light-green light-cyan light-red light-magenta

13.1.5 debug

开启这个变量可以从 GRUB 的各个组件会输出调试信息。变量的值是调试选项,它们之间使用空格或者 逗号分割。使用 all 表示开启所有调试选项。

13.1.6 default

变量值可以设置为某个菜单项的标题或者索引。如果设置了这个选项,那么它所指定的菜单项默认被选

31

中。并且作为自动加载菜单项。

如果某个菜单项含有子菜单那么它必须使用 > 分割各个 级菜单:

Submenu 1

Menu Entry 1 Menu Entry 2 Submenu 2

Submenu 3

Menu Entry 3 Menu Entry 4 Menu Entry 5

如果你想选中 Menu Entry 3 那么应该使用:

set default=\

这个变量通常使用 GRUB_DEFAULT 变量间接设置。

13.1.7 fallback

类似于 default ,这个选项用来指定一个菜单项。当 default 菜单项加载失败的时候,会加载 fallback 的 菜单项。值的格式同 default 选项。

13.1.8 gfxmode

它设置 gfxterm 图形终端的分辨率。你只能在你的显卡通过 VESA BIOS Extensions 支持图形终端的时 候才能使用它。例如:LCD 面板的分辨率可能不能使用这个变量控制。默认值是\auto\。

变量值可以通过逗号或者分号指定多个。GRUB 会依次尝试这些分辨率。分别率的格式应该是:

WIDTHxHIEGHT 或者 WIDTHxHEIGHTxDEPTH

13.1.9 gfxpayload

这个变量设置后控制 linux 内核启动后的显示方式。它用来替换 vga= 内核参数。可以设置为:\text\ 强 制 linux 以文本模式启动, \keep\ 使用 gfxmode 变量的设置。或者所有被 gfxmode 接受的值。

根据你的内核、发行版、显卡和一些不确定因素,使用这个选项可能导致 GNU/linux 发生显示问题。此 时应该设置为 \text\ 。

这个选项的默认值因平台而异。在 PC BIOS 效的图形模式。

这个选项通常使用 GRUB_GFXPAYLOAD_LINUX 变量设置。

默认值为 \ ,其他情况可能是 \auto\ 或者是某个有

13.1.10 gfxterm_font

设置 gfxterm 图形终端的默认字体。

32

13.1.11 icondir

13.1.12 lang

为 \ 。

这个选项设置 GRUB 搜索图标使用的路径。

这个选项设置 gettext 命令使用的语言编码,它用来翻译字符串 。 通常法语应该设为 \ ,简体中文设

grub2-mkconfig 程序会根据当前 OS 的语言设置自动设置这个变量。

13.1.13 locale_dir

是关闭的。

这个变量设置翻译文件所在路径 。通常是 /boot/grub2/locale 。如果没有设置此变量,那么国际化选项

13.1.14 menu_color_highlight

color_highlight 变量。

这个变量包含被选中的菜单项文本的前景色和背景色。使用 / 分割前景色和背景色,默认值等于

13.1.15 menu_color_normal

这个变量设置未选中菜单项的前景色和背景色。使用 / 分割前景和背景。默认值等于 color_normal 变量。

在这张例图中,Windows Xp 是被选择的菜单项,因此它按照默认的 menu_color_highlight 高亮显示。而 面的 Fedora linux 则是未被选择的菜单项使用 menu_color_normal 显示。

底黑字

33

13.1.16 net_*

net_pxe_boot_file net_pxe_domain

net_pxe_dhcp_server_name net_pxe_extensionspath

net_pxe_hostname net_pxe_ip

net_pxe_extensionspath net_pxe_hostname net_pxe_mac pxe_blksize pxe_default_server

以 变量的解释参考: 网络启动 24

net_pxe_rootpath pxe_default_gatway

13.1.17 pager

13.1.18 prefix

如果设置为 1 那么每当输出充满屏幕时自动暂停,按下任意键后继续查看下一页。默认是不暂停。

设置 grub 模块和配置文件的路径。通常是 \$root/boot/grub2\ 。它通常由 grub2-install 在安装 grub 时 就写在内嵌的配置文件内。grub2-mkrescue 创建的可引导光盘也已经自动设置 root 和 prefix,用户配 置文件内无需设置 prefix 的值。GRUB 模块会根据 prefix 加载,所以它必须正确设置。否则就会提示

error: file not found 。

13.1.19 root

设置 GRUB 根设备。任何路径中没有指定设备的,都会使用根设备作为默认分区。这个变量应该在

GRUB 启动时由配置文件决定。

例如,如果 GRUB 安装到第一块硬盘的第一个分区,那么 root 应该设为 (hd0,1) ;prefix 应该为

\

13.1.20 superusers

13.1.21 theme

这个变量设置一个超级用户列表。参考:权限管理 50

这个变量为包含 GRUB 图形菜单主题的路径。 通常使用变量:GRUB_THEME 设置。

34

13.1.22

timeout 它指定自动加载倒计时时限,单位为秒。GRUB 成功加载菜单配置文件后就立刻开始倒计时,如果在这 段时间内没有任何键盘操作那么加载默认菜单项。如果 unset 这个变量或者设为 -1 那么不自动加载默认

菜单项。

这个变量通常使用 GRUB_TIMEOUT 或者 GRUB_HIDDEN_TIMEOUT 变量设置。

13.2GRUB 环境区块

这个功能用来在一次引导时记录下一些信息,下一次启动 GRUB 可以读取这些信息。假设你希望默认菜 单项为最后一次使用的那个。你就需要使用这个。由于空间限制,为了节省代码量同时也是为了防止文 件系统崩溃,GRUB 不能写入文件。因此 GRUB 不能创建或者修改自己的配置文件。因此 GRUB 提供 了环境区块的功能,它用来记录 GRUB 当前的状态,便于日后加载。

环境区块是一个 1024byte 的文件,它通常命名为 /boot/grub2/grubenv 。在 GRUB 中可以使用 load_ env 命令加载它,使用 save_env 写入当前 GRUB 环境变量到区块中。在 OS 中,可以使用 grub2- editenv 程序编辑区块文件。

由于安全问题,这个功能只能应用在普通磁盘(非 LVM 和 RAID ),不使用文件系统校检 (非 ZFS ) ,使用 BIOS 或者 EFI( 非 ATA, USB 或者 IEEE1275 ) 的平台 。

GRUB_SAVEDEFAULT 变量就是使用环境区块完成自己的功能。

14 命令列表

这一章里我们列举所有 GRUB 中的命令。命令被分割到不同的組。有一些只能被永在配置文件和菜单的 全局区域。大部分命令可以出现在任意位置,既可以使用 GRUB 命令行执行,也可以通过配置文件运行。

在救援模式下只有 insmod 、ls、set 和 unset 命令可用。如果你不知道在救援模式下应该干些什么。参 考《GRUB 救援 shell 》

14.1只用于菜单的命令

配置文件的语法遵守以下规则:

???

文件必须是纯文本

??? # 开始的行作为注释行

???选项之间使用空格隔开

???

所有的数字都可以是十进制或者是 16 进制(前缀 0x 或者 0X)。

35

,\\n 会被当作换行。

14.3.7

语法:

chainloader

chainloader [--force] file

链式加载指定文件。通常 file 使用区块列表指定,例如:

chainloader (hd0,msdos1)+1

如果指定了--force 那么强行加载,而不去检查文件是否有正确的标记。这个通常用于加载其他有缺陷的 加载器,例如 SCO UnixWare 7.1。

14.3.8

语法:

cmp

cpm file1 file2

比较文件 file1 和 file2 。如果二者大小不同那么显示:

Differ in size: 0x1234 [foo], 0x4321 [bar]

如果二者大小相同但是某些字节不同,那么会显示那个字节的地址:

Differ at the offset 777: 0xbe [foo], 0xef [bar]

如果两个文件完全相同那么不显示任何东西。

14.3.9 configfile

configfile file

加载一个配置文件。如果 FILE 内包含了菜单定义,那么在加载完毕后立刻进入菜单显示模式。

14.3.10 cpuid

语法:

cpuid [-l]

检查 CPU 特性,这个命令只用于 x86 cpu。当使用了 -l 选项 如果 CPU 支持 long 模式 (64bit),那么返 回 true。

如果没有包含-l 选项,此命令的行为类似与 -l 选项。会在随后的 GRUB 版本中升级它。

14.3.11 crc

语法:

crc FILE

显示文件 FILE 的 CRC32 校检和。

41

14.3.12 date

语法:

date [[year-]month-day] [hour:minute[:second]]

如果没有任何参数那么显示当前的日期和时间。

其他情况下会修改当前时间或者日期。但是只改动指定参数,其他的保持不变。例如:

date 01-01

会改变月和日,但是年和 时分秒 都保持不变。

14.3.13 drivemap

语法:

drivemap `-l'|`-r'|[`-s'] from_drive to_drive

没有使用任何选项那么映射 from_drive 到 to_drive 。某些 OS 不能从非第一块硬盘 引导,此时你需 要这个命令去把第二块硬盘映射成第一块。命令会忽略路径中的非设备的部分。因此你可以放心的使用

$root 或者 $prefix 。

-s 选项,交换映射。把 from_drive 映射成 to_drive 同时把 to_drive 映射成 from_drive ,也就是两个

设备调换。

-l 选项,显示当前的映射。 -r 选项,重置所有的映射到默认状态。

实例:

drivemap -s (hd0) (hd1)

他会调换第一块和第二块硬盘。

14.3.14 echo

语法:

echo [-n] [-e] string ...

显示指定的文本,并且在行尾添加换行。如果使用了-n 不添加换行。如果有多个 word 传入那么各个字 符串之间使用空格分割(类似于 shell 中的命令参数分割)。当然双引号字符串可以使用变量扩展。

echo \

显示当前的根设备

-e 选项,解析字符串中的转义序列。

`\\\\' 反斜线 `\\a' 警告音 `\\c' 静止添加换行 `\\f' 进纸符

42

`\\n' 换行符

`\\r' 回车符 `\\t' 横向制表符 `\\v' 竖直制表符

14.3.15 export

语法:

export envvar

导出变量 ENVVAR,被导出的变量会自动在 configfile 命令加载的子脚本中定义。

14.3.16 false

语法:

false

这个命令不做任何事情,只是退出状态非 0 。 它可以在流程控制语句中使用。

14.3.17 gettext

语法:

gettext string

翻译 string 到当前语言。

当前语言编码在 GRUB lang 环境变量。翻译文件从 locale_dir 指定的目录中搜索 MO 文件。

14.3.18 gptsync

语法:

gptsync device [partition[+/-[type]]] ...

使用 GUID 分区表的磁盘也支持传统的 MBR 分区表称作 legacy MBR。legacy MBR 只是 GPT 的一个 子集。

这个命令在指定设备的指定分区 添加一个 legacy MBR。TYPE 是 MBR 分区的类型代码。可以是 10 进制也可以是 16 进制(前缀 0x)。在 PARTITION 和 TYPE 之间如果是+号代表此分区激活,- 代表此分 区非激活。只有一个分区可以处在激活状态。如果 + - 和 TYPE 都省略了,那么此分区设置为非激活。

14.3.19 halt

语法:

halt `--no-apm'

这个命令关闭计算机,然后关闭电源。如果使用了 --no-apm 那么关闭计算机后不使用 BISO 的 APM 关闭电源。

43

14.3.20 help

语法:

help [pattern]

显示关于匹配指定模式的命令名的详细帮助文件。如果省略 pattern 你会看到所有的命令简短的列表。

14.3.21 initrd

initrd FILE

为已经加载的 linux 内核,加载 initrd,并且设置 linux 内核内存中的参数。这个选项必须在 linux 命令 之后使用。

14.3.22 initrd16

inttrd16 FILE

在 16bit 模式下加载 initrd,这个命令必须在 linux16 命令后面使用。

14.3.23 insmod

insmod MODULE

动态加载名为 MODULE 的 GRUB 模块。不要跟后缀:

insmod fat #正确 insmod fat.mod #错误

14.3.24 keystatus

特殊控制键很有用。

keystatus [--shift] [--ctrl] [--alt]

如果 Shift 或者 alt 或者 ctrl 按键处在按下状态,那么退出状态为 0,否则为 1。这个功能对在脚本中使用

这个功能只在某些平台 支持。如果 keystatus 不使用任何选项,在支持 keystatus 的平台 退出状态为

0 否则为 1 。

14.3.25 linux

linux FILE .. ...

以 32bit 模式加载 linux 内核 FILE。命令行中剩下的参数都会被作为内核参数传递给内核。注意,每次 使用 linux 命令后,都必须重新加载 initrd。

在 x86 系统 ,内核必须使用 32bit 引导协议。这意味着 vga= 选项无效。如果你希望设置显示模式,你 需要使用 set gfxpayload=1024x768 或者 set gfxpayload=\ 。通常 GRUB 发现 vga 命令行参数 时会自动设置 gfxpayload 。linux16 命令可以没有这个限制。

44

14.3.26 linux16 16bit 模式下加载 linux 内核。命令行中剩下的参数都会被作为内核参数传递给内核。注意,每次使用 linux16 命令后,都必须重新使用 initrd16 命令。

内核会使用传统的 16bit 引导协议。它不会导致 vga 内核参数无效。也可以用来加载其他的类 linux 内核 的镜像程序。

这个命令只用于 x86 平台。

14.3.27

list_env list_env [-f FILE]

显示环境区块文件中的变量。如果使用了 -f FILE ,那么显示指定区块文件中的变量。

14.3.28

load_env load_env [-f FILE]

从环境区块文件中载入变量,如果使用了 -f FILE ,那么载入指定区块文件中的变量。

14.3.29 loopback loopback [-d] DEVICE FILE

把镜像文件 FILE 挂载到设备名 DEVICE

。以实现对镜像文件内容的访问。

实例:

loopback loop0

/WinPE.iso ls (loop0)/ 这个命令也可以在 iso 文件中读取文件。

实例,硬盘安装 Fedora-16-i386-DVD.iso:

假设文件放置在 winxp 下 F 盘根目录,设备号为 (hd0,msdos7):

loopback fedora /Fedora-16-i386-DVD.iso set root='(fedora)'

linux /isolinux/vmlinuz initrd /isolinux/initrd.img boot

但是 loopback 和磁盘仿真暂时不是一个东西。所以你不能 chainloader (loop0)+1

若需要引导 img 或者 iso ,你需要使用 memdisk,参见 前言->准备 memdisk 1

14.3.30 ls ls [arg ...]

类似与 linux ls 命令,显示设备或者文件。

无参数时显示所有 GRUB 已知的设备。

45

如果参数是一个设备名那么显示指定设备的属性,如果是个绝对目录那么显示目录内容:

loopback fd0 /Ghost82.img ls (fd0) ls (fd0)/

14.3.31 normal

normal [FILE]

进入 normal 模式,并且加载配置文件,然后显示 GRUB 菜单。

如果指定了配置文件 FILE 那么加载指定配置文件,否则加载 $prefix/grub.cfg 配置文件。 在 normal 模式,命令、文件系统模块 和加密模块都已经自动加载,并且拥有完整的语法解析器。其他 的模块可以在配置文件中使用 insmod 命令加载。

normal 命令可以嵌套执行。即在 normal 模式下依然可以调用 normal 。它类似于 configfile 命令。

14.3.32 normal_exit

normal_exit

退出当前的 normal 模式。如果当前是最后一个 normal 模式,那么退回到命令行救援模式。

14.3.33 parttool

对分区表进行操作。

parttool PART COMMANDS

COMMAND 以如下格式出现

CMD=VALUE 设置某个属性值 或者

CMD+ CMD-表示开启或关闭某个分区属性,+-和 CMD 之间不能有空格。

目前 parttool 命令对使用 DOS 分区表,MBR 分区表的用户有用。

boot

当开启它激活选中分区(被激活的分区是可引导的),并且取消所有其他分区的激活状态。只能够对主分区 这么做。

parttool (hd0,1) boot+ parttool (hd0,1) boot-

46

type

改变分区类型,分区类型由一个介于 0x00 ~ 0xFF 的数指定:type=0x80

hidden

当开启这个选项,设置指定分区在分区表中的隐藏位。当关闭这个选项开启隐藏位。这对于 DOS Windos 系统和多个 Fat 格式的主分区同时存在的时候有意义。

14.3.34 password

password USER clear-password

定义一个用户 USER,并且用明文指定他的密码。

password father hello password mother boy

这个命令添加了两个用户,并且分别指定它的密码为 hello 和 boy。参考:权限管理 50

14.3.35 password_pbkdf2

password_pbkdf2 USER hashed-PASSWORD

定义一个用户 USER,并且用散列后的密文指定他的密码。调用 grub2-mkpasswd-pbkdf2 计算密文的 散列。参考:权限管理 50

14.3.36 play

play file | tempo [pitch1 duration1] [pitch2 duration2] ...

tempo 是所有 duration 的单位,设置为 60 代表基于 1 秒,120 代表基于半秒。 pitch 代表声音的频率,

设置为 0 表示声音衰减。duration 代表声音持续的时间。

实例:

play 60 100 2 200 3 300 1

以 命令播放 100Hz 的声音持续 2 秒,200Hz 持续 3 秒 ,300Hz 持续 1 秒。

play 120 100 2 200 3 300 1

以 命令播放 100Hz 的声音持续 1 秒,200Hz 持续 1.5 秒 ,300Hz 持续 0.5 秒。

如果参数是一个文件名,那么播放指定文件内的音频数据。文件是二进制格式,第一个 32bit 被作为无符 号 32bit 小端序数字读取它作为 tempo 使用。然后随后每个 32bit 被当作两个 16bit 无符号小端序数字, 分别作为 pitch 和 duration 使用。

14.3.37 pxe_unload

pxe_unload

卸载 PXE 环境,此命令只在 PC BIOS 平台有效。

14.3.38 read

read [var]

等待用户输入,按下 enter 后,输入的行不包括换行符被保存到名为 var 的变量中。

47

14.3.39 reboot

重启电脑。

14.3.40 save_env

14.3.41 search

save_env [-f file] var ...

把指定的变量保存到区块文件中,如果指定了 -f file 那么保存到 file 文件中(file 必须是环境区块文件)。

search [--file FILE ] [--label LABEL] [--fs-uuid UUID ] [--set [var] ] [--no-floppy]

--file FILE 选项,那么在所有设备里搜索文件 FILE 。 --label LABEL 选项,搜索卷标为 LABEL 的设备。 --fs-uuid UUID 选项,查询指定 UUID 的设备。

如果指定--set var,那么在搜索成功后设置 var (var 可以是任意变量名)的值为目标设备名。 实例:

加载 Win Xp 的命令:

insmod ntfs insmod fat

search --file /ntldr --set root chainloader +1 boot

面的 search 命令 搜索 /ntldr 文件,并且把找到的第一个包含这个文件的设备设为根设备。

search.file search.fs_label 和 search.fs_uuid 是 search --file ,search --label ,search --fs-uuid 的简写。

14.3.42 sendkey

sendkey [--num|--caps|--scroll|--insert| --pause|--left-shift|--right-shift|

--sysrq|--numkey|--capskey|--scrollkey| --insertkey|--left-alt|--right-alt|

--left-ctrl|--right-ctrl on|off]... [no-led] keystroke

发送指定的按键序列到键盘缓冲区。某些 OS 或者加载器需要特殊的键盘操作,例如 进入安全模式 。使 用 sendkey 可以由 GRUB 发送按键给被引导的文件,可以避免用户操作。

你最多可以提供 16 个按键,因为 BIOS 的键盘缓冲就这么大。按键名可以是大写或者小写单个字母, 单个数字。特殊符号由下表中的符号名提供:

48

名称 含义 名称 含义 escape Escape delete Delete exclam ! insert Insert

at

@ pgdown Page Down numbersign # pgup Page Up dollar $ down 下方向键 percent % up 上方向键 caret

^ left 左方向键 ampersand & right 右方向键 asterisk * colon :

parenleft ( quote

' 单引号 parenright ) doublequote \双引号 minus - tilde ~ 波浪线

underscore _ shift

按下并且释放 左Shift equal = backslash \\ plus

+ bar | backspace 退格 comma , tab tab键 less < bracketleft [ period . 小数点 braceleft { greater > bracketright ] slash / braceright } question ?

enter Enter键

rshift

按下并且释放右Shift control 按下并且释放Control alt 按下并且释放Alt semicolon ; space

空格键

capslock 大写锁定键

F1 F1 F7 F7

F2 F2 F8 F8 F3 F3 F9 F9 F4 F4 F10 F10 F5 F5 F11 F11 F6

F6 F12

F12

名称

含义 名称 含义 num1 1 (数字键盘) numend End (数字键盘) num2 2 (数字键盘) numdown 下方向键(数字键盘) num3 3 (数字键盘) numpgdown 向下翻页(数字键盘) num4

4 (数字键盘)

numleft

左方向键(数字键盘)

Num Lock关闭时的 数 num5 5 (数字键盘) numcenter 字键盘5

num6 6 (数字键盘) numright 右方向键(数字键盘) num7 7 (数字键盘) numhome home键(数字键盘) num8 8 (数字键盘) numup 上方向键(数字键盘) num9 9 (数字键盘) numpgup Page Up (数字键盘) num0 0 (数字键盘) numinsert Insert (数字键盘) numperiod

. (数字键盘) numdelete

Delete (数字键盘)

numasterisk * (数字键盘) numminus

- (数字键盘) numplus + (数字键盘) numslash / (数字键盘) numenter

Enter (数字键盘)

49

sendkey 命令支持多种选项,它们影响 BIOS 的键盘状态字节。接受 on 或 off 参数,用来开或者关掉

对应的状态位。提供选项但是省略参数,不对状态位产生影响。 --num --caps --scroll --insert 选项, 虚拟开启对应的键盘模式。 --numkey --cpaskey --scrollkey --insertkey 分别仿真对应的键保持按下的 状态。其他的状态标记和选项的字面含义相同。

--no-led 选项,在改变其他选项的状态位时不改变键盘 LED 灯。

如果多次执行 sendkey 命令,那么只有最后一次有效。由于 sendkey 会改变 BIOS 键盘缓冲区,在某些 系统下会导致挂起、重启、其他意外行为。如果 OS 或者加载器使用自己的驱动程序控制键盘,那么

sendkey 不会发生作用。

14.3.43 set

set [envvar=value]

设置环境变量 envvar 的值为 value。envvar 可以是任何变量名。如果没有指定参数,那么显示当前的环 境变量和它们的值。

14.3.44 true

命令退出状态为 0,不做任何事情。它用于流程控制。

14.3.45 unset

unset envvar

从内存中删除 envvar 变量。envvar 可以是任何有效的变量名。

14.3.46 uppermem

GRUB2 中暂未实现,它正在计划之中。

15 权限管理

通常加载器允许任何人从终端进行物理访问。任何能够碰到电脑的人都可以操作加载器的交互界面。默 认时没有强制要求权限管理是因为大部分能够直接接触你电脑硬件的人除了通过使用加载器访问电脑以 外,可以通过很多其他手段(比如使用一个 USB 启动盘)控制电脑。因此这种防护很脆弱。但是对于某 些特殊平台,对启动某些 OS 进行权限控制是很有意义的。

password 和 password_pbkdf2 命令用来定义一个用户和它的密码。前者使用明文将用户名和明文密码

50

本文来源:https://www.bwwdw.com/article/dp98.html

Top