二十五、grub (Boot Loader) 以及修复grub

双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader)

 

GRUB Grand Uniform Bootloader

    CentOS5,6 grub 0.X系 : grub  legacy(设备或分区编号从0开始)

    CentOS7 grub 1.X系 :grub2(设备或分区编号从1开始)

 

一、CentOS5,6 grub应用:

1、grub的工作流程

stage1  : mbr中    

stage1.5 :mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统  (存储stage2所在分区的驱动)

stage2 :提供菜单,加载内核和ramdisk至内存,移交控制权 (磁盘分区/boot/grub)

 

2、grub配置文件

通常boot(stage2)及内核等通常放置于一个基本磁盘分区上:

  功能:

   (1)提供菜单、并提供交互式接口;
      e:编辑模式,用于编辑菜单
      c:命令模式,交互式接口
   (2)加载用户选择的内核或操作系统
      允许传递参数给内核
      可隐藏此菜单
   (3)为菜单提供了保护机制
      为编辑菜单进行认证
      为启动内核或操作系统进行认证

boot为一个独立的分区, /可以为普通分区或lvm。访问boot通过挂载在根中实现

  内核: kernel /vmlinuz, initrd /initramfs

 

boot和根在同一个分区,/必须为普通分区

  内核: kernel /boot/vmlinuz, initrd /boot/initramfs

 

3、grub的功能

提供菜单 : tile TITLE

加载用户选择的kernel及ramdisk : kernel path parameters , initrd path

为菜单提供保护机制(kernel和菜单编辑认证) : password --md5 STRING


 

二、grub的命令行接口

2.1、help :获取帮助列表

  格式: help  KEYWORD(关键字):详细帮助信息

    help root : 对grub而言---第二阶段stage2所在的磁盘分区才叫根,而不是真正文件系统(操作系统)所在的根

二十五、grub (Boot Loader) 以及修复grub

  • grub >  help find 

