在 Grub 中增加一个显示举例的命令
lu_yi_ming(at)sina.com 2004.5.30
最近用 Grub 的时候比较多,感觉到命令行的帮助信息太少,使用的时候又不能像操作系统启动后可以打开详细的文档边看边操作,很不方便,于是就找来源代码,增加了一个命令“example [1|2|3]”,分别显示启动 Linux、FreeBSD、Windows 的命令行代码例子。
我的操作环境:Redhat Linux 8.0,Grub 0.92
步骤:
1. 去 http://www.gnu.org/software/grub/grub.en.html 下载源代码。
2. 修改 stage2/builtins.c,在最后的
struct builtin *builtin_table[] =
之前增加以下代码:
/* example */
static int
example_func (char *arg, int flags)
{
char *example_info_1 = ""
"Boot Linux/n"
"--------------------------------------------------------------/n"
" 1. Set GRUB's root device to the same drive as GNU/Linux's. Probably/n"
" the command `find /boot/vmlinuz' , 'root (hd0,5) or similar can /n"
" help you./n"
" 2. Load the kernel:/n"
" grub> kernel /vmlinuz root=/dev/hda1/n"
" If you need to specify some kernel parameters, just append them to/n"
" the command. For example, to set `vga' to `ext', do this:/n"
" grub> kernel /vmlinuz root=/dev/hda1 vga=ext/n"
" See the documentation in the Linux source tree for complete/n"
" information on the available options./n"
" 3. If you use an initrd, execute the command `initrd' after `kernel':/n"
" grub> initrd /initrd/n"
" 4. Finally, run the command `boot'./n"
"----------------------------------------------/n"
" Boot my Linux 2.4.18-14/n"
" root (hd0,10)/n"
" kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ hdd=ide-scsi/n"
" initrd /boot/initrd-2.4.18-14.img/n"
" boot";
char *example_info_2 = ""
"Boot FreeBSD/n"
"--------------------------------------------------------------/n"
"GRUB can load the kernel directly, either in ELF or a.out format. But/n"
"this is not recommended, since FreeBSD's bootstrap interface sometimes/n"
"changes heavily, so GRUB can't guarantee to pass kernel parameters/n"
"correctly./n"
" Thus, we'd recommend loading the very flexible loader `/boot/loader'/n"
"instead. See this example:/n"
" grub> root (hd0,a)/n"
" grub> kernel /boot/loader/n"
" grub> boot";
char *example_info_3 = ""
"Load another boot loader to boot unsupported operating systems/n"
"--------------------------------------------------------------/n"
"If you want to boot an unsupported operating system (e.g. Windows 95),/n"
"hain-load a boot loader for the operating system. Normally, the boot/n"
"loader is embedded in the /"boot sector/" of the partition on which the/n"
"operating system is installed./n"
" 1. Set GRUB's root device to the partition by the command/n"
" `rootnoverify'/n"
" grub> rootnoverify (hd0,0)/n"
" 2. Set the /"active/" flag in the partition using the command/n"
" `makeactive'(1)/n"
" grub> makeactive/n"
" 3. Load the boot loader with the command `chainloader' /n"
" grub> chainloader +1/n"
" `+1' indicates that GRUB should read one sector from the start of/n"
" the partition. /n"
" 4. Run the command `boot'.";
switch (arg[0])
{
case '1':
grub_printf (example_info_1);
break;
case '2':
grub_printf (example_info_2);
break;
case '3':
grub_printf (example_info_3);
break;
default:
grub_printf ("example [1|2|3] /n/n"
" exmple 1 : boot Linux/n"
" exmple 2 : boot FreeBSD/n"
" exmple 3 : boot Windows");
}
return 0;
}
static struct builtin builtin_example =
{
"example",
example_func,
BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
"example [1|2|3]",
"Show examles , page 1|2|3"
};
3. 继续修改 stage2/builtins.c,在最后的
struct builtin *builtin_table[] =
中增加 example 的定义
struct builtin *builtin_table[] =
{
&builtin_blocklist,
...
&builtin_embed,
&builtin_example,
&builtin_fallback,
...
&builtin_vbeprobe,
0
};
4. 编译、安装,不用详细说了
./configure
make
make install
5. 测试一下,在命令行中输入 grub,然后按 Tab 键看看有没有 example,如果有,说明代码编写成功,可以继续输入 example 1 看看是否是启动 Linux 的举例。
6. 将修改后的 Grub 安装到硬盘主引导记录等地方,以便真正起效。
grub-install /dev/hda
7. 重新启动计算机,可以发现原来 Redhat 漂亮的 Grub 彩色界面没有了,变成了黑乎乎的界面。这算是一点损失吧。按 c 进入 Grub 的命令行界面...