grub 详解2

GRUB 是引导装入器(boot loader) -- 它负责装入内核并引导 Linux 系统。GRUB 还可以引导其它操作系统,如 FreeBSD、NetBSD、OpenBSD、GNU HURD 和 DOS,以及 Windows 95、98、NT 和 2000。尽管引导操作系统看上去是件平凡且琐碎的任务,但它实际上很重要。如果引导装入器不能很好地完成工作或者不具有弹性,那么就可能锁住系统,而无法引导计算机。另外,好的引导装入器可以给您灵活性,让您可以在计算机上安装多个操作系统,而不必处理不必要的麻烦。 
GRUB 是一个很棒的boot loader。它有许多功能,可以使引导过程变得非常可靠。例如,它可以直接从 FAT、minix、FFS、ext2 或 ReiserFS 分区读取 Linux 内核。这就意味着无论怎样它总能找到内核。另外,GRUB 有一个特殊的交互式控制台方式,可以让您手工装入内核并选择引导分区。这个功能是无价的:假设 GRUB 菜单配置不正确,但仍可以引导系统。哦,对了 -- GRUB 还有一个彩色引导菜单。 

# GRUB菜单 # 
先来看一个例子,这是位于/boot/grub/目录下的menu.lst文件。 
此文件将在开机是产生一个菜单,包含有Debian linux,Windows2000,RedHat linux和 Mandrake linux,共四个选择项。我一共分了8个区,一个fat16(0x6),一个ntfs(0x7),三个ext2fs分区(0x83),一个swap分区(0x82)。ntfs用来装win2000,三个ext2fs装了三个linux,c盘fat16分区没有装任何东西。 

#例子由此开始 

# 一个GRUB configure 的例子,对应的配置文件为:/boot/grub/grub.conf # 
#############################  

timeout 10 
default 2 
# --> Debian linux <-- 
title Debian linux 
root (hd0,2) 
kernel /boot/vmlinuz-2.2.18 root=/dev/hda3 ro 
initrd /boot/initrd-2.2.18.gz 
# --> Debian END <-- 

# --> Windows 菜单选项 <-- 
title Windows2000 
root (hd0,0) 
chainloader +1 
# --> Winddows 结束 <-- 

