软件工程

本类阅读TOP10

·PHP4 + MYSQL + APACHE 在 WIN 系统下的安装、配置
·Linux 入门常用命令(1)
·Linux 入门常用命令(2)
·使用 DCPROMO/FORCEREMOVAL 命令强制将 Active Directory 域控制器降级
·DirectShow学习(八): CBaseRender类及相应Pin类的源代码分析
·基于ICE方式SIP信令穿透Symmetric NAT技术研究
·Windows 2003网络负载均衡的实现
·一网打尽Win十四种系统故障解决方法
·数百种 Windows 软件的免费替代品列表
·收藏---行百里半九十

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
在 Grub 中增加一个显示举例的命令

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

在 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 的命令行界面...

 




相关文章

相关软件