songhuanlinux 2007-01-03
从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是一个单独分区,可能左面也要改。)