find (hd#,#)/PATH/TO/SOMEFIEL;定位某文件是否存在

   find  (hd0,0)/vm        如果该硬盘上有这个文件会自动补全

二十五、grub (Boot Loader) 以及修复grub

 

  先设定根设备

  • root  (hd#,#) :把那个磁盘设置为根设备

二十五、grub (Boot Loader) 以及修复grub

  • kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件(最后一个字符z表示压缩存放)
    •   额外还可以添加许多内核支持使用的cmdline参数

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

  • initrd  /PATH/TO/INITRAMFS_FILE  :设定为选定的内核提供额外文件的ramdisk (注:必须与内核版本号完全一致)
  • boot  :引导启动选定的内核

 

2.2、如何识别设备

root (hd#,#)  指定引导设备在哪个设备的哪个分区上。

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

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

    (hd0,0):表示第一个块硬盘,第一个分区

 注:grub2系列 (hd1,1)示第一个块硬盘,第一个分区

 

2.3、此根非彼根

系统启动起来后,任何一个存储设备要想被访问到,其前提就是在当前根文件系统的某个路径下面挂载某个设备,当做访问入口。

grub刚启动时候,内核未被加载,操作系统更未启动,所以不能通过根文件系统下的boot入口来访问grub分区;但是现在需要访问grub分区,要不然怎么加载grub_stage2呢?

直接去找新分区来的简便些,grub由于有文件系统驱动,所以能够直接访问分区

 

二十五、grub (Boot Loader) 以及修复grub

 

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

  grub> root (hd#,#)            ## 引导设备位置 左0: 第一个磁盘设备,右0:第一个分区
  grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE  rhgb quiet
  grub> initrd /initramfs-VERSION-RELEASE.img
 grub> boot

2.5、配置文件: /etc/grub.conf -> /boot/grub/grub.conf

          /boot/grub/menu.lst -> ./grub.conf

2.6、配置格式

default=#            ## 设置默认启动的菜单项:落单项(title)编号从0开始 
timeout=#            ## 指定菜单项等待选项选择的时长,单位秒
splashimage=(hd0,0)/grub/splash.xpm.gz     # 指明菜单背景图片文件路径 (图片要求格式:640X480 14位索引色)
hiddenmenu                 ## 是否隐藏菜单
password --md5 STRING           ## 菜单加密功能,STRING由grub-md5-crypt 或 openssl passwd -1 -salt STRING 生成
title CentOS 6 (2.6.32-696.el6.i686)   ## 定义菜单项的标题(可出现多次:引导不同内核版本)
    root (hd0,0)            ## 引导设备位置 左0: 第一个磁盘设备,右0:第一个分区
                  grub查找stage2及kernel文件所在设备分区:为grub的“根” kernel /vmlinuz-2.6.32-696.el6.i686 ro root=/dev/mapper/myvg-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_LVM_LV=myvg/lv_swap KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet rd_NO_DM rd_LVM_LV=myvg/lv_root rhgb quiet               ##内核文件路径,及传递给内核的参数;只读方式root后面为正真文件系统的根
   initrd /initramfs-2.6.32-696.el6.i686.img ##内核匹配的ramfs文件 (指定initramfs的路径) password --md5 STRING    ##启用选定的内核或操作系统时进行认证 注意: root,kernel,initd格式的缩进
#一个title 指定一个操作系统或者一个内核
对于grub而言,所有类型硬盘一律为hd,
(hd#,n) #表示第几个磁盘,最后的n表示对应磁盘的分区
 rhgb :为色彩显示
  quiet :安静模式(屏幕不会输出内核检测的信息) 

注释: kernel /vmlinuz PARAMETERS

    当stage1.5找到stage2时,内核只识别stage2所在的分区,此分区为/,所以分区的vmlinuz路径为,/vmlinuz

PARAMETERS:

  ro              以只读方式挂载root=PATH指明的路径的根

  root=<路径>        指明root的位置

  quiet            静默模式

  selinux=0        不启动selinux

  init=/path/to/somefile 开机后,init程序为哪个。默认为/sbin/init  

  1,s,S,single       单用户模式

  <更多参数: google: kernel command line parameters>

  

2.7、实例

  • 添加全局密码认证:使用grub-md5-crypt命令

    $1$aTuXQ0$Mv3PU1SopA33PfjgJdvpf1 

二十五、grub (Boot Loader) 以及修复grub

  •  然后把生成的密码串---$1$aTuXQ0$Mv3PU1SopA33PfjgJdvpf1 ,分别添加在如图位置即可

二十五、grub (Boot Loader) 以及修复grub

  •  sync
  •  shutdown -r 0

二十五、grub (Boot Loader) 以及修复grub

 

下面提示:“enter”选定哪一个启动 或者“p”键先输入密码

 二十五、grub (Boot Loader) 以及修复grub

 

 

三、grub的安装

安装grub: grub-install命令(完整安装) 重新安装grub stage1,1.5,2

grub-install命令

grub-install --root-directory=DIR DEIVCE

    --root-directory=DIR 指向boot目录的上一级目录

    DEVICE 给哪个设备安装grub

 

实例:设置grub,并拆下该磁盘,装在新虚拟机上步骤如下:

1)关机

二十五、grub (Boot Loader) 以及修复grub

 

2)添加新的磁盘

 

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

 

3)启动虚拟机

二十五、grub (Boot Loader) 以及修复grub

 

4)进入命令行

二十五、grub (Boot Loader) 以及修复grub

 

5)查看磁盘

二十五、grub (Boot Loader) 以及修复grub

 

6)分区

 

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

 

7)格式化

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

 

8)挂载

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub


9)安装grub

grub-install   --root-directory=/mnt   /dev/sdb (明确告诉根在那块硬盘即可自己会找boot目录)

注:配置文件只能只能自己写

二十五、grub (Boot Loader) 以及修复grub

 

二十五、grub (Boot Loader) 以及修复grub

 

10)创建FHS格式文件种类

二十五、grub (Boot Loader) 以及修复grub

11)复制bash程序及其相关的库

二十五、grub (Boot Loader) 以及修复grub

 注:ldd 出来的第一个文件为库文件的访问入口

二十五、grub (Boot Loader) 以及修复grub

方法一:把ldd 出来的四个动态共享依赖库复制到/mnt/sysroot/lib64下

    cp /bin/bash/   /mnt/sysroot/bin

    chroot /mnt/sysroot  根切换并检测能否运行bash

方法二如下:

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

12) 给出配置文件

二十五、grub (Boot Loader) 以及修复grub