# --> RedHat linux 菜单选项 <-- 
title RedHat linux 
root (hd0, 
chainloader +1 # 在硬盘主引导分区装了lilo,所以也用了chainloader。 
# --> RedHat linux 结束 <-- 

# --> Mandrake linux 菜单选项 <-- 
title Mandrake linux 
root (hd0,5) 
kernel /boot/vmlinuz-2.4.3-20mdk root=/dev/hda6 ro 
initrd /boot/initrd-2.4.3-20mdk.img 
# --> Mandrake linux 结束 <-- 
#例子到此结束 


以符号井"#"开头的行表示被注释掉,没有任何意义。 

timeout表示默认等待的时间
,这儿是10秒钟。超过10秒,用户还没有作出选择的话,系统将自动选择默认的操作系统。 
默认的操作系统就是由default控制的。
default后加一个数字n,表明是第n+1个。需要注意的是,GRUB中,计数是从0开始的,第一个硬盘是hd0,第一个软驱是fd0,等等。所以,default 2 表示默认的操作系统在这儿是 Redhat linux。 
接下来,正如你所想象的,title表示的是“Debian linux”菜单项
。root (hd0,2)表示第一个硬盘,第三个分区。这儿的root 于linux的root分区及其不同,此root非彼root也! 
在 Linux 中,当谈到 "root" 文件系统时,通常是指主 Linux 分区。但是,GRUB 有它自己的 root 分区定义。GRUB 的 root 分区是保存 Linux 内核的分区。这可能是您的正式 root 文件系统,也可能不是。我们讨论的是 GRUB,需要指定 GRUB 的 root 分区。进入 root 分区时,GRUB 将把这个分区安装成只读型,这样就可以从该分区中装入 Linux 内核。GRUB 的一个很“酷”的功能是它可以读取本机的 FAT、FFS、minix、ext2 和 ReiserFS 分区。 

到目前为止,您可能会感到一点疑惑,因为 GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。在 Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,可以发现如果要引导 Linux 硬盘 hda5,应输入 "root (hd0,4)"。 

知道了内核在哪儿,还要具体指出哪个文件是内核文件,这就是kernel的工作。 
kernel /boot/vmlinuz-2.2.18 root=/dev/hda3 ro说明/boot/vmlinuz-2.2.18 就是要载入的内核。后面的都是传递给内核的参数。root=/dev/hda3就是linux的硬盘分区表示法,ro是以readonly的意思。 
initrd用来初始的linux image,并设置相应的参数。 

是不是感觉很简单啊!再来看一看windows的定义段吧。 
这里,我添加了一项来引导 Windows2000。要完成此操作,GRUB 使用了“链式装入器”(chainloader)。链式装入器从分区 (hd0,0) 的引导记录中装入 win2000 自己的引导装入器,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。 

我的RedHat linux在硬盘主引导分区装了lilo,所以也用了chainloader。 

GRUB的配置文件要简单就这么简单,如果你要更个性化一点,试一试把“color light-gray/blue ”加在default语句的下面,下一次启动GRUB时,看看有什么变化,再试一试“color light-blue/red",惊喜吗? 有趣吧! 


GRUB的交互性  

GRUB 最好的优点之一就是其强健的设计 -- 在不断使用它时请别忘了这点。如果更新内核或更改它在磁盘上的位置,不必重新安装 GRUB。事实上,如有必要,只要更新 menu.lst 文件即可,一切将保持正常。 

只有少数情况下,才需要将 GRUB 引导装入器重新安装到引导记录。首先,如果更改 GRUB root 分区的分区类型(例如,从 ext2 改成 ReiserFS),则需要重新安装。或者,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由于它们来自更新版本的 GRUB,很有可能要重新安装引导装入器。其它情况下,可以不必理睬! 

GRUB的最大的特点就是交互性特别强。在开机时,按一下“c”,将进入GRUB 控制台。显示如下: 

GRUB version 0.5.96.1 (640K lower / 3072K upper memory) 

[ Minimal BASH-like line editing is supported. For the first word, TAB 
lists possible command completions. Anywhere else TAB lists the possible 
completions of a device/filename. ] 

grub> 

欢迎使用 GRUB 控制台。现在,再研究命令: 
我将通过GRUB 控制台绕过lilo来启动RedHat linux, 

grub> root (h 

现在,按一次 Tab 键。如果系统中有多个硬盘,GRUB 将显示可能完成的列表,从 "hd0" 开始。如果只有一个硬盘,GRUB 将插入 "hd0,"。如果有多个硬盘,继续进行,在 ("hd2") 中输入名称并在名称后紧跟着输入逗号,但不要按 Enter 键。部分完成的 root 命令看起来如下: 

grub> root (hd0, 

现在,继续操作,再按一次 Tab 键。GRUB 将显示特定硬盘上所有分区的列表,以及它们的文件系统类型。在我的系统中,按 Tab 键时得到以下列表: 

grub> root (hd0, (tab,按tab一下键) 
Possible partitions are: 
Partition num: 0, Filesystem type is fat, partition type 0x6 
Partition num: 2, Filesystem type is ext2fs, partition type 0x83 
Partition num: 4, Filesystem type unknown, partition type 0x7 
Partition num: 5, Filesystem type is ext2fs, partition type 0x83 
Partition num: 6, Filesystem type is fat, partition type 0xb 
Partition num: 7, Filesystem type is fat, partition type 0xb 
Partition num: 8, Filesystem type is ext2fs, partition type 0x83 
Partition num: 9, Filesystem type unknown, partition type 0x82 

如您所见,GRUB 的交互式硬盘和分区名称实现功能非常有条理。这些,只需要好好理解 GRUB 新奇的硬盘和分区命名语法,然后就可以继续操作了 
grub> root (hd0, 
现在已安装了 root 文件系统,到装入内核的时候了 


grub>  kernel /boot/vmlinuz-2.4.2 root=/dev/hda5 ro 
[Linux-bzImage, setup=0x1200, size=0xe1a30] 

您已经安装了 root 文件系统并装入了内核。现在,可以引导了。只要输入 "boot",Linux 引导过程就将开始。是不是很cool啊,GRUB的menu.lst更像一个linux下的脚本程序。 


# GRUB启动盘 # 

因为重新了windows系统,grub坏了,只好自己重新安装上了。

1.先下载grub4dos并安装重新启动进入grub命令模式(这个就不说了,很多有教材)

2.进入linux操作系统
root (hd0,8)
kernel (hd0,8)/boot/vmlinuz-2.6.27.7-134.fc10.i686
initrd (hd0,8)/boot/initrd-2.6.27.7-134.fc10.i686.img
boot

3.重新安装grub到MBR
[jerry@jerry ~]$ cd /boot
[jerry@jerry boot]$ su
密码:
[root@jerry boot]# 
grub
Probing devices to guess BIOS drives. This may take a long time.


GNU GRUB version 0.97 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> root (hd0,8)      ——第一块硬盘的第8个分区,也就是boot所在的分区。
root (hd0,8)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 23 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+23 p (hd0,8)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.
grub> quit
[root@jerry boot]# 

4.重新启动后就可以进入图形化的grub了

ps:
[root@jerry grub]# cat grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,9)不知道这里是怎么回事,变成了9,应该是8,所以要把下面的(hd0,9)全部换成8,否则找不到
# kernel /boot/vmlinuz-version ro root=/dev/sda10
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=2
timeout=30
splashimage=(hd0,8)/boot/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$yN9a5rTU$ktMVYhwhJhnh9DB2pCOLT0
title Fedora (2.6.27.7-134.fc10.i686)
root (hd0,8)
kernel /boot/vmlinuz-2.6.27.7-134.fc10.i686 ro root=UUID=c7bd3111-548f-4561-961d-dcd336ecce3f rhgb quiet
initrd /boot/initrd-2.6.27.7-134.fc10.i686.img
title Fedora (2.6.27.5-117.fc10.i686)
root (hd0,8)
kernel /boot/vmlinuz-2.6.27.5-117.fc10.i686 ro root=UUID=c7bd3111-548f-4561-961d-dcd336ecce3f rhgb quiet
initrd /boot/initrd-2.6.27.5-117.fc10.i686.img
title Windows XP
rootnoverify (hd0,0)
chainloader +1

要制作引导盘,需执行一些简单的步骤。首先,在新的软盘上创建 ext2 文件系统。然后,将其安装,并将一些 GRUB 文件复制到该文件系统,最后运行 "grub" 程序,它将负责设置软盘的引导扇区。准备好了吗? 

将一张空盘插入 1.44MB 软驱,输入: 

# mke2fs /dev/fd0 

创建了 ext2 文件系统后,需要安装该文件系统: 

# mount /dev/fd0 /mnt/floppy 

现在,需要创建一些目录,并将一些关键文件(原先安装 GRUB 时已安装了这些文件)复制到软盘: 

# mkdir /mnt/floppy/boot 
# mkdir /mnt/floppy/boot/grub 
# cp /boot/grub/stage1 /mnt/floppy/boot/grub 
# cp /boot/grub/stage2 /mnt/floppy/boot/grub 

再有一个步骤,就能得到可用的引导盘。 

在linux bash中,从 root 用户运行“grub”,该程序非常有趣并值得注意,因为它实际上是 GRUB 引导装入器的半功能性版本。尽管 Linux 已经启动并正在运行,您仍可以运行 GRUB 并执行某些任务,而且其界面与使用 GRUB 引导盘或将 GRUB 安装到硬盘 MBR 时看到的界面(即GRUB控制台)完全相同。 
在 grub> 提示符处,输入: 

grub> root (fd0) 
grub> setup (fd0) 
grub> quit 

现在,引导盘完成了。 


如果要把GRUB装到硬盘上,也很容易。这个过程几乎与引导盘安装过程一样。首先,需要决定哪个硬盘分区将成为 root GRUB 分区。在这个分区上,创建 /boot/grub 目录,并将 stage1 和 stage2 文件复制到该目录中,可以通过重新引导系统并使用引导盘,或者使用驻留版本的 GRUB 来执行后一步操作。在这两种情况下,启动 GRUB,并用 root 命令指定 root 分区。例如,如果将 stage1 和 stage2 文件复制到 hda5 的 /boot/grub 目录中,应输入 "root (hd0,4)"。接着,决定在哪里安装 GRUB -- 在硬盘的 MBR,或者如果与 GRUB 一起使用另一个“主”引导装入器,则安装在特定分区的引导记录中。如果安装到 MBR,则可以指定整个磁盘而不必指定分区,如下(对于 hda): 

grub>  setup (hd0) 

如果要将 GRUB 安装到 /dev/hda5 的引导记录中,应输入: 

grub> setup (hd0,4) 

现在,已安装 GRUB。引导系统时,应该立即以 GRUB 的控制台方式结束(如果安装到 MBR)。现在,应创建引导菜单,这样就不必在每次引导系统时都输入那些命令。 

小结:在这里只是介绍了 GRUB 的一部分。例如,可以使用 GRUB 来执行网络引导,引导 BSD 文件系统,或更多操作。另外,GRUB 有许多配置和安全性命令也很有用。如需所有 GRUB 功能的完整描述,请阅读 GRUB 出色的 GNU 文档。只要在 bash 提示中输入 "info grub" 就可以阅读该文档。
补充:
 
在刚开机时 ,由于 80x86 的特性 CS ( Code Segment ) 这个寄存器中全部都放着 1 , 而 IP ( Instruction Pointer ) 这个寄存器 中全部都放着 0 , 换句话说 , CS=FFFF 而 IP=0000 。 此时 , CPU 就依据CS 及 IP 的值 , 到FFFF0H 去执行那个地方所放的指令 。这时候 , 由于FFFF0H 已经到了高位址的顶端 , 所以 , FFFF0H 这个地方 , 总是会放一个JMP 指令 ,跳到比较低的位址 。 接著 , ROM BIOS 就会作一些检查的动作像内存 、 键盘 等...... 并在我们俗称的 UMB ( Upper Memory Block )之中扫描 ,看看是否有合法的 ROM 存在 ( 比如 SCSI 卡上的 ROM ) 。假如有就到里面去执行一些东西 , 执行完之后再继续刚才的行程 。 到了最后 , 读取硬盘上的第一个 sector 。 在这里, 我假设各位由硬盘启动。因此 , 就硬盘的构造而言 , 它的第一个 sector 称为 MBR ( Master Boot Record ) 。因为一个 sector 是 512 bytes , 而 MBR 这 512 bytes 可分为两个部份 ,第一个部份为 Pre-Boot 区 , 占了 446bytes; 第二部份是 Partition Table , 占了 66 bytes 。 Pre-Boot 区的作用之一 ,就是去看看哪个 Partition 被标成 Active , 然後去读那个 Partition 的 Boot区 。

   在 Linux 的启动方面 , 一般人最常把 LILO或Grub 放在 MBR 或 Superblock ,假如你把 LILO或Grub 放在 MBR, 那很明显的,当读取到 MBR 的时候 , LILO 或Grub就被执行 。 此时 , 你的屏幕上会出现启动选项接着 , 就进行Load Kernel的动作。在另一方面来说 ,,假如你把 LILO或Grub安装在 Superblock , 通常你还会有一个管理开机的程序, 也许是放在 MBR ( 像 OSBS ) 或者是放在一个单独的 Partition ( 像 OS/2 的 Boot Manager ) 。 再由这个管理开机的程式去读取 LILO或Grub , 进而做 Load Kernel 的动作 。到了目前为止 ,  Kernel 被load 到 memory 中之后 ,接着进行一连串 probe 周边的动作 ,像串口、并口 、 软盘 、 声卡 、 硬盘 、 光驱 等 ...... 接着 mount root partition 。 在这之后 kernel 会起动 init 这个 process 。init 这个 process 的 PID 为 1 ,它是所有 process的祖先 。 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值