linux上常用的两种引导程序:lilo,grub

由于lilo不支持大硬盘,因此主要使用在嵌入式平台上

grub作为一个引导程序,由于其丰富的特性,而MBR只有512bytes,又因为MBR中要包含分区表64bytes,还有4bytes用于保存magic,所以在MBR中bootloader实际可以占据的空间只有446bytes,无法存储具有丰富功能的GRUB程序,因此grub是分段的:stage1,stage1.5,stage2

         stage1是存储在MBR中的,不在是传统的引导程序去引导内核,而是引导位于硬盘上的stage2,stage2则实现引导内核,由于内核是存储在文件系统上的,所以为了让stage2可以识别不用类型的文件系统,stage1.5就是用于让stahe2具有识别不同文件系统的能力,一般/boot会单独分区,stage2和内核都是在该分区上,可能会产生为什么stage2引导内核需要识别文件系统,stage1却可以在该分区上引导stage1.5和stage2,这是由于stage1引导方式比较特殊的原因

     grub(stage2)的配置文件:/boot/grub/grub.conf

             default=0;默认使用哪个title,由于可以有多个内核存在,在该配置文件中,每一个内核需要在一个title的配置片段中,所以用title来标示默认引导的内核

              timeout=5超时时间

             hiddenmenu隐藏菜单

              password 加密grub(仅在系统启动时,编辑修改grub特性的时候才需要输入密码),在该配置文件中使用明文存储

              password -md5(使用grub-md5命令加密密码后,将提取的密码的特征码卸载此处)在该配置文件中加密存放密码

             title my linux(标题)

                 root (hd0,0)内核所在的分区,grub识别硬盘都是hd

                 kernel /vmlinuz内核文件,由于GRUB不是通过根文件系统查找的,是直接在该分区查找,所以当boot单独分区的时候,对于GRUB看来,vmlinux的父目录就是/

                 initrd /initrd.gz(initrd文件,该文件的目的就是给内核提供访问根的硬盘驱动程序和文件系统)

                 password 也可在title中设置密码,只不过在每次系统启动都需要输入密码


安装grub:

     安装stage1

           grub命令进入grub提示符下

                      grub>find(hd0,0)/《Yab》      使用find命令查找到boot分区所在磁盘

                      grub>setup(hd0)          安装stage1到目标磁盘

     第二种安装方式:

            grub-install --root-directory=/ /dev/sdb1 使用grub-install 命令安装会将stage1和stage2两段都安装,从选项也可以看出,root-directory用于指明boot分区的父目录,grub-install程序会在该目录下寻找boot分区,然后将grub目录安装,但是没有grub.conf配置文件,最后指定boot分区所在的磁盘,用于安装stage1至磁盘的第一扇区


如果grub.conf配置文件丢失,如何启动?

             如果grub.conf配置文件丢失,在启动时就会进入grub提示符下,使用find命令查找到boot分区,然后手动指定grub的stage2需要的配置选项,如果find查找到到的boot分区在(hd0,0)

           root(hd0,0)

           kernel /vmlinuz

           initrd /initrd.gz

使用find命令的时候:find (hd0,0)/再敲tab键可以显示该分区下的内容

wKiom1YsWrGRAp31AAJE7Cqlqa4825.jpg    kernel /vmlinuz后如果参数的话,在有些情况下可能会出现问题

grub装载内核,内核初始化的过程‘

            1.设备探测

            2.驱动初始化(需要从initrd文件中装载驱动模块)

            3.以只读方式挂载根文件系统

            4.装载第一个进程init