LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1483|回复: 9

安装debian过程中学习grub的几点心得

[复制链接]
发表于 2006-11-24 09:51:31 | 显示全部楼层 |阅读模式
从sarge开始,grub成为debian的默认boot loader,说明grub有比lilo更高明的地方。但是,像我这样用惯了lilo的人,转到grub来还是有点不习惯。这两天看了grub的一些文档,终于把一些本来不清楚的地方琢磨的有点明白了。现在把自己的一些心得写在这里,希望对那些和我有同样问题的朋友能起到一点帮助。
1、grub是什么?
按照官方文档的说法,grub是一个boot loader,它主要负责pc机自检(POST)以后到操作系统内核获得控制权之间一些工作。如果只是引导本地系统,能正常工作的grub应该包括一下文件:stage1、stage2、*stage1_5、menu.lst。
其中stage1的大小一定是512字节,它要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要用fdisk标记成可启动的)的启动扇区。stage1的主要的也是唯一的作用就是找到你存放在硬盘上某个地方的stage2文件,来完成后续的工作。
stage2文件可以存在在某个特定的文件系统中,比如你分了一个linux分区,在上面创建一个ext2文件系统,然后把这个文件拷贝到这个分区的某个目录下。也可以把stage2直接存放在硬盘的某个位置,也就是未分区的某个地方。不过,好像没有多少人会这么做吧。^_^
因为stage1的容量有限(主引导记录MBR和启动扇区的大小只能够是512字节),所以它对文件系统是无法识别的,那如果你把stage2存放在ext2或者fat格式的文件系统上,它如何来找到这个文件呢?这就要用到上面提到的那些stage1_5的文件了,它们负责解释文件系统。你的stage2放在什么格式的文件系统上,就要调用对应的那个stage1_5文件。比如,你把stage2存放在ext2格式的文件系统上,就需要e2fs_stage1_5;stage2存放在fat格式的文件系统上,就需要fat_stage1_5了。
总的来说,从你按下计算机电源,到debian启动,大概的过程如下:
①按下电源后,计算机自检(POST),如果硬件设备(CPU、内存、硬盘、光驱、各种卡)都没有问题,BIOS会检查各个硬盘的MBR,看有没有可以执行的代码,如果你把grub安装到第一个硬盘的MBR上,那BIOS就会找到它,然后把控制权交个这段代码(其实就是512字节大小的stage1)。
②stage1根据安装时提供的信息,如stage2在什么地方,需不需要加载文件系统的对应的stage1_5文件等,找到stage2文件,并把控制权交给stage2。
③stage2会需要特定位置的menu.lst文件,如果找到,就分析其中的内容,形成操作系统选择菜单(Grub管它叫Menu Interface),如果没有找到menu.lst或者这个文件的格式、内容有错误,那就显示grub的命令行提示符。
④当你选择了菜单中相应的条目,或者输入了相关的命令,就可以看是引导系统了。比如引导linux的话,stage2会负责将vmlinuz和initrd(如果有的话)装载到内存,并把控制全交给vmlinuz。
⑤linux的内容完成对硬件的初始化,并把控制权交给init程序,完成后续的工作了。(后续的工作挺复杂,我还是有点闹不明白,还要继续看文档)
好,说了这么多,可以看到,grub的安装、使用都是和某个linux kernel没有关系的,或许在编译的时候会有什么关系。修改grub的设置是不需要对kernel做任何修改的。
还有就是,我看到一些问题,如何给debian提供的grub加上背景图片。当然可以用一些朋友介绍的方法,自己制作xpm图片,但是也可以用debian提供的。debian有一个叫做grub-splashimages的包,安装了以后会在/boot/grub/下建立一个叫做splashimages的目录,其中就提供了几个挺不错的背景图片,我现在就用了其中的bike背景。在你的/boot/grub/menu.lst文件中加上一行:
splashimage=/boot/grub/bike_gua.xpm.gz(如果选择不同的图片就改后面的文件名,如果你的boot是一个单独分区,可能左面也要改。)
发表于 2006-11-24 10:07:31 | 显示全部楼层
嗯,不错。

