一、grub基本功能

   GNU GRUB 和GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。

  在X86架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。

   Windows也有类似的工具NTLOADER;比如我们在机器中安装了Windows 98后,我们再安装一个Windows XP ,在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XP。NTLOADER就是一个多系统启动引导管理器,NTLOADER 同样也能引导Linux,只是极为麻烦罢了。

   在PowerPC 架构的机器中,如果安装了Linux的Powerpc 版本,大多是用yaboot 多重引导管理器,比如Apple机用的是IBMPowerPC处理器,所以在如果想在Apple机上,安装Macos 和Linux Powerpc 版本,大多是用yaboot来引导多个操作系统。

   因为X86架构的机器仍是主流, 所以目前GRUB和LILO 仍然是我们最常用的多重操作系统引导管理器

二、grub阶段

    1、grub legacy

      stage1 : mbr

      stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;提供grub文件系统驱动和基本磁盘分区
      stage2:磁盘分区(/boot/grub/)
        
    2、:/boot/grub/grub.conf <-- /etc/grub.conf (符号链接文件)
    
     stage2及内核等通常放置于一个基本磁盘分区:
         功用:
             (1) 提供菜单、并提供交互式
                  e:编辑模式,用于编辑菜单;
                  c:命令模式,用于交互式接口;
             (2) 加载用户选择的内核或操作系统
                  允许传递参数给内核
                  可隐藏此菜单
             (3) 为菜单提供了保护机制
            
              如何识别设备:
             (hd#,#) 第几个磁盘的第几个分区;
                hd#:磁盘编号,用数字表示;从0开始编号
                # :分区标号,用数字表示;从0开始编号
                (hd0,0)
            
 三、 grub的命令行接口:

       help :获取帮助列表

       help KEYWORD:详细帮助信息

       find(hd#,#)/PATH/TO/SOMEFILE

       root (hd#,#)

       kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdine参数

           例如:init=/path/to/init,selinux=0

       initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk

       boot:引导启动选定的内核   

  

 3.1手动在grub命令行接口启动系统

              wKiom1aHR4XwwfKVAADftb5FDNo456.jpg          

  3.2 配置文件:/boot/grub/grub.conf
      配置项:
       default=#:设定默认启动的菜单项;落单项(title)编号从0开始
       timeout=#:指定菜单项等待选项选择的时长;
       splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;gimp 640x480

       hiddenmenu:隐藏菜单;

       password [--md5] STRING:菜单编辑认证;

      title TITLE:定义菜单项“标题”,可出现多次

                    root(hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
           kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
           initd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件;
           password [--md5] STRING:启动选定的内核或操作系统时进行认证;

    

    3.3  grub-md5-crypt命令生成对应要保护的认证密码

           wKioL1aHR_fRD7vNAAKOR3bPogc001.jpg            

 3.4  进入单用户模式:     

       (1) 编辑grub菜单(选定要编辑的title,而后使用e命令);

       (2) 在选定的kernel后附加
            1,s,S或single都可以;
       (3) 在kernel所在行,键入“b”命令;  


  

    3.5 安装grub:         

      (1) grub-install

        grub-install  - - root-directory=ROOT /dev/DISK

    示例:

      当前上重新添加一块硬盘                 

wKioL1aHfMujyqPbAAMRElsGi1A821.jpg

     将该硬盘进行分区,sbd1为boot分区(200MB),sdb2为交换分区(2GB),sdb3为根分区(5GB),分区完成后使用cat命令查看配置文件如下;

                    wKioL1aHgGOgAekcAADAPbggiF0878.jpg

         

   在/mnt下创建boot目录,并把sdb1挂载至/mnt/boot目录下,安装grub    

        [root@localhost ~]#  mkdir /mnt/boot        [root@localhost ~]#  mount /dev/sdb1 /mnt/boot/        [root@localhost ~]#  grub-install --root-directory=/mnt /dev/sdb

        复制当前系统的内核和initrd文件至/mnt/boot/目录下,编辑grub.conf文件          

        [root@localhost ~]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz        [root@localhost ~]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs.img        [root@localhost ~]# vim /mnt/boot/grub/grub.conf         default=0         timeout=5         title CentOS DIY                    root (hd0,0)            kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash             initrd /initramfs.img

        在mnt目录下创建sysroot目录,并创建系统常用文件夹        

       [root@localhost ~]# mkdir /mnt/sysroot       [root@localhost sysroot]# mount /dev/sdb3 /mnt/sysroot/       [root@localhost ~]# cd /mnt/sysroot        [root@localhost ~]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media

         复制当前系统下的/bin/bash至/mnt/sysroot/目录下,并复制bash所用的库文件  

       [root@localhost sysroot]# cp /bin/bash /mnt/sysroot/bin/       [root@localhost sysroot]# ldd /bin/bash    # 查看bash所需要的库文件       linux-vdso.so.1 =>  (0x00007ffc97596000)       libtinfo.so.5 => /lib64/libtinfo.so.5 (0x000000355b600000)       libdl.so.2 => /lib64/libdl.so.2 (0x0000003553200000)       libc.so.6 => /lib64/libc.so.6 (0x0000003553600000)       /lib64/ld-linux-x86-64.so.2 (0x0000003552e00000)      [root@localhost sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/      [root@localhost sysroot]# cp /lib64/libdl.so.2  /mnt/sysroot/lib64/      [root@localhost sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/      [root@localhost sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/      [root@localhost sysroot]# chroot /mnt/sysroot/  # 切换至根目录,查看bash是否可用      bash-4.1# exit

        

    接下来新建一个虚拟机使用现有的这块sdb硬盘,启动此虚拟机,可以发现自己DIY的linux;            

wKioL1aHhxnTOh2dAAEyOTvPork905.jpg

wKioL1aHhyKSJsy1AAFjLI7aK5U584.jpg

wKiom1aHhw6QxHtiAAKJa8IF8kk015.jpg

   (2) grub

        grub> root(hd#,#)    

      现在我们手动破坏当前磁盘上的mbr,再安装grub。在破坏之前先备份一下,注意:别破坏分区表,只破坏前446个字节。    

       [root@localhost ~]# dd if=/dev/sda of=/root/mbr.bak count=1 bs=512  #备份mbr信息       记录了1+0 的读入       记录了1+0 的写出       512字节(512 B)已复制,0.000241106 秒,2.1 MB/秒       [root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1       记录了1+0 的读入       记录了1+0 的写出       200字节(200 B)已复制,0.000220939 秒,905 kB/秒       [root@localhost ~]# grub-install --root-directory=/ /dev/sda  #手动安装grub       Installation finished. No error reported.       This is the contents of the device map //boot/grub/device.map.       Check if this is correct or not. If any of the lines is incorrect,       fix it and re-run the script `grub-install'.       # this device map was generated by anaconda       (hd0)     /dev/sda

       至此,修复成功。

       grub> setup (hd#)

         [root@localhost ~]# 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,0)           root (hd0,0)           Filesystem type is ext2fs, partition type 0x83           grub> setup (hd0)           setup (hd0)           Checking if "/boot/grub/stage1" exists... no           Checking if "/grub/stage1" exists... yes           Checking if "/grub/stage2" exists... yes           Checking if "/grub/e2fs_stage1_5" exists... yes           Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.           succeeded           Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"...      succeeded           Done.

          esc /boot: linux rescue(破坏后重启,使用紧急救援模式)

       

    设置为光盘启动

wKiom1aHjaigb8WLAAIJ3FRUbq0192.jpg

            进入修复模式

wKioL1aHjdOgHQa6AAIkg130yv4766.jpg     

         选择语言,这里我直接选择默认

wKioL1aHkImhv-OTAAFMp91RGdU247.jpg

      

  选择键盘模式:

wKioL1aHkI7DiUWRAAFWhfAWuoU844.jpg

wKiom1aHkHXzPM-nAAKvN45y-nU165.jpg

wKioL1aHkJnQ6_gmAAFoET1kGB0398.jpg

 wKiom1aHkdKh-nzYAAEIAPM9LBM296.jpg

        最后,重启系统,卸载光盘,系统修复成功。