grub原理及使用详解
转载请注明出处:http://blog.csdn.net/rosetta
实验环境VMware+CentOS5.4。
本文将会介绍Grub的基础知识、Grub的完整安装引导过程、Linux硬盘分区基本知识等。
grub(GrandUnified Boot Loader)是有名的引导内核程序(另外一款比较有名的是LILO,嵌入式环境使用U-boot、bootloader),它支持多种硬盘分区类型加载(FAT,ext2,ext3,minix,FFS等),支持多系统引导等。现在出的grub2是grub的升级版,提供更多的功能,但一个grub能实现内核正确的引导已经足够了,按这样发展下去,很多开源软件虽然支持的功能越来越强大,但对应的代码量也是非常庞大,这就加大了新人对其学习的难度,也不适于学习。话又说过来,相应软件的原始版本一般都会保留下载,所以可以找其最初始的版本学习。扯远了……
当计算机加电自检后,ROM BIOS加载MBR(主引导扇区,即硬盘第一扇区)中的代码到内存中,这个扇区一共512字节,前446字节内容存放grub(bootloader)的关键引导程序,接着64字节放置硬盘分区表DPT(Disk Partition Table),一共四可以有四个主分区,占64个字节,这也是为什么主分区最多只有四个的原因,最后2个字节是固定的标志0x55AA。当BIOS把引导程序加载到内存后就把控制权交给grub,而后grub的剩余代码将完成其它代码的加载和搬移以及文件系统初始化查找等工作,最终加载内核映像文件,从而把控制权交给真正的内核运行。
在开始讲grub安装之前首先要了解下硬盘的基础知识和Linux硬盘命名规则。
硬盘的基本存储单位为扇区(Sector),每个扇区一般为512bytes。一个硬盘有多个盘片,每个盘片有两面,每面按照同心圆划分为若干磁道,每个磁道划分为若干扇区。比如一个硬盘有2个盘片,每个盘面分65536磁道,每个磁道分1024个扇区,那么硬盘容量就是2盘片*2盘面*65536磁道*1024扇区*512字节 = 128GB。硬盘的主设备号为3。其它设备的主设备号为:1:内存、2:磁盘、3:硬盘、4:ttyx、5:tty、6:并行口、7非命名管道
硬盘分IDE和SCSI两种总线类型,linux下可通过fdisk –l命令查看硬盘属于哪种。Linux下对IDE的设备是以hd命名的,后面加字母a,b,c表示第几块,比如第一个ide设备是hda,第二个是hdb;SCSI以sd命令,同样第一个设备是sda,第二个是sdb。而hda1代表第一块硬盘的第一个分区,硬盘最多可以有四个主分区,数字为1~4,从5 开始就是逻辑分区了,一般情况只有一个主分区用来引导系统,这个分区在windows下来说是C盘,而在linux为hda1或sda1,D,E,F 盘在linux分别为hda5,had6,hda7。
在grub中命名硬盘的方式又有不同,可以打开grub的配置文件/boot/grub/grub.conf查看(即menu.lst文件,这只不过是grub.conf的一个快捷方式,Linux下称符号链接,可通过ln –s menu.lst grub.conf命令完成)。
default=2
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.27)
root (hdX,Y)
kernel /vmlinuz-2.6.27 roroot=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.27.img
其中root (hdX,Y)表示grub的安装位置,X表示第几块硬盘,Y表示第几分区,X、Y都是从0开始编号,比如(hd0,0)表示第1块硬盘第1个分区。即这条命令表示把grub安装在第1块硬盘的第1分区,kernel指名了需要加载的内核映像文件,kernel后的root表示该内核文件位置。在grub中不区分IDE和SCSI,均以hd开始。
现在开始新安装了,可以看看原来的grub版本信息。
从opensource.org或chinaunix下载中心下载grub源码grub-0.97.tar.gz进行安装。
377 tar -zxvf grub-0.97.tar.gz
378 cd grub-0.97
379 ./configure
380 make
381 make install
编译完成后主要生成的主要文件这么几个:
文件所在目录:/boot/grub。
grub:主程序。
stage1:源码目录stage1/s,汇编后便成了一个512字节的img,被写在硬盘的0面0道第1 扇区,即硬盘的主引导扇区。(这512字节还包括分区表DPT以及主引导扇区标志“55AA”)。
*_tage1_5:文件系统的解释代码,根据/boot分区(或/boot所在分区)的具体文件系统类型 而异,如:ext3分区的话就是e2fs_stage1_5。在stage1_5没有被加载以前,系统无法 识别任何文件系统(但是可以通过BIOS中断方式INT 13h读取磁盘指定扇区的内容)。
stage2:grub核心部分。它运行后,会把系统切入保护模式,设置好C运行环境然后寻找 menulist,如果没有的话就执行一个shell,等待我们输入命令。
grub.conf(menu.lst):grub配置文件
我执行makeinstall后,发现原来的grub文件并没有替换成刚编译出来的,所以在当前目录进行了手动拷贝。
387 cp stage1/stage1 /boot/grub/
388 cp stage2/stage2 /boot/grub
389 cp stage2/*_stage1_5/boot/grub
做完这些后执行./grub/grub,然后在grub的shell命令界面执行如图所示命令:
执行find /grub/menu.lst不一定成功,可以试下find /boot/grub/menu.lst或find /menu.lst,总有一条是对的。
最后执行reboot重启系统。
如果上面这步在make install后忘了做,没关系,在系统启动时可以再配置。
一切安装完成后,重启看下新的grub