admin 管理员组文章数量: 1184232
2024年2月23日发(作者:jspcms项目怎么启动)
GNU GRUB 中文手册
修订次数:1
不保证含义准确仅供参考。若发现有谬误之处可发送邮件到:***********************
邮件主题必须以 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 。
•从 /wiki/Linux_Downloads 下载 VirtualBox 4.2.2 。我选择
的是 All distributions 。 80M 左右的体积。
•新建一个虚拟机,操作简单直接下一步下一步。设置为使用 128M 内存,使用虚拟硬盘文
件,512M 硬盘。显存 23M 。不要启动虚拟机,完成下面的步骤。
2. 准备
memdisk
•使用 syslinux 是因为实验中的实例需要 memdisk,它是包括在 syslinux 中的。可以用来
加载一些 Win 下的 img 镜像,比如: 读者可到网 下载这
两个文件。
•从 ftp:///pub/linux/utils/boot/syslinux/ 下载 它是
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 下建立配置文件 内容如下:
set root="(cd)"
menuentry '' {
linux16 /boot/memdisk
initrd16 /
}
menuentry '' {
linux16 /boot/memdisk
initrd16 /
}
menuentry '' {
linux16 /boot/memdisk iso
initrd16 /
#你需要自己准备一个 Win iso,使用 memdisk 在虚拟机中加载 ISO 需要等待较长时间。而且需要大量内
存。我们最初设置的 128M 不够用。所以正文没有提及。
}
set timeout=-1
• 复制 到~/iso ;复制 ~/syslinux-4.05/memdisk/memdisk 到
~/iso/boot/;复制所有 GRUB2 模块到~/iso/boot/grub2 。GRUB2 模块在 i386
/usr/lib/grub2/i386-pc/ 。
应该在:
4. 创建 ,这个文件将用虚拟机加载。
• 在主目录下执行命令:grub2-mkrescue -o iso
因为当前处在主目录下,命令中的 iso 就指向 ~/iso 目录。创建的 光盘,包含:
~/iso/* 下的所有文件,并且包含有 GUB2 启动区块。这个 iso 可以写入 CD。如果希望写入 U
盘需要使用 grub2-install 命令。
5. 在虚拟机的镜像列表中添加 ,然后启动虚拟机。
当你修改了 iso/boot/grub/ 配置文件,重新执行第四步,然后重启虚拟机就看以看到
改变。
2
如果你没有出错且幸运的话,虚拟机 应该能够得到 图。尝试前两个选项,她们应该能够正确运行。
1.1 概论
简而言之:grub 是一个引导加载器,即计算机系统启动时第一个运行的程序。它是为了加载操作系统和
转移控制权给操作系统内核。内核再继续启动完整的操作系统。
GNU GRUB 是一个非常强大的引导加载器,它可以加载种类繁多的操作系统。还支持链式加载"chain-
loading" 。
GRUB 最大的特性就是可扩展性。GRUB 支持文件系统和内核可执行格式,因此你可以用很多方式加载
你的 OS,而不用记录下 OS 在磁盘 的物理地址。比如使用分区名,路径和文件名指定文件。
当 GRUB 加载系统时,可以使用命令行交互模式,也可以使用菜单选择模式。使用命令行模式你需要指
定内核的文件名和分区名。在菜单模式下,你只需要移动箭头来选择一个菜单然后按下 enter。菜单使用
一个配置文件来说明。
1.2 GRUB 的历史
略
1.3 与以前版本的不同点
GRUB2 是重写 GRUB 后的升级版本。二者有很多相同的特性。但是也有很多地方发生了改变。
1. 新的配置文件名:/boot/grub/ 而不是/boot/grub/ or ,配置文件有新的语法。因此不能直接使用 grub1 的配置文件。
2. 由 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/linux" 或者"GNU/Hurd" 。
其他多数人认为内核是系统中最重要的部分,因此他们把 GNU OS 称作 Linux 系统。
我个人认为那种看法是非常片面的,因为启动加载器才是所有软件最重要的。我过去常常把以上的系统称
作:"LILO" 和 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
3.1 创建 GRUB 引导的 CD-ROM
GRUB 支持 El Torito
1非仿真模式。这也意味着你可以直接从 cd-rom 中使用 GRUB 启动,而不需要创
建启动软盘和硬盘镜像(它们可能导致启动失败)。
CD-ROM 启动 GRUB 使用一个称作 的镜像。此镜像被 包含 。 镜像也
必须包含 iso9660 和 biosdisk 模块。CD-ROM 启动也需要包含 和 相关 grub 模块。
创建一个简单通用的 GRUB 救援光盘,你需要使用 grub2-mkrescue 程序:
# grub2-mkrescue -o
你还需要在 iso 中包括其他的有用的文件。只需要在 iso 文件夹内放置你需要的文件即可。
# mkdir iso
# mkdir -p iso/boot/grub
你也许需要在 boot/grub 文件 下包含 用来提供启动菜单。把其他所有你需要的文件复制到 iso 文
件 里面,你可以随意创建目录结构。
最后使用命令:
# grub2-mkrescue -o iso
它会产生名为 的文件。它可以直接刻录到 CD 或者 DVD 光碟内。
根设备在进入 之前自动设置,你可以在 脚本中直接引用文件的路径,不需要指定设备
名。自动设置 root 设备,可以工作在光驱和 USB 储存设备。
实际 很多盗版系统光碟的启动菜单就是使用 grub 的。
El Torito 是可引导 CD 的技术标准,它用于 BIOS。
3.2 映射 BIOS 设备和 OS 设备
grub2-mkdevicemap 程序用来创建设备映射文件。它通常由某些工具在没有找到设备映射文件时自动
调用,例如 grub2-install。默认设备映射文件在/boot/grub2/
如果设备映射文件存在,GRUB 工具集读取它并且映射 BIOS 驱动器到 OS 设备。这个文件内容如下:
# this device map was generated by anaconda
#DEVICE FILE
(hd0) /dev/sda
(hd0,3) /dev/sda3
DEVICE 是 grub 语法表示的磁盘设备,FILE 是操作系统的设备文件。
映射文件的作用是:GRUB 在配置文件中使用的设备名指代的设备 (hd0) 是根据 BIOS 的设备号得到的。
如果 BIOS 设置变化而发生变化。如果你在 BIOS 中交换了 IDE 和 SCSI 设备的启动顺序 GRUB 会得到
错误的设备号。
不幸的是此时 OS 设备名也不恒定。多启动的情况下:不同的 Linux 内核 可能使用不同的顺序加载设备
驱动以及使用不同的设备名(/dev/hd* 和 /dev/sd* )。因此你可能需要频繁的更新设备映射文件。
1 所有的启动光盘都遵循 El Torito 这种格式,这是启动光盘的国际标准。
6
GRUB 为了避免这个问题,在 文件使用 UUID 或者文件系统卷标来指定分区。我们建议你自
己手写的 也使用 UUID 或者卷标。如果设备映射文件不存在,grub 工具集会设想一个临时的
映射文件。在单磁盘系统中它工作良好。
自动产生的设备映射文件也不总是合适的,某些情况下需要设备映射文件。如果 grub2-mkdevicemap
命令产生错误,你可以手动建立 映射文件。在映射文件中#开始的行被作为注释。
3.3 BIOS 安装
3.3.1 MBR
在 PC BIOS 平台 ,使用的分区表格式通常称作 MBR 格式(主引导记录)。这个格式最多允许 4 个主分区,和若干逻辑分区。在这种格式下有两种方法安装 GRUB:
1. 嵌入到 MBR 和第一个分区中,这个可嵌入区域它有多个名字:MBR ,引导区,嵌入区它至少
要有 31KiB 的容量。
2. grub 核心镜像可以被安装到文件系统中,GRUB 启动程序被写入到第一个磁盘的第一个区块中。
这两个方法都有缺点。没有办法在尽量安全时在嵌入区域中保留空间。并且已知某些软件会使用这个区
域保留版权信息。磁盘在分区的时也可能在第一个分区前面没有保留足够的空间。另一方面,安装到文
件系统里意味着 GRUB 很脆弱。因为某些文件系统存在 tail paking 特性,会导致 GRUB 的区块发生移
动,导致 MBR 内的 GRUB 加载器无法找到 GRUB 核心镜像。使用这种方法,最好是/boot 目录和
BIOS 引导的设备是同一个磁盘。GRUB 不用去猜测设备号。
GRUB 开发者建议在第一个分区前嵌入 GRUB。除非你有特殊需求。你必须保证第一个分区前存在至少
31KiB(63 区块)的空间。在现代的磁盘中空间不再吃紧,因此最好分区时在第一个分区前保留 1MiB
的空间。
3.3.2 GPT
一些新的系统使用 GUID 分区表(GPT)格式。这是 EFI 的一个特殊部分,如果你的软件支持,GPT
也可以在 BIOS 中使用。例如:GRUB 和 GNU/linux 可以用在这种情况。在 GPT 格式下可以为
GRUB 准备单独的分区,被称作 BIOS 引导分区。GRUB 可以被嵌入到那个专用分区中,从而避免被其
他软件意外覆盖和文件系统导致的区块移动。
在 GPT 创建引导分区时,你需要确认分区至少有 31KiB。GPT 格式的磁盘通常不应该有这么小容量
的分区,所以我们建议你的引导分区容量大一点,比如 1MiB,用来提供 GRUB 可能的扩展。你必须确
定
boot 分区有合适的类型。使用 GNU parted 程序:
# parted /dev/DISK set PARTITION-NUMBER bios_grub on
如果你使用 gdisk 程序,请将分区类型设置为:0xEF02 。
警告:对将要操作的分区要多加小心!当 GRUB 在安装时使用了 BIOS 引导分区时,它会自动格式化整
个引导分区,并且把 GRUB 安装进去。请保证分区内不包含其他数据。
7
4 引导过程
GRUB 可以用恰当的方式 加载 多重引导
1兼容内核(Multiboot-compliant kernel)。但是对于某些特
殊 OS,你需要使用 特殊的方式。
4.1 OS 如何引导
GRUB 有两种引导方法。第一个是直接加载 OS。另一个使用链式加载(chain-load ),它可以加载其
他的引导加载器。通常而言,GRUB 有足够的能力从任何一块磁盘的任意分区 加载 OS。但对于某些
操作系统必须使用 OS 自身的加载器(最常见的是 windows xp)。
4.1.1 如何直接引导 OS
操作系统你需要使用链式加载。
多重引导是 GRUB 天生的功能。它支持:Linux FreeBSD NetBSD OpenBSD。如果你希望加载其他
对于 DOS 和 Windows 有一些特殊缘故,你需要特殊方法才能成功引导,这种情况称作系统特异性 2。
参见下文。
4.1.2 链式加载 OS
OS 自带的加载器。
OS 不支持多重启动,或者 GRUB 不能直接引导它时,你就需要使用 chain-load 链式加载。它用来调用
chainloader 命令用来运行链式加载。它通常需要某些 GRUB 模块,并且正确设置根设备(root)。你
可以把这些指令放到一个菜单项里面。
menuentry "Windows" {
insmod chain
insmod ntfs
set root=(hd0,1)
chainloader +1
}
如果你有多个硬盘,你可能需要使用更多的命令设置更多东西。
链式加载只支持 PC BIOS 系统和 EFI 平台。
1
多重引导,也称作多启动。
2
系统特异性,不同的操作系统使用不同的引导方法,称作系统特异性。
8
4.2 特异性加载可能出现的问题
4.2.1 GNU/Hurd
所在分区。
GNU/Hurd 是多重引导兼容的,因此很容易加载它。但是别忘了在引导之前需要正确设置根设备为内核
1. 设置 GRUB 根设备到 GNU/Hurd 的某个分区。search --file --set /boot/ 命令很有
用。它会自动搜索 /boot/ 文件,并把存在此文件的分区设置为根设备。
2. 加载内核和内核模块:
grub> multiboot /boot/ root=device:hd0s1
grub> module /hurd/ ext2fs --readonly
--multiboot-command-line='${kernel-command-line}'
--host-priv-port='${host-port}'
--device-master-port='${device-port}'
--exec-server-task='${exec-task}' -T typed '${root}'
'$(task-create)' '$(task-resume)'
grub> module /lib/.1 exec /hurd/exec '$(exec-task=task-create)'
3. 执行 boot 指令
4.2.2 GNU/Linux
用 GRUB 引导 linux 相对比较容易。因为它也是多重引导兼容的 OS。
1. 设置根设备到包含 Linux 内核的分区。search --file --set /boot/vmlinuz 对你有用。
2. 使用 linux 命令加载内核:
grub> linux /vmlinuz root=/dev/sda1
linux 命令用来加载 linux 内核,并且设置根分区
1。/vmlinuz 用来在根设备中指定文件。
如果你希望添加内核参数直接把参数写到命令后面:
grub> linux /vmlinuz root=/dev/sda1 acpi=off
得到所有可用的内核参数,你需要查看内核源代码树。
3. 如果你使用 initrd 2还需要执行 initrd 命令。
grub> initrd /initrd
如果你使用 linux16,你需要使用 initrd16 命令
grub> initrd16 /initrd
4. 最后运行 boot 命令。
警告:如果你使用 initrd 指令,并且使用了 mem=内核参数设置了小于实际的内存容量。你需要在
GRUB 中设置相同的数值。在载入 linux 内核前,使用 uppermem 命令指定内存容量。
1
根分区和根设备不是一个含义,根分区是指文件系统根目录所在的分区。根设备是指 GRUB 加载 OS 内核
时。一个名为 root 的选项值,它指向内核所在分区的设备名。set root=(hd0,1)
2
Linux 初始 RAM 磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段
的引导过程。initrd 文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然
后再将这个 initrd RAM 磁盘卸载,并释放内存。在很多嵌入式 Linux 系统中,initrd 就是最终的根文
件系统。
9
4.2.3 DOS/Windows
GRUB 不能直接引导 DOS 和 WINDOWS。你必须使用 chainloader 命令。这是由于 DOS 和 Win-
dows 内置加载器有严重缺陷。导致这些 OS 不能从非第一块硬盘里启动。如果你把 DOS 或者 WIN 安
装到非第一块硬盘,你需要使用磁盘交换技术。drivemap 命令。
drivemap -s (hd0) (hd1)
这个命令对你的第一和第二块硬盘执行了虚拟交换。
警告:虚拟交换只在 OS 使用 BIOS 访问磁盘时有效。如果它们使用自己的驱动程序访问磁盘则虚拟交
换不影响 OS。
如果你安装了很多 DOS/win 到同一个磁盘里也可能发生问题。因为如果磁盘里有多个主分区,它们可能
会混淆。你应该避免安装多份 DOS/win 到同一个磁盘里。如果你确实遇到这种情况 GRUB 也提供了解
决办法。使用分区隐藏技术。
GRUB 隐藏一个 DOS/win 分区时,DOS/win 会忽略哪个分区。当 GRUB 取消隐藏 某个 DOS/win 分
区时,DOS/win OS 会识别哪个分区。假设你安装了 win 在第一个硬盘的第一个分区和第二个分区你希
望加载第 1 个分区内的 OS,执行如下命令:
parttool (hd0,1) hidden-
parttool (hd0,2) hidden+
set root=(hd0,1)
chainloader +1
parttool ${root} boot+
boot
5 编写配置文件
5.1 简单的配置文件
并且产生对应的菜单项。
grub2-mkconfig 用来产生 文件。它可以用来升级你的配置文件,它可以自动检测可用的内核,
grub2-mkconfig 有一些限制。当你希望在菜单项列表后面添加新的项目时你应该修改/etc/grub.d/
40_custom 文件,或者创建 /boot/grub2/ 文件。修改菜单项的顺序,需要修改/etc/grub.d/内
的文件的前缀的数字。与/etc/init.d 下面的脚本类似。数字决定运行的顺序,数字小的出现在前面。
[root@localhost] 0 /etc/grub.d # ll
总用量 48
-rwxr-xr-x. 1 root root 6709 5 月 7 21:50 00_header
-rwxr-xr-x. 1 root root 5959 5 月 7 21:50 10_linux
-rwxr-xr-x. 1 root root 5875 5 月 7 21:50 20_linux_xen
-rwxr-xr-x. 1 root root 5963 5 月 7 21:50 30_os-prober
-rwxr-xr-x. 1 root root 214 5 月 7 21:50 40_custom
-rwxr-xr-x. 1 root root 95 5 月 7 21:50 41_custom
-rwxr-xr-x. 1 root root 1259 5 月 7 21:50 90_persistent
-rw-r--r--. 1 root root 483 5 月 7 21:50 README
/etc/grub.d/下面的文件都是 shell 脚本。使用脚本机制是为了普通用户能够简单的管理菜单项。如果你能
够自己写 那么你可以不使用 grub2-mkconfig.
10
文件 /etc/default/grub 控制 grub2-mkconfig 的行为。它也是 shell 脚本,所以应该使用 POSIX shell
语法。通常,文件内只是定义了一系列的
shell 变量:
[root@localhost] 0 /etc/grub.d # cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Fedora"
GRUB_DEFAULT=saved
GRUB_CMDLINE_LINUX="=0 =0 =0 KEYTABLE=us quiet rhgb
LANG=zh_-8 =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
如果此选项值为"true" ,且 GRUB_DEFAULT ="saved"时,那么手动进入一个菜单项后自动把它设置为下
一次启动时的默认菜单项。
GRUB_DEFAULT ="saved"命令不一定必须 GRUB_SAVEDEFAULT="true" 。也可以和 grub2-set-
default 或者 grub2-reboot 命令连用。
GRUB_TIMEOUT
值为一个数值,表示时间秒。显示菜单后,等待键盘输入。如果指定时间内没有键盘操作,那么自动加载
GRUB_DEFAULT 变量所指定的菜单项。默认是 5 。 如果值为 0 那么直接加载默认菜单项而不显示菜单。
如果为-1 那么 永远等待输入,不自动加载。
GRUB_HIDDEN_TIMEOUT
值为一个数值,表示时间秒。在显示菜单之前等待键盘输入,如果指定时间内没有键盘操作,那么自动加载
GRUB_DEFAULT 变量所指定的菜单项。无默认值。
GRUB_HIDDEN_TIMEOUT_QUIET
与 GRUB_HIDDEN_TIMEOUT 连用。如果设置为"true" 那么不显示倒计时。无默认值。
`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 表示根文件系统。如果你希望关闭它设
置这个选项值为"true"
`GRUB_DISABLE_RECOVERY'
如果此选项值为 "true",那么不自动产生救援模式菜单。
`GRUB_VIDEO_BACKEND'
如果图形卡支持,并且正在使用 gfxterm 图形终端,或者设置了 GRUB_GFXPAYLOAD_LINUX 变量。
纳克 grub2-mkconfig 会加载所有可用的 GREB 图形驱动,然后使用最合适的那个。如果你希望改变这个行
1Coreboot 是一个以 Linux 为基础的开源韧体,它的开发目的在于取代目前市售计算机 都会看到的 BIOS,而
且它可以只在开机时运行特定的程序,从而节省系统资源。
12
为,你可以设置这个变量。在 grub2-install 执行后,可用的图形驱动名被放置到 /boot/grub2/
`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. 设置为"text",强制 linux 内核以文本模式启动;
2. "keep" 保持图形模式,使用 GRUB_GFXMODE , WIDTHxHEIGHT[xDEPTH] 的设置孤行模式相关参
数;
3. 设置为逗号或者分号分割的列表,用来选择图形模式。
根据你的内核、发行版、你的显卡还有概率性问题,使用这个选项可能导致 linux 产生很多显示问题,特别
是在引导早期。如果你启动出了问题,请设置为 text。
`GRUB_DISABLE_OS_PROBER'
通常 grub2-mkconfig 会使用外部程序 os-prober 。这个程序会发现电脑 安装的其他系统。并且产生合适
的菜单项。设置此选项值为 "true"可以关闭这个选项。
`GRUB_INIT_TUNE'
在 GRUB 启动时同步的在扬声器 播放声音。这对于没有显示器的人有用。选项的值被直接传递到 play 命
令。
`GRUB_BADRAM'
如果开启了这个选项,GRUB 会使用 badram 命令过滤掉错误的内存区域。
`GRUB_PRELOAD_MODULES'
选项值为用空格分割的一系列 GRUB 模块名。这些模块会在 加载之前加载。
你可以从 grub2-mkconfig 的输出中看到更多信息。你可以修改 /etc/grub.d 目录下的脚本,
/etc/grub.d/40_custom 通常用来添加某些菜单项。你可以把改动写到/etc/grub.d 下的任意的脚本里,通
常使用 40_custom 来添加某些菜单项,请不要修改这个文件内的头两行。
5.2 完整的配置文件
的文件内容使用 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="OK
_line2"
会产生字符串 "OK_line2" ,续行符只是让脚本格式更好。
变量扩展
美元符号 $ 用来做变量扩展。变量名可以被扩在花括号内,也可以省略。
var="_med_"
pre="P"
suf="S"
echo "$P${var}IL$suf"
输出 P_med_ILS,如果你不使用花括号${var}IL,而是使用$varIL,那么系统会扩展搜索名为 varIL 的变量,
由于这个变量不存在因此会被扩展为空。
位置变量代指名为数字的变量。它们用来代指函数输入参数。例如:$1 代表函数第一个参数,$2 代表第
二个参数,等等。。。
$? 用来代指 一个命令的退出状态。
$@ 代指所有的位置变量,扩展成这样:"$1" "$2" "$3" ... ...
$* 代指所有的位置变量,扩展成这样:$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
态为 0 。
5.3 嵌入配置文件到 GRUB
GRUB 可以把配置文件嵌入到核心镜像中。这样做可以在 normal 模式之前加载配置文件。这个功能对
以下情况有用:1 无法直接找到外部配置文件;2 在加载配置文件时 debug。grub2-install 在不使用
BIOS 访问磁盘或者在 GRUB 被安装到不包含/boot/grub 的硬盘中时自动使用嵌入配置文件的功能。在
这种情况下你可能需要 search 命令来自动设置根设备到正确的磁盘。
grub2-mkimage 使用 -c 选项生成嵌入了配置文件的镜像。嵌入配置文件后,外部的配置文件就可以移
动或者删除了。
在执行了内嵌的配置文件后,GRUB 加载 normal 模块,它会读取外部配置文件 $prefix/ 。因
此,你必须在嵌入的配置文件中设置正确的根设备。例如 设置 prefix 为 (hd0,1)/boot/grub ,root 设置
为 (hd0,1) 。在大部分情况下,嵌入式配置文件只需要正确设置 prefix 和 root 选项。随后由 normal 模
块处理。实例:
_uuid 01234567-89ab-cdef-0123-456789abcdef root
set prefix=($root)/boot/grub
在这个实例中核心镜像必须包含 search_fs_uuid 模块才能正确运行。
如果在核心镜像中包含了 normal 模块和 configfile 模块。就可以从嵌入式配置文件中加载外部配置文件。
使用 configfile 命令加载外部配置文件,它可以不是/boot/grub/。
实例:
这个实例需要在核心镜像中包含 echo search_label test 模块
_label grub root
if [ -e /boot/grub2/example/ ]; then
set prefix=($root)/boot/grub
configfile /boot/grub2/example/
else
if [ -e /boot/grub2/example/ ]; then
set prefix=($root)/boot/grub
configfile /boot/grub2/example/
else
echo "Could not find an example configuration file!"
fi
fi
嵌入式配置文件可以不包含菜单定义。使用 configfile 间接加载其他配置文件。
6 主题文件格式
6.1 前言
GRUB 图形化菜单支持主题,它可以设置启动菜单不同的色彩和排版。主题文件是用纯文本文件说明的
GUI 组件的排版,它包括引导菜单,超时进度条,文本信息。这些组件都可以使用色彩、字体、图像。
查看实例:附录《主题实例》62。
16
使用主题文件需要使用 gfxterm 输出终端。主题中可以包含中文字符,但是文件编码必须用 utf8,unix
格式的换行,同时必须加载支持 utf8 中文的字体。
打开 gfxterm 需遵循以下步骤:
# 为了添加背景,导入 png 和 jpeg 模块。
insmod png
insmod jpeg
# 载入合适的显卡驱动
insmod vbe
#insmod vga
# 引入 gfxterm 模块
insmod gfxterm
#insmod gfxmenu
# 加载字体:
loadfont /boot/2
loadfont /boot/2
# 设置 gfxterm 的参数:
set gfxmode=1024x768
set theme=(cd)/boot/theme/
#theme 变量指向主题配置文件。
#打开 gfxterm 设备
terminal_output gfxterm
6.2 主题元素
6.2.1 色彩
色彩可以通过多种方式指定:
•HTML 风格: #RRGGB 或者 #RGB ,R G B 是十六进制数字。例如:"#8899FF"
•逗号分割的 3 个十进制 RGB 数值:"128,128,255"
•SVG 1.0 色彩名,必须是小写:"cornflowerblue"
6.2.2 字体
GRUB 使用 PF2 字体格式 点阵字体。字体必须是完整的字体名。使用 grub2-mkfont 可以转换已知的字
体到
pf2。
grub-mkfont --verbose --range=0x0-0x7F --size=18 --output=2
$(locate )
仿造 面的命令生成 DejaVuSansMono 字体,在终端下支持中文你还需要其他中文字体,比如
WenQuanYi。
loadfont 命令用来加载字体。lsfonts 命令用来查看已经加载的所有字体的字体名。这些字体名会用在主
17
题文件的 font 字段 。
如果命令输出大于 1 页,在执行 lsfonts 前使用 set pager=1 设置翻页。想显示中文应该使用 gfxterm
6.2.3 进度条组件
GRUB 进度条用来表示默认加载倒计时。创建进度条使用 progress_bar 组件,并且设置 id
"__timeout__" 。GRUB 会根据指定的时间倒计时,并且在用户进行键盘操作时关闭并隐藏进度条。
进度条表面可以有表示剩余时间的文本,设置 show_text 属性为 true 或者 false,它将开启或者关闭文
本显示。
6.2.4 表盘进度指示器
表盘进度指示器 类似与 进度条,设置了 __timeout__ id 时,GRUB 会设置倒计时时限。对于环表盘进
度指示器可以使用两个图片 center 和 tick 。一个用来绘制表盘中心,一个用来绘制表周的刻度。
6.2.5 标签组件
文本标签可以被放在引导界面的任何位置。标签有字体、色彩、和水平长度等属性。如果标签也拥有
__timeout__ ID 那么标签的 text 属性会显示为自动引导倒计时。
6.2.6 引导菜单组件
引导菜单组件是 GRUB 显示菜单项的地方。菜单项由配置文件的 menuentry 命令定义。菜单项是一个
列表,它包含文本标识,和一个可选的图标。如果在 grub/themes/icons 目录下存在一个名为 myclass
.png 的 PNG 图片,那么它会被显示在所有 class 为"myclass"的项目附近。菜单组件可以以多种方式配
置,例如菜单项文本的字体和色彩,也可以为菜单组件本身和未选择菜单项、已选择菜单项指定样式盒。
6.2.7 样式盒
绘制在屏幕 。
排版的重要特性就是样式盒。一个样式盒由 9 个矩形区域组成(它们是空 的未填充区域),会被无缝
她们的位置关系如下:
Northwest (nw) North (n)
West (w) Center
(c)
Northeast (ne)
East (e)
Southeast (se)
Southwest (sw) South (s)
center 区域会按照一定规则缩放用来适应所指定的大小:
由于样式盒可以是任意尺寸,所以18
1. 四个边界区域(west north east south)只在它们贴近的方向 缩放,比如在左边的 west 和 east 区
域,只在竖直方向 缩放。north 和 south 只在水平方向 缩放。
2. 边角区域不缩放:Northwest (nw) Northeast (ne) Southeast (se) Southwest (sw) 不缩放。
3. 中心区域用来填充剩下的区域
6.2.8 创建样式盒图形
inkscape 矢量图形编辑器对创建样式盒图形非常有用。简单的步骤就可以把图片切割成样式盒需要的部
分。以下是大概步骤:
1. 新建或者打开一幅图像
2. 在顶层创建一个新的图层。并使它可见,然后选中此图层。
3. 按照你需要的样式盒的格局绘制 9 个无填充的矩形。设置矩形边框为实心直线 1 像素宽。边角区
域的边长必须精确匹配边界区域。如果将边界区域和边角区域的宽度设置为 1 像素,则意味着这
些区域被关闭了(几乎不存在,在图形中不可见)。如果边界区域和边角区域坐标和宽度的误差
哪怕只有 1 像素,在图形渲染时可能会很明显。你可能需要绘图软件的"网络/辅助线"功能来精确
放置矩形。
4. 右击中心矩形,修改属性 ld 到 slice_c 。为其他矩形重复这个步骤,分别改为 slice_n slice_ne
slice_e ... ... 。
5. 保存
6. 选中所有这些矩形(可能是 CTRL+A 快捷键 )。在状态栏 应该看到 "选中了 9 个对象"之类的
信息。
7. 隐藏矩形所在的图层。这样矩形被选中了但是并没有显示。
8. 单击 文件 -- 导出位图 。它会在当前目录下创建按照矩形区域切割的 9 个 PNG 文件。
6.3 主题文件教程
主题文件是一个文本文件。 以 # 开始的行 作为注释被忽略掉。主题文件包含两种类型的语句:
1. 全局属性
2. 组件构造
6.3.1 全局属性
19
6.3.2 格式
全局属性使用简单的格式指定:
•••
name1:value1
name2:"value which may contain spaces"
name3:#88F
name3 是一个色彩值。
6.3.3 全局属性列表
title-text
值为字符串,它会作为标题居中显示在整个屏幕顶端。
title-font
用于 title-text 文本的字体。
title-color
用于 title-text 文本的色彩。
message-font
当 GRUB 无法自动加载某个菜单项时显示短消息使用的字体。
message-color
定义消息文本的色彩
message-bg-color
定义消息文本的背景色
desktop-image
定义屏幕背景图片,它会自动缩放以填充整个屏幕。
desktop-color
如果 desktop-image 没有设置,那么使用 desktop-color 背景色。
terminal-box
设置文件名通配,匹配得到的文件用来设置命令行终端窗口使用的样式盒。例如 terminal-
box:terminal_*.png
会使用这些文件 terminal_ terminal_ terminal_ 等等。。。 分别表示:
Northwest (nw) North (n)
West (w) Center
(c)
Northeast (ne)
East (e)
Southeast (se)
Southwest (sw) South (s)
如果某些区域没有对应的文件,那么会留空。
6.3.4 组件构造
组件可以提供更加灵活的界面排版。容器组件可以包含其他组件。所有的组件都包含在一个根容器组件
20
里,root 容器是 canvas 容器组件的一个实例。
组件的构造使用+ 开始的行后续 组件名称 后续组件属性:
+ label { text="GRUB" font="aqui 11" color="#8FF" }
其中 name=value 格式, text= font= color= 是这个组件的属性设置。可用的值为:
•引号扩住的字符串,如:text="hello, world !"
•一个元組 ,如:preferred_size=(120,80)
6.3.5 可用的组件列表
• label
用来显示一行文字的组件
属性:
text
待显示的文本
font
文本使用的字体
color
文本使用的色彩
align
组件内文本的对齐设置,可用的值为:left,center,right
•image
用来显示图像的组件,图像会自动缩放用来填充组件区域。
属性:
file
图像所在的路径
•progress_bar水平进度条。它可以使用填充矩形绘制,也可以使用一对样式盒。
fg_color
前景填充色
bg_color
背景填充色
border_color
边框色彩
text_color
文本色彩
show_text
一个 boolean 值,设置是否在进度条 显示表示剩余时间的文本。设置为 "true"则
显示文本否则不显示。
bar_style 设置进度条的样式盒:"progress_*.png"
highlight_style 设置进度条高亮区域的样式盒。这个样式盒只显示在进度区域,并且会随着进度的
增长而延长。
text
设置进度条 显示的文本。如果进度条 ID 设置为 __timeout__,那么 GRUB 会自
动设置文本为剩余时间。
value
设置进度条的当前值,通常不需要手动设置,这个值在倒计时过程中时自动增长。
start
设置进度条的初始值,当个 Value 等于这个值时进度条是 0% 通常不需要手动设置
end
设置进度条的终止值,当个 Value 等于这个值时进度条是 100% 通常不需要手动设
置
•circular_progress表盘进度指示器,它需要两个图像。分别用作 center 和 tick 。center 图片用来绘制组件的中心,tick 图像用来绘制表盘周围的刻度,刻度数目由属性设置。
center_bitmap
绘制表盘中心所使用的位图路径
tick_bitmap
绘制表盘刻度所使用的位图路径
num_tics
刻度数目
ticks_disapper
boolean 值,设置刻度是随着进度的增长依次消失("true"),还是随着增长依
次显示("false")。
21
value
长。
设置进度条的当前值,通常不需要手动设置,这个值在倒计时过程中时自动增
设置进度条的初始值,当个 Value 等于这个值时进度条是 0% 通常不需要手动
start
设置
设置进度条的终止值,当个 Value 等于这个值时进度条是 100% 通常不需要
end
手动设置
•boot_menu 显示 GRUB 引导菜单。菜单项显示在其中,可以选择并且按下 enter 后进入菜单项。
item_font
selected_item_font
item_color
selected_item_color
icon_width
icon_height
item_height
item_padding
item_icon_space
item_spacing
menu_pixmap_style
scrollbar
scrollbar_frame
scrollbar_thumb
max_items_shown
条。
未选择菜单项标题使用的字体
已选择菜单项标题使用的字体,设置为"inherit",表示和 item_font 相同。
未选择菜单项标题使用的色彩
已选择菜单项标题使用的色彩,设置为"inherit",表示和 item_color 相同。
菜单项成员使用的图标的宽度,图标会缩放到指定宽度。
菜单项成员使用的图标的高度,图标会缩放到指定高度。
菜单项的像素高度。
菜单项两边的空 距离,单位为像素。
菜单项图标和菜单项文本之间的距离,单位为像素。
相邻菜单项之间的距离,单位为像素。
设置菜单项使用的样式盒。例如:"menu_*.png"
selected_item_pixmap_style
被选择的菜单项使用的样式盒:例如:"menu_select_*.png"
boolean 值,当 frame 和 thumb 属性有效时是否显滚动条。
滚动条使用的外框的样式盒。
滚动条使用的滑块的样式盒。
设置菜单空间所显示的最大菜单项数目。未显示的菜单项可以使用滚动
•canvas canvas 是一个容器组件,可以包含其他组件。它不改变子对象的坐标,但是会自动设置
所有子对象的子对象的大小。
•hbox hbox 是水平容器组件,它把所有子对象从左到右排列,并且自动设置子对象的宽度。
所有子对象的高度,自动设置为所有子对象中最高的那个。
•
vbox vbox 是竖直容器组件,它把所有子对象从 到下排列,设置自动子对象高度,并且将
所有子对象的宽度自动设置为所有子对象中最大宽度。
各个组件如下图:
22
中文菜单是使用 boot_menu 显示的, 电池和周围的东西是使用 circular_progress 显示的。
色的进度条使用 progress_bar 显示。马的图形使用 image 显示,马周围的黑色边框是图形本身就有的
背景色。图片 方的标题使用 label 显示。
组件之间也是可以互相遮蔽的,最先绘制的组件在最前面,后绘制的对象在后方的图层。
6.3.6 通用属性
left
设置对象左边界到父容器左边界的距离。这相当于设置对象横坐标。有 3 种格式:
x
数值,单位为像素.例如:10
p%
百分比。
p%+x
混合以 格式。
23
top
设置对象 边界到父容器 边界的距离。这相当于设置对象纵坐标。值的格式跟 left 相同。
width
对象的宽度,值的格式和 left 相同。
height
设置对象的宽度,值的格式和 left 相同。
id
对象的名称 ID。这个 name 可以用于在脚本中引用这个控件。类似于 VB 中的 name 属性。ID 可以设置为
任意字符串。但是 ID 设为某些特殊的值对 GRUB 有特殊意义:
"__timeout__" 任何拥有这个 ID 的对象都自动拥有:text start end value 和 visible 属性。它们用于在
GRUB 自动加载前倒计时。
7 网络引导
以下教程只对开启了 PXE 的 PC BIOS 系统有效。 中必须包含 pxe 和 pxecmd 模块。
创建一个 PXE 引导镜像使用命令:
grub2-mkimage --format=i386-pc-pxe --output= --prefix='(pxe)/boot/grub' pxe pxecmd
此命令会生成文件:。复制文件 和/boot/grub2/*.mod 和/boot/grub2/*.lst 到 PXE(
TFTP)服务器,并且确认/boot/grub2/*.mod 和 /boot/grub2/*.lst 可以通过服务器访问到。设置
DHCP 服务器提供 作为引导文件(文件名由 ISC dhcpd 设置)。
你也可以使用 grub2-mknetdir 工具去产生镜像和引导目录树。
在 GRUB 启动之后,通过(pxe)设备可以访问 TFTP 服务器 的引导文件。服务器和网关的 IP 可以通过
使用特殊设备文件名:(pxe:SERVER-IP) 或 (pxe:SERVER-IP:GATEWAY-IP) 。应该把设备文件名
写在 prefix 选项中。
GRUB 提供一些环境变量用来控制 pxe 设备的行为:
net_pxe_ip
本机使用的 IP。只读。
net_pxe_mac
网络接口的 MAC 地址。只读。
net_pxe_hostname
客户端使用的 host 名,由 DHCP 服务器提供。只读。
net_pxe_domain
客户端域名,由 DHCP 服务器体懂。只读。
net_pxe_rootpath
客户端的根磁盘。由 DHCP 服务器体懂。只读。
net_pxe_extensionspath
指向其他 DHCP 供应商的路径,由 DHCP 服务器体懂。只读。
net_pxe_boot_file
24
引导文件的文件名。由 DHCP 服务器体懂。只读。
net_pxe_dhcp_server_name
DHCP 服务器名,可以提供引导参数。只读。
net_blksize
PXE 转换的块大小。可读写,默认为 512
net_default_server
默认的 PXE 服务器。可读写,这个选项只在打开 PXE 设备之前设置才有效。
pxe_default_gateway
连接 PXE 服务器需要通过的默认网关。可读写,这个选项只在打开 PXE 设备之前设置才有效。
8 通过串行线使用 GRUB
这一章解释如何使用串行终端。
如果你有很多电脑,或者你的电脑没有显示器和键盘,这个功能可以用来通过串行线控制电脑。通过串
行线连接若干电脑,你需要准备空 Modem 串行电缆( null-modem serial cable) 。如果你的电脑没有串行端
口,你可能还需要多个接口的串口卡。当然你还需要一个终端仿真器,例如 minicom 。
对于 GRUB 只需要做一些简单的操作:
grub> serial --unit=0 --speed=9600
grub> terminal_input serial; terminal_output serial
命令 serial 用速率 9800 初始化 线路连接器 0. 通常连接器 0 被称作 com1 ,因此如果你想要使用 COM2
,应该指定--unit=1 。这个命令还有很多其他选项,参考命令解释。
命令 terminal_input 和 terminal_output 选择输入和输出终端类型为 serial 终端。当然你也可以同时传
入 console:terminal_input serial console ,在这个情况下,终端 按下任意键,它将被选择为 GRUB
终端。在 面的例子中,你必须在同一行中用两条命令,因为一旦执行了 terminal_input serial ,键盘输
入不再有效了。
无论如何 GRUB 假设你的终端仿真器兼容 VT100 .这对于当今大部分终端仿真器是正确的。如果你的终
端仿真器不兼容 VT!00,在 serial 命令使用 --dumb 参数。如果你使用了这个选项,GRUB 会提供一个
特殊的菜单界面,因为普通的菜单需要终端的某些特性。
9 使用电源键
某些笔记本厂家提供了附加的开机键用来启动另一个 OS。GRUB 支持这种按钮。当使用附加电源键启
动电脑时,GRUB 会使用 `GRUB_TIMEOUT_BUTTON', `GRUB_DEFAULT_BUTTON',
`GRUB_HIDDEN_TIMEOUT_BUTTON' 和`GRUB_BUTTON_CMOS_ADDRESS' 这 4 个变量1
来控制默认启动项和超时等待时间。 GRUB_BUTTON_CMOS_ADDRESS 变量是由厂家设置的用来
表示设备星号的值。目前被 GRUB 小组已知的值是:
85:3
84:1 (unconfirmed)
1
如果使用普通电源键来启动 GRUB,就会使用无_BUTTOM 后缀的变量来控制默认启动项和超时等待时间。
25
为了得到电源键的完整功能你应该把 GRUB 安装到 MBR 中。如果你的笔记本拥有类似的特性但是没有
出现在 面的列表中,请你指出你的硬件地址并且报告它。
为了得到硬件地址请做以下事情:
1. 使用普通电源键启动 linux。使用 root 权限执行如下命令:
# modprobe nvram
# cat /dev/nvram | xxd > normal_
文件的输出如下:
2. 使用附加电源键启动 linux。使用 root 权限执行相同的命令:
# modprobe nvram
# cat /dev/nvram | xxd > normal_
并且对比这两个文本文件,找出它们不同点。
在 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)
PC BIOS 系统中,这个镜像是 GRUB 第一个运行的。它通常写入到硬盘的主引导记录(MBR),或者分
区的引导区段。由于 PC 引导区段只有 512 byte,所以 的大小等于 512 byte
的功能是加载 的第一个区段。由于 512 字节的容量限制所以 不能理解文件系统。
在执行 grub2-setup 时, 内编码了 第一个区块的硬件地址。
当从硬盘启动时,核心镜像 的第一个区块内容为 。它用来读取剩余的核心镜像,并
且加载 GRUB 内核。 也不能理解文件系统,它内部编码了核心镜像的区块地址列表。
当从 CD 中启动时,核心镜像 的第一个区块内容为 。它的功能类似于
26
当使用 PXE 从网络启动时,核心镜像 的第一个区块内容为 。它的功能类似于
。
放在 的开始,可以让 类似于 Linux 内核。此时 可以被其他加载器
作为 linux 内核加载。例如 LILO 使用 image=XXX
GRUB 内核镜像,包含了 GRUB 核心功能,她们是 GRUB 的本质。包括设备的处理,文件的处理,环境变
量,救援模式,和命令行语法解析器 等等。它很少被直接使用,通常都是嵌入到 中。
这是 GRUB 加载时 MBR 中的 跳转的文件,此文件内包含了一个 ,和
还有任意数目的模块,也许还有一个配置文件。参考 grub2-mkimage
*.mod
GRUB 的附加功能来自于可动态加载的模块。这些模块可以被嵌入到 中,以便于在 GRUB 不能访
问文件系统时加载。也可以放在文件系统中在 GRUB 启动后使用 insmod 命令加载。
10.2GRUB legacy 用户
GRUB2 和 GRUB legacy 有很多设计 的不同。GRUB2 可能没有类似某些 GRUB legacy 的镜像。这
里有个简短的列表用来阐述 GRUB legacy 镜像和 GRUB2 镜像的对应关系:
stage1
它的功能类似于
*_stage1_5
stage1_5 包含了文件系统代码去从初始文件系统中访问 stage2 . 这个功能类似与 。但是
通过组合不同的镜像和模块和配置文件。可以包含更加灵活和复杂的功能。另外 GRUB2 可以从 LVM 和
RAID 中读取文件。GRUB legacy 可以不使用 stage1.5 ,但是 GRUB2 必须使用
stage2
GRUB2 没有单独的 stage2 镜像。取而代之,GRUB2 在运行时动态载入模块。
stage2_eltorito
在 GRUB2 中,从 CD 引导现在使用, 镜像和 。确认 包含 iso9660 模块。你
最好使用 grub2-mkrescue 程序创建镜像。
nbgrub
GRUB2 中没有 nbgrub 的等价物。
pxegrub
在 GRUB2 中使用 来完成 PXE 网络启动。 中必须包含 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/ 。它意味着在
第一块硬盘的第一个分区中搜索文件/boot/grub2/。如果路径中不包含设备文件:/boot/grub2/
。那么它会自动使用 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) 时; 的 "+1"
28
12 GRUB 交互界面
GRUB 有两种交互方式,菜单交互和命令行交互。当 GRUB 启动时 GRUB 会搜索它的配置文件。如果
发现了配置文件,那么会激活菜单界面,并且显示配置文件中定义的菜单项。如果没有找到配置文件,
或者你在菜单界面中选择了" command-line " ,那么进入命令行模式。
12.1命令行界面
类似于 Unix 和 DOS 命令行界面会显示命令提示符然后等待输入。在按下 enter 后,命令行中的命令立
刻执行。除了在命令行中运行命令,所有命令都可以在配置文件中运行。 光标的移动快捷键类似于 bash
。
向右移动一个字符。
向左移动一个字符
移动到当前行的第一个字符
移动到当前行的最后一个字符
删除光标下的一个字符
删除光标左端的一个字符
删除从光标到行尾所有字符
删除从光标到行开始所有字符
粘帖删除的文本到光标缓冲区。
29
向 查阅历史记录
向下查阅历史记录
处在命令行交互下,可以使用 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 会包含它的父菜单标题,各个父菜单之间使用 > 分割 。例如 :
"other>fedora>fedora_16" ,表示当前菜单标题是 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="Submenu 2>Submenu 3>Menu Entry 3 "
这个变量通常使用 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 变量设置。
默认值为 "text" ,其他情况可能是 "auto" 或者是某个有
13.1.10 gfxterm_font
设置 gfxterm 图形终端的默认字体。
32
13.1.11 icondir
13.1.12 lang
为 "zh_CN" 。
这个选项设置 GRUB 搜索图标使用的路径。
这个选项设置 gettext 命令使用的语言编码,它用来翻译字符串 。 通常法语应该设为 "fr" ,简体中文设
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_dhcp_server_name
net_pxe_extensionspath
net_pxe_domain
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 应该为
"$root/boot/grub"
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
14.1.1
语法:
menuentry
menuentry TITLE [`--class=class' ...] [`--users=users'] [`--hotkey=key']
{ COMMAND; ... }
以 TITLE 为名字建立菜单项。当进入这个菜单项后 GRUB 会设定 CHOSEN 变量的值为 TITE,然后
执行花括号内的命令 。最后一条命令成功执行后,如果 OS 内核已经被加载,那么自动执行 boot 命令。
--class 选项可以使用任意次,它把此菜单项归类到某个菜单类别里。菜单类别决定了菜单使用的样式盒。
--users 选项,设置某个特殊的用户才能访问这个菜单。--users=user1 --users=user2 指定两个用户能访
问此菜单。参考:权限管理 50
--hotkey 选项,为菜单项设置一个快捷键,KEY 可以是 某个单个字母,或者是 "tab" "backspace" "
delete " 之一。
实例:
menuentry 'Windows XP' {
insmod fat
search -f /ntldr --set=root
chainloader +1
sendkey enter
}
此命令产生下图的 Windows XP 菜单项。
14.1.2
语法:
submenu
submenu TITLE [`--class=class' ...] [`--users=users'] [`--hotkey=key']
36
{ MENU ENTRIES ... }
定义子菜单,添加一个名为 TITLE 的菜单项,但是这个菜单项包含下级菜单。当进入此菜单时,会显示
花括号内定义的菜单。
--class 选项可以使用任意次,它把此菜单项归类到某个菜单类别里。菜单类别决定了菜单使用的样式盒。
--users 选项,设置某个特殊的用户才能访问这个菜单。参考:权限管理 50
--hotkey 选项,为菜单项设置一个快捷键,KEY 可以是 某个单个字母,或者是 "tab" "backspace" "
delete " 之一。
实例:
menuentry 'Fedora' {
echo 'Fedora'
}
menuentry 'Redhat' {
echo 'Redhat'
}
menuentry 'BSD' {
echo 'Free BSD'
}
submenu 'Other OS' {
menuentry 'Windows 7' {
echo 'Windows 7'
}
menuentry 'Windows XP' {
echo 'Windows XP'
}
}
作为实例因此省略菜单项内部的命令。它会得到如下菜单:
其中 Other OS 包含子菜单,进入 Other OS 后子菜单才显示出来:
37
14.2通用命令
这些命令可以出现在任意位置,既可以使用 GRUB 命令行执行,也可以通过配置文件运行。
14.2.1
语法:
serial
serial [`--unit=unit'] [`--port=port'] [`--speed=speed']
[`--word=word'] [`--parity=parity'] [`--stop=stop']
初始化串口设备。UNIT 是一个介于 0-3 的整数,它指定了串口端口。默认值为 0,它代表了 COM1 端
口。PORT 是搜索 UART1的 I/O 端口。 SPEED 是传输速率,默认为 9600 。WORD 和 STOP 是数据
的 bit 数和结束位 。数据 bit 数必须是 5 到 8,结束位必须是 1 或 2 。默认值是 8 数据位,1 结束位。
PARITY 可用值为:"no" "odd" "even" ,默认值为 "no"
如果不使用 terminal_out 和 terminal_input 指定 serial 为目标设备,串行端口并不用作信息传输。
14.2.2
语法:
terminal_input
terminal_input [`--append'|`--remove'] [terminal1] [terminal2]
显示/设置输入终端。当不使用参数的时候显示当前激活的可用的输入终端。
--append 添加指定终端到激活的输入终端列表中。列表中的任意终端都可以给 GRUB 提供输入。
--remove ,从输入终端列表中删除指定终端。
1 因为计算机内部采用并行数据,不能直接把数据发到 Modem,必须经过 UART 整理才能进行异步传输,
其过程为:CPU 先把准备写入串行设备的数据放到 UART 的寄存器(临时内存块)中,再通过
FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有 FIFO,信息将变得杂乱无章,
不可能传送到 Modem。
38
如果没有使用 --append 和 --remove 但是提供了终端,那么只显示指定终端。
14.2.3
terminal_output
terminal_output [`--append'|`--remove'] [terminal1] [terminal2] ...
显示或者设定输出终端。当不使用参数的时候显示当前激活的可用的输出终端。
--append 添加指定终端到激活的输出终端列表中。列表中的任意终端都会接收 GRUB 的输出。
--remove ,从输出终端列表中删除指定终端。
如果没有使用 --append 和 --remove 但是提供了终端,那么只显示指定终端。
14.2.4
terminfo
terminfo [-a|-u|-v] [term]
通过提供 terminfo 数据库中的项目名设置终端类型,它的值应该类似于 Unix 中 TERM 环境变量的值,
当前可用的终端类型: vt100、 vt100-color、 ieee1275、 dumb 。如果你需要其他的终端类型,请联
系我们,和我们讨论添加新的终端类型。
选项:-a' (`--ascii'), `-u' (`--utf8'), and `-v' (`--visual-utf8') ,控制非 ASCII 字符如何显示,-a 用于只
支持 ASCII 的终端,-u 指定 logically-ordered UTF-8 ,-v visually-ordered UTF-8 。(換句话说在不
支持双向文本的终端 会以合适顺序从左向右显示文本;这对 UTF-8 可能不是很合适,只是一个应急方案).
14.3用于菜单或命令行的命令
这些命令可以用于菜单或命令行。如果你忘记了某个命令可以输入 help 得到帮助。
14.3.1
acpi
语法:
acpi [`-1'|`-2']
[`--exclude=table1,...'|`--load-only=table1,...']
[`--oemid=id'] [`--oemtable=table'] [`--oemtablerev=rev']
[`--oemtablecreator=creator'] [`--oemtablecreatorrev=rev']
[`--no-ebda'] filename ...
现代 BIOS 系统通常都包含高级电源管理(ACPI),并且定义了大量表格用来描述 ACPI 兼容的 OS。
在这某些情况下,默认的 table 不适和你的 OS 。你需要使用这个命令去替换默认的表格。
通常这个命令会在 BIOS 的扩展数据段中修改 RSDP(root system description pointer)。使用了--no-
ebda 选项新的表只被 GRUB 知晓,这可以用于 GRUB 的 EFI 仿真。
14.3.2
badram
语法:
badram addr,mask[,]
39
这个命令使用内存管理器筛选掉指定内存区域的错误内存(通常这意味着损坏)。它在 OS 内核正式启动
之前都有效。启动后的内核会从 GRUB 中得到内存映射。通常 Linux GnuMach FreeBSD 和其他多起
动 OS 都支持这个特性。
此命令的语法格式与 memtest86+ 工具相同。需要提供基地址和掩码。Given a page-aligned address
and a base address / mask pair, if all the bits of the page-aligned address that are enabled by the
mask match with the base address, it means this page is to be filtered.
14.3.3
语法:
blocklist
blocklist file
显示 file 的区块列表。
14.3.4 boot
结束后自动执行。
已经加载内核或者已经执行了 chainloader 命令后,执行 boot 会开始引导。通常 boot 会在菜单内的命令
14.3.5 background_image
background_image IMAGE
载入指定的图片作为背景. 使用这个命令需要载入 gfxterm 模块,并且输出终端要设置为 gfxterm
insmod png
insmod jpeg
insmod vbe
insmod vga
insmod gfxterm
loadfont /boot/2
#载入字体用来显示中文。参见 字体:17
set gfxmode=1024x768
terminal_output gfxterm
# 应该在执行 terminal 命令之前设置 gfxterm 相关的变量。
menuentry "" {
background_image (cd)/boot/theme/
}
menuentry "" {
background_image (cd)/boot/theme/
}
你要自己准备两个 png 文件,它们的分辨率接近 set gfxmode=1024x768 。
14.3.6 cat
cat [--dos] file
显示 FILE 的内容。实例:
grub> cat /etc/fstab
如果设置了--dos 选项那么按照 dos 格式,把 rn 解释为一个换行。否则r 会被显示为一个特殊字符
40
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 "root=$root"
显示当前的根设备
-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 #错误
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="keep" 。通常 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
/
ls (loop0)/
这个命令也可以在 iso 文件中读取文件。
实例,硬盘安装 :
假设文件放置在 winxp 下 F 盘根目录,设备号为 (hd0,msdos7):
loopback fedora /
set root='(fedora)'
linux /isolinux/vmlinuz
initrd /isolinux/
boot
但是 loopback 和磁盘仿真暂时不是一个东西。所以你不能 chainloader (loop0)+1
若需要引导 img 或者 iso ,你需要使用 memdisk,参见 前言->准备 memdisk 1
14.3.30
ls
ls [arg ...]
类似与 linux ls 命令,显示设备或者文件。
无参数时显示所有 GRUB 已知的设备。
45
如果参数是一个设备名那么显示指定设备的属性,如果是个绝对目录那么显示目录内容:
loopback fd0 /
ls (fd0)
ls (fd0)/
14.3.31 normal
normal [FILE]
进入 normal 模式,并且加载配置文件,然后显示 GRUB 菜单。
如果指定了配置文件 FILE 那么加载指定配置文件,否则加载 $prefix/ 配置文件。
在 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 文件,并且把找到的第一个包含这个文件的设备设为根设备。
_label 和 _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
版权声明:本文标题:GRUB2 中文手册 word 版 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1708632253a528147.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论