Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366835
  • 博文数量: 245
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3094
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 14:51
文章存档

2011年(2)

2009年(152)

2008年(91)

我的朋友

分类: LINUX

2009-01-27 14:32:10

  grub 的设定档 /boot/grub/menu.lst 与安装型态

  grub 是较新的 boot loader ,他的优点很多,包括:

  * 认识与支援较多的 filesystem ,并且可以使用 grub 的主程式直接在 filesystem 当中搜寻核心;
  * 开机的时候,可以‘自行编辑与修改开机设定项目’,类似 bash 的指令模式;
  * 可以动态搜寻设定档,而不需要在修改设定档后重新安装 grub 。亦即是我们只要修改完 /boot/grub/menu.lst 里头的设定后,下次开机就生效了!

  上面第三点其实就是 Stage 1, Stage 2 分别安装在 MBR 与 filesystem 当中的原因啦! 好了,接下来,让我们好好瞭解一下 grub 的设定档: /boot/grub/menu.lst 这玩意儿吧! 要注意喔,那个 lst 是 LST 的小写,不要搞错啰!

  # 与硬碟的关系:
  既然 grub 主程式是安装在 MBR ( super block ) 当中,并且动态去搜寻设定档的资讯, 所以啰,他必须要认识硬碟才行啊!那么 grub 到底是如何认识硬碟的呢? 嘿嘿! grub 对硬碟的代号设定与传统的 Linux 磁碟代号可完全是不同的! 他的代号有点像:

  (hd0,0) 意为第一个硬盘的第一个分区。

  够神了吧?跟 /dev/hda1 风马牛不相干~怎么办啊?其实只要注意几个东西即可, 那就是:

  * 硬碟代号以小括号 ( ) 包起来;
  * 硬碟以 hd 表示,后面会接一组数字;
  * 以‘搜寻顺序’做为硬碟的编号,而不是依照硬碟排线的排序!(这个重要!搜寻顺序在BIOS里面设定。)
  * 第一个搜寻到的硬碟为 0 号,第二个为 1 号,以此类推;
  * 每颗硬碟的第一个 partition 代号为 0 ,依序类推。

  所以说,第一颗‘搜寻到的硬碟’代号为:‘(hd0)’,而该颗硬碟的第一号 partition 为 ‘(hd0,0)’这样说,容易瞭解了吧!?在传统的主机板上面, 通常第一颗硬碟就会是 /dev/hda,所以常常我们可能会误会 /dev/hda 就是 (hd0) , 其实不是喔!要看您 BIOS 的设定值才行! 有的主机板 BIOS 可以调整开机的硬碟搜寻顺序,那么就要注意了,因为 grub 的硬碟代号可能会跟著改变呐!留意留意! 所以说,整个硬碟代号为:

  硬碟搜寻顺序    在 Grub 当中的代号
  第一颗    (hd0) (hd0,0) (hd0,1) (hd0,4)....
  第二颗    (hd1) (hd1,0) (hd1,1) (hd1,4)....
  第三颗    (hd2) (hd2,0) (hd2,1) (hd2,4)....

  这样应该比较好看出来了吧?第一颗硬碟的 MBR 安装处的硬碟代号就是‘(hd0)’, (MBR不在任何一个分区里,MBR在第一个硬盘的第一个磁道里,MBR里包含分区表。)而第一颗硬碟的第一个 partition 的 Super block 代号就是‘(hd0,0)’第一颗硬碟的第一个 logical partition 的 super block 代号为‘(hd0,4)’瞭了吧!

  # /boot/grub/menu.lst 设定档:
  瞭解了 grub 当中最麻烦的硬碟代号后,接下来,我们就可以瞧一瞧设定档的内容了。 先看一下鸟哥的 FC4 内的 /boot/grub/menu.lst 好了:

  [root@linux ~]# vi /boot/grub/menu.lst
  default=0
  timeout=5
  splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  hiddenmenu

  title Fedora Core (2.6.12-1.1456_FC4)
  root (hd0,0)
  kernel /boot/vmlinuz-2.6.12-1.1456_FC4 ro root=/dev/hda1 quiet vga=787
  initrd /boot/initrd-2.6.12-1.1456_FC4.img

  title Fedora Core (2.6.11-1.1369_FC4)
  root (hd0,0)
  kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda1 quiet vga=787
  initrd /boot/initrd-2.6.11-1.1369_FC4.img

  在 title 以前的前四行,都是属于 grub 的整体设定,包括预设的等待时间与预设的开机项目, 还有显示的画面特性等等的项目。至于 title 后面才是指定开机的核心档案或者是 boot loader 控制权。 在整体设定方面的项目主要常见的有:

  * default=0
  这个必须要与 title 作为对照。以上表为例,我们不是有两个 title 吗?按照前后顺序来排列, 第一个 title 代表的是 0 ,第二个 title 代表的是 1 ,以此类推~ 这个 default 说的是,如果开机过程当中,您并没有选择其他的项目, 那么就会用预设值 (第 1 个 title) 来开机啦!

  * timeout=5
  这个是开机时,不是会显示选单吗?如果你在几秒内(单位就是秒!)没有按下任何按键, 那就会用 default 那个设定值来进行开机!

  * splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  这个 splashimage 是在选单上面显示的一些图片或者是相关的影像资料啦! 这个设定有个地方比较有趣!因为在开机的过程当中并没有硬碟, 所以我们必须要明确的指出某个档案在那个 partition 内的那个目录; 因此,上面的设定说的是:在 (hd0,0) 那个 partition 内的 /boot/grub/splash.xpm.gz 该档案为开机时显示的画面啦!更多 splash 可以参考: ~mcgrof/grub-images/

  * hiddenmenu
  这个说的是,开机时,是否要显示选单?目前 FC4 预设是不要显示选单, 如果您想要显示选单,那就将这个设定值注解掉!

  整体设定的地方大概是这样,而底下那个 title 则是显示开机的设定项目。 如同前一小节提到的,开机时,可以选择(1)直接指定核心档案开机或 (2)将 boot loader 控制权转移到下个 loader (此过程称为 chain-loader)。每个 title 后面接的是 ‘该开机项目名称的显示’,亦即是在选单出现时,选单上面的名称而已。 那么这两种方式的设定有啥不同呢?

  # 1. 直接指定核心开机

  既然要指定核心开机,所以当然要找到核心档案啦!此外,有可能还需要用到 initrd 的 RAM Disk 设定档案 (通常是放置在 /boot 底下啊!)。但是如前说的, 尚未开机完成,所以我们必须要以 grub 的硬碟认识方式找出完整的 kernel 与 initrd 档名才行。 因此,我们可能需要有底下的方式来设定才行!

  1. 先指定核心档案放置的 partition,再读取档案 (目录树)最后才加入档案的实际档名与路径 (kernel 与 initrd);

  假设仅有一颗硬碟,且仅划分出 /dev/hda1 (亦即根目录为 /dev/hda1)而已:
  root    (hd0,0)    <==代表核心档案放在那个 partition 当中?
  kernel /boot/vmlinuz ro root=/dev/hda1 vga=771
  initrd /boot/initrd
  # root :代表的是‘核心档案放置的那个 partition 而不是根目录’喔!不要搞错了!
  # kernel :至于 kernel 后面接的则是核心的档名,而在档名后面接的则是核心的参数,
  # 在 kernel 后面接的 root 才是‘根目录所在的 partition ’,
  # 另外,核心还可以外加很多的参数喔,例如 vga 即是一个解析度参数!
  # initrd :就是前面提到的 initrd 制作出 RAM Disk 的档案档名啦!

  2. 直接指定 partition 与档名,不需要外接 root !

  kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 vga=771
  initrd (hd0,0)/boot/initrd

  注意到:kernel 后面其实只要接 ‘核心档案档名’与 ‘根目录 (/) 的所在磁碟代号 (用一般 Linux 磁碟代号) 就可以了。 老实说,以第二个方式来书写你的 title 的内容会比较好一点~ 不会造成两个 root 是啥意思的紊乱!上面的案例还很好理解,如果是底下的案例呢? 思考看看:

  例题:
  我的 Linux 主机仅有一颗硬碟,但为了制作多重开机,所以我将 /boot 独立出来成为一个 partition, partition 的对应是‘ /boot → /dev/hda2 ’ ‘ / → /dev/hda1 ’,而且我仅有 kernel file, 档名为 /boot/vmlinuz-2.6.11-1.1369_FC4 请问 grub 当中的 title 要如何写?
  答:

  只要列出 kernel 的档名即可!因为我将 /boot 独立成为 /dev/hda2 ,因此,整个核心档案档名应该是:

  /boot/vmlinuz-2.6.11-1.369FC4 -->
  (/dev/hda2)/vmlinuz-2.6.11-1.1369_FC4 -->
  (hd0,1)/vmlinuz-2.6.11-1.1369_FC4

  因为 /boot 是一个完整的 partition 嘛!所以说,整个核心档案的写法,可以这样做:

  title FC4 default
  kernel (hd0,1)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda1


  因为 vmlinuz-2.6.11-1.1369_FC4 这个档案其实是在 /boot 所在的 partition 上, 而 /boot 是 (hd0,1) ,因此,整个档名就成为 (hd0,1)/vmlinuz-2.6.11-1.1369_FC4 了! 只要你能够瞭解这个档名的来源,那么 grub 对你而言,已经没有什么大问题了! ^_^

  # 2. 利用 chain loader 的方式:

  所谓的 chain loader 仅是在将控制权交给下一个 boot loader 而已, 所以 grub 并不需要认识与找出 kernel file ,‘ 他只是将 boot 的控制权交给下一个 super block 或者是 MBR 内的 boot loader 而已 ’ 所以通常他也不需要去查验下一个 boot loader 的开机磁区啊! 一般来说, chain loader 的设定只要两个就够了,一个是指定开机区的 root partition,另一个则是设定 chainloader 在那个磁区上!所以说,假设我的 Windows 磁区在 /dev/hda1 ,且我又只有一颗硬碟, 那么要 grub 将控制权交给 windows 的 loader 只要这样就够了:

  [root@linux ~]# vi /boot/grub/menu.lst
  ....前略....
  title Windows partition
      root (hd0,0)
      chainloader +1

  那个 root 代表的就是 Windows 的 C 槽啦!而 chainloader 则是载入 boot loader 的定义值, 那个 +1 代表的是‘第一个 sector ’也可以说成 Super block 啊!这样说,理解吗?! 但其实我们的 grub 功能是很强大的!他还可以隐藏某些 partition 呢! 让您的 Windows 不会去读取 Linux 的 partition 啊!举例来说,以上面的例子在延伸, 假设我的 /dev/hda5 是 Linux 的磁碟系统,我想将他隐藏,并且把原先隐藏的 /dev/hda2 开启,并且不去检查 /dev/hda1 的开机区,所以,会变成:

  [root@linux ~]# vi /boot/grub/menu.lst
  ....前略....
  title Windows partition
      unhide (hd0,1)
      hide (hd0,4)
      rootnoverify (hd0,0)
      chainloader +1
      makeactive

  最后那个 makeactive 是让开机区的 boot 项目 (记得用 fdisk -l 的显示结果吗? ^_^) 具有 active 的标志而已啦!有没有加都可以!很简单吧!
  这样一来,您对于 grub 的硬碟以及 menu.lst 的设定应该有一定程度的认识了吧?好~ 接下来,让我们实际的依据您的环境来安装啰~ 在下一小节,我们会以鸟哥自己宿舍的电脑来做解释呢! ^_^

阅读(2032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~