该图中的root(hd0,0)是为了拆下磁盘后-------新虚拟机上的第一块磁盘,演示效果

  init=/bin/bash :要求限定/bin先bash 而不是sbin下的init;会直接把bash当做用户空间的进程来启动(当做程序运行是没问题的)

二十五、grub (Boot Loader) 以及修复grub

 

 

13)同步

二十五、grub (Boot Loader) 以及修复grub

14)关机

# shutdown -h now

 

15)查看第二个磁盘的名字

二十五、grub (Boot Loader) 以及修复grub

 

16)、新建虚拟机

二十五、grub (Boot Loader) 以及修复grub

 

二十五、grub (Boot Loader) 以及修复grub

 

 

 

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

 

15)启动新建的虚拟机

 e键进入后 selinux=0要写在前面 否则无法启动

二十五、grub (Boot Loader) 以及修复grub

 

16)启动OK

二十五、grub (Boot Loader) 以及修复grub

 

四、问题一:grub的修复(但未重启)

1、在命令行中: grub 只是stage1(MBR 512)被破坏时,才能修复. 

2、开机失效: rescue模式

 

1、在命令行中: grub

1)备份mbr

[root@localhost ~]# dd if=/dev/sda of=/root/mbr.bak bs=512 count=1

2)破坏mbr的stage1(别破坏分区表)

[root@localhost ~]# dd of=/dev/sda if=/dev/zero bs=200 count=1   (小于446即可)
[root@localhost ~]# sync

3)用grub命令行修复 

方法一:并不需要当前根下有boot目录,它会自动装好

[root@localhost ~]# grub-install  --root-directory=/ /dev/DISK

方法二:如下(只要没有重启,只是修复grub)

注:指明的root设备上,必须事先存在一个grub目录,里面stage1、stage1_5、stage2等等文件都必须存在

  a、进入grub命令行

[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>

  b、设置引导设备位置

grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

  c、给设备安装grub

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.

  d、重启验证

grub> quit  
quit
[root@localhost ~]# reboot
[root@localhost ~]#

 

 

 五、问题二:rescue(紧急)求援模式

二十五、grub (Boot Loader) 以及修复grub

1)、挂载光盘 关机 --> 编辑虚拟主机 --> CD/DVD(IDE) --> 使用ISO镜像文件 --> 浏览选择DVD光盘

 

2)、开机进入界面 开启虚拟机 

鼠标选中光盘图标-----右键选件连接即可

二十五、grub (Boot Loader) 以及修复grub

保证光盘连接

 

3)、选择×××标记的行或ESC,输入 linux rescue 后回车

  如下图:ESC出现的

二十五、grub (Boot Loader) 以及修复grub

 

  图形界面中选择第三行

 

 

 

二十五、grub (Boot Loader) 以及修复grub

 

4)、选择语言

二十五、grub (Boot Loader) 以及修复grub

OK

 

5)、键盘类型,选择OK,如图

二十五、grub (Boot Loader) 以及修复grub

OK,出现如图界面

二十五、grub (Boot Loader) 以及修复grub

 

6)、是否需要启动网络,选择NO(本地修复)

二十五、grub (Boot Loader) 以及修复grub

NO 

 

7)、临时将/挂载在/mnt/sysp_w_picpath中

二十五、grub (Boot Loader) 以及修复grub

Continue

二十五、grub (Boot Loader) 以及修复grub

 

8)、告知已经找到磁盘,需要使用root,运行chroot /mnt/sysp_w_picpath即可

二十五、grub (Boot Loader) 以及修复grub

OK

 

9)、

二十五、grub (Boot Loader) 以及修复grub

 

10)、选择第一个

二十五、grub (Boot Loader) 以及修复grub

 

11)弹出:打印一个shell提示符

二十五、grub (Boot Loader) 以及修复grub

 

方法一: grub-install  --root-directory=/  /dev/sda 

二十五、grub (Boot Loader) 以及修复grub

 reboot重启时,把光盘断开连接即可完成了修复

 

方法二:如下

12)、切换至原root根目录

二十五、grub (Boot Loader) 以及修复grub

13)、修复

二十五、grub (Boot Loader) 以及修复grub

14)、重启测试

二十五、grub (Boot Loader) 以及修复grub

 

上一篇:算法笔记_186:历届试题 高僧斗法(Java)


下一篇:发行选择 – 带有Bittorrent客户端,Java,Flash,VLC的Live Linux CD / DVD?