默认的,启动载入器接口对于任意可以物理进入控制台的人都是可访问的:任何人可以选择并编辑任意菜单项,并且可以直接访问一个GRUB shell。对于绝大多数系统,这是合理的,因为任何可以直接访问物理设备的人,有各种方法得到完全的访问,在启动载入器级别要求认证,只会使恢复崩溃的系统变得困难。
不过,在某些环境下,比如kiosks,锁住启动载入器,在执行某些操作之前要求认证,可能是合适的。
命令‘password’(参考14.3.33节【password】,43页)及‘password_pbkdf2’(参考14.3.34节【password pbkdf2】,43页)可以用来定义用户,每一个具有关联的口令。‘password’设置纯文本形式的口令,要求加密‘grub.cfg’;‘password_pbkdf2’使用基于口令的密钥导出函数(Password-Based Key Derivation Function(RFC 2898))来设置口令哈希,要求使用grub-mkpasswd-pbkdf2(参考第21章【调用grub-mkpasswd-pbkdf2】,79页)来产生口令哈希值。
为了激活认证支持,环境变量‘superusers’必须被设置为一组用户名,以空格,逗号,分号,|,或&分隔。超级用户允许使用GRUB命令行,编辑菜单项,及执行任意菜单项。如果设置了‘superusers’,那么命令行的使用自动地,仅限于超级用户。
其它用户可能通过,使用选项‘--users’的‘menuentry’命令(参考14.1.1节【menuentry】,36页)给出一组用户名(如上),允许访问特定菜单项。A如果对一个菜单项没有使用选项‘--users’,那么该项是未限定的。
总结起来,一个典型的‘grub.cfg’片段看起来可能像这样:
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.biglongstring
password user1 insecure
menuentry "May be run by any user" {
set root=(hd0,1)
linux /vmlinuz
}
menuentry "Superusers only" --users "" {
set root=(hd0,1)
linux /vmlinuz single
}
menuentry "May be run by user1 or a superuser" --usersuser1 {
set root=(hd0,2)
chainloader +1
}
程序grub-mkconfig还没有对生成带认证的配置文件提供内建的支持。你可以使用‘/etc/grub.d/40_custom’来添加简单的超级用户认证,通过添加set superusers=及password或 password_pbkdf2命令。
对X86的支持总结在下表中。“Yes”表示该内核工作在给定的平台,“crashes”表示一个早期的内核崩溃,我们希望它将被有关的内核开发人员所解决。“no”表示GRUB在一个给定的平台上不能载入该内核。“headless”表示该内核可以工作,不过缺乏控制台驱动(你仍然可以使用串行或网络控制台)。对于“no”或“crashes”的情绪,在脚标中 给出原因。
BIOS Coreboot
BIOS chainloading yes no (1)
NTLDR yes no (1)
FreeBSD bootloader yes crashes(1)
32-bit kFreeBSD yes crashes (2,6)
64-bit kFreeBSD yes crashes (2,6)
32-bit kNetBSD yes crashes (1)
64-bit kNetBSD yes crashes (2)
32-bit kOpenBSD yes yes
64-bit kOpenBSD yes yes
Multiboot yes yes
Multiboot2 yes yes
32-bit Linux(legacy protocol) yes no (1)
64-bit Linux(legacy protocol) yes no (1)
32-bit Linux(modern protocol) yes yes
64-bit Linux(modern protocol) yes yes
32-bit XNU yes ?
64-bit XNU yes ?
32-bit EFIchainloader no(3) no (3)
64-bit EFIchainloader no(3) no (3)
Appleloader no(3) no (3)
Multiboot Qemu
BIOS chainloading no (1) no (1)
NTLDR no (1) no (1)
FreeBSD bootloader crashes (1) crashes (1)
32-bit kFreeBSD crashes (6) crashes (6)
64-bit kFreeBSD crashes (6) crashes (6)
32-bit kNetBSD crashes (1) crashes (1)
64-bit kNetBSD yes yes
32-bit kOpenBSD yes yes
64-bit kOpenBSD yes yes
Multiboot yes yes
Multiboot2 yes yes
32-bit Linux(legacy protocol) no (1) no (1)
64-bit Linux(legacy protocol) no (1) no (1)
32-bit Linux(modern protocol) yes yes
64-bit Linux(modern protocol) yes yes
32-bit XNU ? ?
64-bit XNU ? ?
32-bit EFIchainloader no(3) no (3)
64-bit EFIchainloader no(3) no (3)
Appleloader no(3) no (3)
32-bit EFI 64-bitEFI
BIOS chainloading no (1) no (1)
NTLDR no (1) no (1)
FreeBSD bootloader crashes (1) crashes (1)
32-bit kFreeBSD headless headless
64-bit kFreeBSD headless headless
32-bit kNetBSD crashes (1) crashes (1)
64-bit kNetBSD yes yes
32-bit kOpenBSD headless headless
64-bit kOpenBSD headless headless
Multiboot yes yes
Multiboot2 yes yes
32-bit Linux(legacy protocol) no (1) no (1)
64-bit Linux(legacy protocol) no (1) no (1)
32-bit Linux(modern protocol) yes yes
64-bit Linux (modernprotocol) yes yes
32-bit XNU yes yes
64-bit XNU yes (5) yes
32-bit EFIchainloader yes no (4)
64-bit EFIchainloader no(4) yes
Appleloader yes yes
IEEE1275
BIOS chainloading no (1)
NTLDR no (1)
FreeBSD bootloader crashes (1)
32-bit kFreeBSD crashes (6)
64-bit kFreeBSD crashes (6)
32-bit kNetBSD crashes (1)
64-bitkNetBSD ?
32-bitkOpenBSD ?
64-bitkOpenBSD ?
Multiboot ?
Multiboot2 ?
32-bit Linux(legacy protocol) no (1)
64-bit Linux(legacy protocol) no (1)
32-bit Linux(modern protocol) ?
64-bit Linux(modern protocol) ?
32-bit XNU ?
64-bit XNU ?
32-bit EFIchainloader no(3)
64-bit EFIchainloader no(3)
Appleloader no(3)
PowerPC 及Sparc移植仅支持Linux。MIPS移植支持Linux及multiboot2。
正如在前面章节中看到的,这个支持的表格相当大,并且某些配置很少用到。为了确保对于所有x86平台,除了EFI链式载入器,Appleloader,及XNU以外,有优良的启动测试可用 。所有x86平台,除了ieee1275,都有启动测试设施。Multiboot,multiboot2,BIOS链式载入器,ntldr及freebsd-bootloader启动目标仅以一个假的内核映像测试。只有Linux是在使用Linux规程的有效内容中测试的,
以下变量必须被定义:
GRUB PAYLOADS DIR 包含所要求内核的目录
GRUB CBFSTOOL 来自Coreboot 包的cbfstoll(仅用于coreboot平台)
GRUB COREBOOT ROM 空的Coreboot ROM
GRUB QEMU OPTS 向QEMU提供的额外选项
要求的文件有:
kfreebsd env.i386 32-bit kFreeBSD设备提示
kfreebsd.i386 32-bit FreeBSD内核映像
kfreebsd.x86_64, 类似的,来自64-bit kFreeBSD
kfreebsd env.x86_64
knetbsd.i386 32-bit NetBSD内核映像
knetbsd.miniroot.i386 32-bit kNetBSDminiroot.kmod.
knetbsd.x86_64, 类似的,来自64-bit kNetBSD
knetbsd.miniroot.x86_64
kopenbsd.i386 32-bit OpenBSD kernel bsd.rd 映像
kopenbsd.x86 64 类似的,来自64-bit kOpenBSD
linux.i386 32-bit Linux
linux.x86 6464-bit Linux
GRUB的普通的启动过程涉及,设置环境变量‘prefix’为由grub-install在core映像中设定的一个值,设置要匹配的变量‘root’,从prefix载入‘normal’模块,运行命令‘normal’(参考14.3.30节【normal】,42页)。这个命令负责读入 ‘/boot/grub/grub.cfg’,运行这个菜单,并执行所有GRUB假定会做的有用的事。
如果,相反,你只得到一个救援shell,这通常意味着GRUB出于某种原因不能载入 ‘normal’模块。它可能可以暂时地绕过之:比如,如果错误的原因是‘prefix’是错误的(可能它指向错误的设备,或可能到‘/boot/grub’的路径相对于该设备是不正确的),那么你可以修正之,并手动进入普通模式:
# Inspect the current prefix (and otherpreset variables):
set
# Find out which devices are available:
ls
# Set to the correct value, which might besomething like this:
set prefix=(hd0,1)/grub
set root=(hd0,1)
insmod normal
normal
不过,任何会导致你进入救援shell的问题,可能意味着GRUB没有正确安装。使用grubinstall设备(参考第19章【调用grub-install】,75页)尝试重写正确安装GRUB可能更有用。在这样做时,要记住几件事:
l 在你的操作系统上的驱动次序,可能与你的固件所使用的驱动启动次序不一样。不要假定你的第一个硬盘驱动(即,‘/dev/sda’)就是你的固件将从之启动的。‘device.map’(参考3.3节【设备映射】,7页)可以用于改写它,不过使用UUID或文件系统标签更好些,能完全避免设备的依赖。
l 至少在BIOS系统上,如果你告诉grub-install在一个分区上安装GRUB,但GRUB已经被安装在主启动记录中,那么在这个分区上GRUB的安装将被忽略。
l 如果可能,通常最好避免把GRUB安装到一个分区上(除非它是一个专门为GRUB使用的特殊分区,比如用在GPT中的BIOS启动分区)。这样做意味着GRUB可能,因为一个文件系统移动了数据块,比如在清除碎片,运行检查,或甚至普通操作期间,不能读入其core映像。安装到整个硬盘通常更牢靠些。
l 检查GRUB真的知道如何从设备及包含‘/boot/grub’的文件系统读入。它将不能从加密设备读入,也不能从尚未被GRUB支持的文件系统中读入。
程序grub-install,在你的驱动上,使用grub-mkimage及(在某些平台上)grub-setup安装GRUB。你必须指定你所希望安装GRUB的驱动名,像这样:
grub-install install_device
驱动名install_device是一个OS设备名或一个GRUB设备名。
grub-install接受以下选项:
‘--help’ 打印该命令行的一个摘要并退出。
‘--version’ 打印GRUB的版本号并退出。
‘--boot-directory=dir’
在目录‘dir/grub/’下安装GRUB。当你希望把GRUB安装到一个独立的分区或一个可移动的硬盘时,这个选项是有用的。
如果没有指定这个选项,那么它缺省为‘/boot’,因此
grub-install/dev/sda
等效于
grub-install--boot-directory=/boot/ /dev/sda
这里是一个例子,你有一个独立的,安装在‘/mnt/boot’的启动分区:
grub-install--boot-directory=/mnt/boot /dev/sdb
‘--recheck’
重新检查设备映射,即便已经存在‘/boot/grub/device.map’。任何时候从你的计算机添加或移去一个硬盘时,你都应该使用这个选项。
程序grub-mkconfig为GRUB产生一个配置文件(参考5.1节【简单配置】,11页)。
grub-mkconfig -o /boot/grub/grub.cfg
grub-mkconfig接受以下选项:
‘--help’ 打印该命令行的一个摘要并退出。
‘--version’ 打印GRUB的版本号并退出。
‘-ofile’
‘--output=file’
把产生的配置文件发送给file。缺省是发送给标准输出。
程序grub-mkpasswd-pbkdf2为GRUB生成口令哈希(参考第15章【安全】,48页)。
grub-mkpasswd-pbkdf2
grub-mkpasswd-pbkdf2接受以下选项:
‘-cnumber’
‘--iteration-count=number’
底层伪随机数函数的迭代次数。缺省为10000。
‘-lnumber’
‘--buflen=number’
所产生哈希的长度。缺省为64。
‘-snumber’
‘--salt=number’
Salt的长度。缺省为64。
程序grub-mkrescue产生一个可启动的GRUB救援映像(参考3.2节【制作一个GRUB可启动的CD-ROM】,7页)。
grub-mkrescue -o grub.iso
没有显式列出所有的参数,因为选项grub-mkrescue直接传给在mkisofs模拟模式中的xorriso。传给xorriso的选项通常将被解释为mkisofs的选项;如果使用了选项‘--’,那么后面跟着的东西将被解释为xorriso自己的选项。
非选项参数指定额外的源目录。这通常用于向映像中加入额外的文件:
mkdir -p disk/boot/grub
(向‘disk/boot/grub’加入额外文件)
grub-mkrescue -o grub.iso disk
grub-mkrescue接受以下选项:
‘--help’ 打印该命令行的一个摘要并退出。
‘--version’ 打印GRUB的版本号并退出。
‘-ofile’
‘--output=file’
把输出保存入file。这个选项是必要的。
‘--modules=modules’
把具名的GRUB模块预载入映像中。modules中的多个项应该由空格分隔(因此你将可能需要在你的shell中引用之)。
‘--rom-directory=dir’
如果为QEMU或Coreboot平台产生映像,除了把生成的文件‘qemu.img’或‘coreboot.elf’ 包括入映像中,还分别把它们拷贝入目录dir。
‘--xorriso=file’
把file用作程序xorriso,而不是使用内建的。
‘--grub-mkimage=file’
把file用作程序grub-mkimage,而不是使用内建的。
略
略
略
略