GRUB详解

GRUB的启动流程:

grub

centos56中:0.X版本 grub legacy

centos7中:1.X版本  grub2

grub可分为三个阶段:

stage1mbr446字节中保存的Boot Loader程序

stage1.5mbr之后的扇区,让stage1中的Boot Loader能够识别stage2所在的分区上的文件系统

stage2:存放在磁盘分区中(/boot/grub

   配置文件:/boot/grub/grub.conf 有个链接文件 /etc/grub.conf

工作流程:当我们系统启动的时候,如果加载grub所在的磁盘时会读取磁盘上的MBR从而找到stage1stage1加载完以后,它会尝试去读取随后扇区中的stage1.5stage1.5读到以后从而就能够驱动真正的stage2所在的磁盘分区了,所加载的磁盘分区上不但有第二阶段,还有内核文件及ramdisk等都放置在此分区,所以,这就是为什么我们grub能够加载到内核文件的原因,要记得,我们当前硬件平台的主板BIOS一定要能够识别硬盘,然后BIOS才会帮你去加载硬盘中的Boot Loader磁盘中的Boot Loade自身加载完之后就能直接识别当前主机能识别到的硬盘设备了,要注意,硬盘设备能识别不代表硬盘设备中的文件系统也能识别,因为文件系统是额外附加在硬盘上的一层软件组织的文件结构通常我们要对接文件系统要用到文件系统驱动你的应用程序必须能够识别理解文件系统才可以,在stage1.5阶段其实就是给grub提供了文件系统驱动,从它而就能够访问第二阶段和内核所在的分区了。

stage2及内核等通常放置于一个基本的磁盘分区。

grub的功用:

(1)    提供菜单、并提供交互式接口

e:编辑模式,用于编辑菜单

c:命令模式,交互式接

a:修改kernel参数

(2)    加载用户选择的内核或操作系统

允许传递参数给内核

可隐藏此菜单

(3)    为菜单提供了保护机制

为编辑菜单机型认证

为启用内核或操作系统进行认证

grub如何识别设备:

(hd#,#)

     hd#:磁盘编号,用数字表示 0开始编号

       #:分区编号,用数字表示 0开始编号

     例如:(hd0,0)第一块磁盘的第一个分区

      /boot目录有两种可能:

                         /boot为单独的分区

                         在根文件系统上

grub的命令行口

       help:获取帮助列表

             在列表中的root命令是用来设置当前grub

的根设备的,在我们启动设备时,对于grub来说,根设备不是操作系统的根文件系统,而是grub的第二阶段所在的磁盘才为grub的根。root命令只能设置设备或分区为根;

        findhd#,#/path/to/somefile:根据路径查找文件

        root (hd#,#)

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

        例如:init=/path/to/init, selinux=0  quied:静默模式ro只读        initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk,ramdisk必须与内核版本号完全匹配。

         boot:引导启动选定的内核

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

         grub> roothd#,#

         grub>kernel /vimlinuz-VERSION-RELEASE ro root=/dev/DEVICE

         grub>initrd /initramfs-VERSION-RELEASE.img

         grub>boot

配置文件:/boot/grub/grub.conf

   配置项:

         default=#:指定默认启动菜单项;落单项(title)编号从0开始

         timeout=0:指定菜单项等待选择的时常

         splashimage=hd##/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径

         hiddenmenu:隐藏菜单

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

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

         roothd##):grub查找stage2kernel文件所在的设备分区;为grub的“根”;

         kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核

         initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件

         password [–md5] STRING:启动选定的内核或操作系统时进行认证

grub-md5-crypt命令:可以生成md5加密密码串

进入单用户模式:

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

(2)    在选定的kernel后附加

1 s S single都可以

(3)    kernel所在行,键入“b”命令

只要Boot Loader坏了,系统就不能够启动

安装grub

   安装命令:

     (1)grub-install –root-direction=/boot的父目录  /dev/DISK

2grub>root(hd#,#)

grub>setup(hd#)l

ldd命令:查看某程序依赖的库

紧急救援模式:

使用光盘引导,把光盘引导调至最上面

按提示选择下一步,最后进入救援模式所提供的shell环境中进行系统的修复。

自制linux

在虚拟机中添加一块新硬盘,将新硬盘分三个区,分别作为自制linux的根分区、boot分区和swap分区;然后格式化各分区,创建挂载点目录,将分好的区进行挂载,(注意:创建的boot分区的挂载点名称一定叫boot,因为grub-install命令一定要找boot目录才行,所以就需要创建一个boot目录作为挂载点 例如:/mnt/boot进入到根分区的挂载点目录,因为此分区是要作为自制linux的根分区的,所以,要在此分区中创建根目录下的一级目录,如:binsbinboot roothomeusretcdevsrvprocvartmpmntmediasysliblib64等等

然后进入到/boot分区所在的挂载点目录中,执行grub-install /dev/DISK 安装grub,而后进入到grub目录中,创建grub.conf配置文件,具体内容为:

      default=0

      timeout=5

      title centos linux

      root (hd0,0)

      kernel /vm……. selinux=0 init=/bin/bash root=/dev/sda2(因为当硬盘加到新的系统上后,此硬盘就为第一块硬盘了)

      initrd /initramfs…….

然后复制内核文件和initrd文件到/boot目录

cp /boot/vm…….  /mnt/boot

cp /boot/initramfs……  /mnt/boot

创建完这些后就可以去导入一些基本的命令了,可以手动的复制到自制linux的根分区目录中,也可以使用脚本往里导入

手动导入:用cp命令从/bin目录中复制出需要的命令,

然后用ldd命令查看此命令所依赖的共享库文件;

ldd命令:用来查看各应用程序所依赖的库

格式为:

ldd [选项] …FILE…

导入共享库文件到自制linux 的根目录中(一般存放在lib目录或lib64目录中)

 使用脚本,可以使用脚本导入,脚本内容如下:

#!/bin/bash

ch_root="/mnt/sysroot"      //这里改成自制linu的根分区位置 (例如:/mnt/sdb2

[ ! -d $ch_root ] && mkdir $ch_root

 

bincopy() {

    if which $1 &>/dev/null; then

 

        local cmd_path=`which –skip-alias $1`

        local bin_dir=`dirname $cmd_path`

        [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}

        [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}

        return 0

    else

        echo "Command not found."

        return 1

    fi

}

 

libcopy() {

    local lib_list=$(ldd `which –skip-alias $1` | grep -Eo '/[^[:space:]]+')

    for loop in $lib_list;do

        local lib_dir=`dirname $loop`

        [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}

        [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}

    done

}

 

 

read -p "Please input a command or quit: " command

 

while [ "$command" != "quit" ];do

    if bincopy $command ;then

        libcopy $command

    fi

    read -p "Please input a command or quit: " command

done

创建/etc/fstab文件

   是在根分区的挂载目录中的/etc/目录下创建的

   vim /etc/fstab

      /dev/sda2  /boot  ext4  defaults 1  1

      /dev/sda1  /   ext4   defaults 1  2

   这辆个挂载设备都应该改为/dev/sda#因为自建的系统加上此块盘后,磁盘为第一块,这个应根据情况而定。

做完以上步骤就可以硬盘卸下,去创建一个新的虚拟机,然后把这块硬盘当作新虚拟机第一硬盘,就可以使用了。

grub菜单修复

当破坏了MBR的前446字节的内容后怎么修复?

  修复方法:

可以进入到救援模式,

切换到根chroot /mnt/sysimage

grub-install –root-direction=/ /dev/sda  //安装grub

reboot

当误删除了/boot目录以及/etc/fstab文件后该如何修复?

修复方法:

重启系统,在bios界面选择光盘引导,进入救援模式,在救援模式的shell环境中,执行以下命令:

fdisk –l                    //查看分区情况

mkdri /mnt/cdrom           //创建挂载点目录

然后,把刚才查看到的分区一一挂载至此目录,去找出根分区和boot分区,找到后就挂载根分区至此目录,

mkdir /mnt//boot            //创建boot分区的挂载点目录

切换到根分区的挂载点目录,创建/etc/fstab文件

vi /etc/fstab

   /dev/DISK1  /  ext4  defaults  1  2

   /dev/DISK2  /boot  ext4  defaults  1  1

reboot                    //重新进入,使fstab文件生效

再次进入到救援模式是shell环境中

chroot /mnt/sysimages       //切换到真正的根

cd boot                    //切换至boot目录

grub-install /dev/DISK        //安装grub

cd grub                    //进入grub目录

vi grub.conf                 //创建grub配置文件

   default=0

   timeout=5

   title centos6

   root (hd0,0)

   kernel /ve……… ro root=/dev/DISK1

   initrd /initramfs……

mount /dev/sr0 /media/cdrom  //挂载光盘

rpm –ixh /media/cdrom/Package/kernel-2……  –force  //强制重新安装内核

exit                        //退出

reboot                     // 重启,

修复完成,进入系统后,可自行将grub配置文件和/etc/fstab文件进行完善

原创文章,作者:ZJM,如若转载,请注明出处:http://www.178linux.com/45718

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 13:21

    总结的还不哦,只是排版是不是太随意了?