补充一个
---------------------------------
如果 LINUX 进不了系统,可以用 LIVE-CD 启动,
挂载原 LINUX 分区,再 chroot  到挂载目录
cd /boot/grub
再执行 grub-install /dev/???
因为 /boot/grub 里放了 那些 stage?? 之类的文件
回复 支持 反对

使用道具 举报

发表于 2006-11-24 16:34:34 | 显示全部楼层
呵呵,比较全面,适合新手理解引导程序,支持一个!
回复 支持 反对

使用道具 举报

发表于 2006-11-24 21:56:33 | 显示全部楼层
grub还有一些bug。总感觉Debian的GRUB不如Fedora Core 1的GRUB在shell里按TAB键列文件名的速度快。
有人用GRUB2吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 19:15:51 | 显示全部楼层
不知道会不会是版本的问题,debian sarge带的是0.95的,etch带的0.97应该会好点吧,虽然我没有觉得速度有什么慢的。哈哈
回复 支持 反对

使用道具 举报

发表于 2006-11-25 21:22:05 | 显示全部楼层
我用sid,不知道是GRUB还是BIOS的问题,前几天就因为按TAB列文件名把JFS弄坏了。
回复 支持 反对

使用道具 举报

发表于 2006-11-26 01:05:00 | 显示全部楼层
有个问题不明白,
stage1如何找到stage1.5继而转到stage2,既然stage1.5是在某个特定的文件系统下且stage1无法识别文件系统?
请教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-26 13:27:20 | 显示全部楼层
这个问题说老实话,我还没有想到。今天又查看了grub的文档。找到这么一段。
stage1
    This is an essential image used for booting up GRUB. Usually, this is embedded in an MBR or the boot sector of a partition. Because a PC boot sector is 512 bytes, the size of this image is exactly 512 bytes.
中文大意:stage 1——这是用来启动grub的基本文件。它一般被写入到MBR或者一个分区的启动扇区中。因为PC的启动扇区大小为512字节,这个文件的大小正好是512字节。
    All stage1 must do is to load Stage 2 or Stage 1.5 from a local disk. Because of the size restriction, stage1 encodes the location of Stage 2 (or Stage 1.5) in a block list format, so it never understand any filesystem structure.
中文大意:stage1所有要完成的工作是从一个本地硬盘上装载stage2或者stage1.5。因为大小的限制,stage1将stage2(或stage1.5)的位置以块列表格式编码,所以,它不了解任何文件系统的结构。
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
jfs_stage1_5
minix_stage1_5
reiserfs_stage1_5
vstafs_stage1_5
xfs_stage1_5
    These are called Stage 1.5, because they serve as a bridge between stage1 and stage2, that is to say, Stage 1.5 is loaded by Stage 1 and Stage 1.5 loads Stage 2. The difference between stage1 and *_stage1_5 is that the former doesn't understand any filesystem while the latter understands one filesystem (e.g. e2fs_stage1_5 understands ext2fs). So you can move the Stage 2 image to another location safely, even after GRUB has been installed.
中文大意:这些都被叫做stage1.5,因为它们在stage1和stage2之间起到桥梁的作用,也就是说,stage1加载stage1.5,stage1.5加载stage2。stage1和stage1.5的区别在于前者不理解文件系统结构而后者了解特定的文件系统。因此,你甚至可以在grub已经安装后,安全地将stage2文件移动到另一个位置。
    While Stage 2 cannot generally be embedded in a fixed area as the size is so large, Stage 1.5 can be installed into the area right after an MBR, or the boot loader area of a ReiserFS or a FFS.
中文大意:stage2因为体积过大,一般无法被写入硬盘的某个特定的连续位置,而stage1.5可以被写入恰好位于MBR或ReiserFS、FFS之后的位置。


根据这段文档,我的理解是正确的,stage1是无法理解文件系统的。那它之所以能找到stage1.5,我想两种可能,第一:安装程序把stage1.5写在紧跟stage1的硬盘位置上,如刚才最后一段些的。第二:安装程序把stage1.5的绝对位置(柱面、扇区)编码到stage1中。我估计第一种可能性比较大。
回复 支持 反对

使用道具 举报

发表于 2006-11-26 19:18:12 | 显示全部楼层
有道理,
应该去查grub的源码
回复 支持 反对

使用道具 举报

发表于 2006-11-26 19:29:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表