四、GRUB 接口
GRUB 除了菜单模式,还提供了一个命令模式和 grub shell 。当系统启动并显示菜单时,按 c 键就可以进入命令模式。提示符是 grub> 。
如果你已经成功引导操作系统并登录,可以在 shell 提示符下执行 grub ,这会启动一个 grub shell。提示符也是 grub> 。
GRUB 能够象 bash 一样使用上下键来访问 command history ,ctrl-u、ctrl-k、ctrl-l 等快捷键也可以使用。想要编辑菜单,可以按下 e 键;
想要新增一空白行,可以按下 o 键(当前行之后)或者 O 键(当前行之前)。想要删除当前行,按下 d 键;ESC 键放弃当次修改并返回上级菜单。
有些命令只能在命令模式下,有些命令只能用于配置文件(菜单模式),有些命令在两个模式下都可以使用。下面我们就介绍 GRUB 常用的命令。
五、GRUB 常用命令
5.1 只能用于配置文件的命令
下面这5个命令只能出现于配置文件中,分别是 :
a)default :定义默认引导的操作系统。0 表示第一个操作系统,1表示第2个,依此类推
b)fallback :如果 default 所指定的操作系统引导失败,则默认引导由 fallback 指定的操作系统
c) hiddenmenu :用于启动时隐藏菜单,除非在 timeout 之前按下 ESC 才能看到菜单。
d)timeout :定义多少秒内如果用户没有按下键盘上的某个按键,就自动引导 default 所指定的操作系统。
e)title :定义引导项目的名称。
f)password :用于定义进入 GRUB 命令模式的密码。你还可以为每个操作系统都定义一个密码,方法是把 password 命令放在 title行之后。
而且每个操作系统的引导密码可以不同,也可以和进入命令模式的那个密码不同,最大程度的保证 GRUB 的安全。
5.2 只能用于命令模式或者 grub shell 的命令
a)device :用于定义 BIOS 中的磁盘设备和操作系统的磁盘设备之间的映射关系。
例如 device (hd0)/dev/hdb 把 BIOS 中的第一个硬盘相当于 Linux 的 /dev/hdb
b)serial :用于初始化一个串口设备。
例如 :serial --unit=0 --speed=9600 表示初始化 COM1(--unit=0),速率为 9600 Baud
不过 grub shell 下执行该命令会显示 “无法识别的命令”
c)terminal :用于切换显示输出。有两这个值可选 :console 和 serial 。当你把笔记本接到一个没有显示器/键盘的主机上时,执行
terminal serial 就可以在你的笔记本上操作这台主机的 GRUB 了。执行 terminal console 把显示输出还原到该主机。
不过 grub shell 下执行该命令会显示“无法识别的命令”
d)splashimage :用于定义启动时的背景图片。例如 splashimage /grub/splash.xpm.gz
经过测试,发现用 tarball 安装的不支持该命令,这似乎是 redhat grub rpm 专有的。
e)blocklist :用于显示某个文件在文件系统中的位置,以 block list 的形式显示。例如 blocklist /vmlinuz
f)ca :用于显示文件内容。由于 GRUB 可以直接访问多种文件系统,所以可以用 cat (hd0,1)/etc/passwd 来在 GRUB 命令模式下查看 /etc/passwd 文件
g)root :用于指定含有 stage 文件的分区。如果有 /boot 分区,则 root device 就是 /boot 分区,否则
就是 / 分区。
h)rootnoverify :和 root 类似,但不会尝试挂载该分区。例如用于指定 windows 操作系统所在的分区。
i)chainloader :用于加载另外一个 boot loader ,通常是用于加载 windows 的 boot loader 。它的参数是一个 block list ,
例如 chainloader (hd0,0)0+1 表示加载第一个磁盘的第一个分区的第1块,0 是开始位置(block 从0开始编号),+1 表示总共读取多少个 block。
所以 chainloader 2+0 表示读取第3个block (编号为2)
j)find :可以用于在所有分区上搜索文件。注意,是所有分区,而不是某个分区。例如 find /vmlinuz 将会在所有分区上查找位于该分区的顶级目录下的
vmlinuz文件,如果找到就打印该分区名,例如 (hd0,1)。
k)geometry :用于显示或者设置某个硬盘的 CHS 参数,同时还显示分区信息。例如 geometry (hd0)
l)halt :关机
m)reboot :重启机器
n)kernel :指定操作系统内核文件,还可以在内核文件名后加上参数。例如
kernel /vmlinuz ro root=LABEL=/
表示以只读的方式挂载 / 分区,且根分区设备是 label 为 / 的那个设备;也可以直接给出设备名。
o)initrd :用于指定 RAM Disk 文件,例如 initrd /initrd-2.xx.img 。
p)boot :引导 kernel 所指定的内核,对于 linux 来说,必须先加载了 kernel 和 initrd 才能执行 boot 。
q)setup :用于安装 stage1 到磁盘的 MBR 或者某个分区的引导扇区。
六、保护 GRUB 设置
下面是一个例子
[Copy to clipboard]CODE:
password --md5 <密码1>
timeout=30
default=0
title “redhat AS 4”
password --md5 <密码2>
root (hd0,1)
kernel /vmlinuz ro root=LABEL=/
initrd /initrd-xxx.img
title “windows”
password --md5 <密码3>
rootnoverify (hd0,0)
chainloader +1
当出现 GRUB 菜单时,必须按下 p 并输入 <密码1> 才能进入命令模式,如果选择 “redhat AS 4”并按下回车,会出现提示信息,要求输入密码,
这时应该输入 <密码2>。同样只有输入 <密码3> 才能进入 windows 系统。--md5 告诉 GRUB 后面的内容是已经用 md5 算法加密过的了。所以 GRUB
会将你输入的口令用 MD5 加密后再与之比较。你可以命令模式下用md5crypt 命令或者在 shell 下执行 grub-md5-cypt 来得出一个字符串用 MD5 加密
后的结果,再插入到配置文件中。为每个引导项目设置 GRUB 密码有好处也有坏处 :
a)好处是 :你可以禁止用户随便引导某个操作系统,即使普通用户可以接触GRUB 菜单,没有密码也没有用;
b)坏处是 :如果你一旦重启机器,就必须手工输入口令,否则会一直停在那里。如果你是在半夜远程重启某个主机的话…. Hoho
c)建议 :只设置 GRUB 密码,也就是限制用户进入命令模式,具体菜单项不设置密码。