GRUB

GRUB(GRand Unified Bootloader)bootloader的一种,它的主要功能是选择要启动的内核。

 当我们开机时,这个GRUB菜单是隐藏的,

GRUB的应用_grub的应用

在这个画面时,我们敲任意键,就可以显示出GRUB菜单,然后可以编辑

GRUB的应用_使用grub修改密码_02

摁‘e’键可以进入二级目录

GRUB的应用_使用grub修改密码_03

这里显示了,kernel这一行显示了要加载的内核版本,initrd显示给内核提供的辅助驱动,来加载逻辑卷等。

把光标调到kernel这一行,再次摁‘e’键,可以在里面添加参数,输入完后,摁回车表示确认,然后在kernel这一行摁‘b’键就可以启动了

例如:我们以1级别启动,来重新设置root的登录密码

在kernel里添加一个参数1,s或S,single,就可以直接登录了

在这里面添加1

GRUB的应用_grub的应用_04

GRUB的应用_使用grub修改密码_05

这没需要输入用户名和密码,就直接进入root用户了,然后就可以修改密码了,然后输入init3就可以切入正常模式了,在这个过程中,会启动3级别需要的服务

GRUB的应用_使用grub修改密码_06


下面我们介绍下grub的组成:

    grub有两个版本

        grub 0.x:gryb legacy(传统grub)

        grub 1.x:grub2 

grub legacy:(CentOS5,6)

  1、GRUB程序的组成

    GRUB的应用_grub的应用_07

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。

    

    device.map:存放的是内核文件的根分区

     stage1: 放在mbr中

    stage1_5:存放在mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;

    stage2:放在磁盘分区(/boot/grub/)中,作用是提供菜单并提供交互式接口(e编辑菜单,c命令模式),加载用户选择的内核或操作系统,为菜单提供保护机制等

    grub.conf:配置文件 还有一个链接文件是/etc/grub.conf

     在grub菜单中,摁‘c’键,可以进入交互式接口,指定一些参数,可直接启动

GRUB的应用_使用grub修改密码_08

    然后回车就可以启动了

 grub如何识别设备:

    (hd#,#)

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

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

        (hd0,0)表示第一个磁盘的第一个分区

  grub的命令行接口

    help: 获取帮助列表

    help KEYWORD(命令): 某个命令的详细帮助信息

    find (hd#,#)/PATH/TO/SOMEFILE:确定某文件是否存在

    root (hd#,#)  用来设定grub的根只能指向一个设备;这个根不是文件系统的根

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

        例如:init=/path/to/init, selinux=0(表示禁用内核中的selinux功能)

    initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;要与内核版本号完全匹配

    boot: 引导启动选定的内核;

  GRUB的应用_grub的应用_09

 直接在命令行输入比较麻烦,就可以下写到配置文件中, 

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

    配置项:

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

    timeout=#:指定菜单项等待选项选择的时长;

    splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;

    hiddenmenu:隐藏菜单;

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

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

        root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; 

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

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

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

    生成密码串,使用grub-md5-crypt命令

GRUB的应用_使用grub修改密码_10

  为grub菜单或者内核进行认证

    修改配置文件为下图,


GRUB的应用_使用grub修改密码_11然后保存退出,然后重启

为了演示效果,我们在全局加了一个password选项,有添加一个title在里面添加一个password选项

然后我们进入grub菜单,这个时候就有两个选项了,这个时候摁‘e’键没用,使用‘p’键,输入密码,才能使用‘e’键,要么选定一项直接使用回车启动,但是如果在title里加入了password是对内核加密,需要先输入密码才能启动

GRUB的应用_使用grub修改密码_12

使用‘p’键,输入密码之后才能使用grub菜单项

GRUB的应用_grub的应用_13

这个时候可以对这两个选项进行修改了,第一个title没有添加password选项,回车选定之后可以直接启动,如果选择第二个,回车之后会提示让输入密码,才能启动

GRUB的应用_grub的应用_14

GRUB的应用_使用grub修改密码_15

 修复安装grub

    (1) grub-install 这个命令安装grup

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

    (2) grub 进入命令行模式,这种方式根文件系统要提前存在,而且要有grub目录,里面的文件是齐全的

        grub> root (hd#,#)

        grub> setup (hd#)

在虚拟机中添加一块新硬盘,然后把grup装进入,然后使用者新硬盘建一个新的虚拟机,然后启动

    首先添加一块新硬盘,然后分区,格式化文件系统等(如有不会的,可以查看以前的博客)

    然后在/mnt下创建一个boot目录,然后把新硬盘的第一个分区,挂载到刚创建的目录

   GRUB的应用_使用grub修改密码_16

   然后安装grup,

    GRUB的应用_grub的应用_17

    这就安装好了,然后验证下

    GRUB的应用_使用grub修改密码_18但是没有配置文件,所以要自己写一个,也没有内核和initrd,所以需要复制本机的内核和initrd到新硬盘下

    

GRUB的应用_使用grub修改密码_19

然后编辑配置文件内容如下

GRUB的应用_grub的应用_20

但是,我们把根文件系统指向了/dev/sdb3,但是里面没有文件包,所以我们要把根文件系统里的文件在/dev/sdb3中创建

GRUB的应用_使用grub修改密码_21

这里面并没有文件,我们复制一个bash到新硬盘下,并且要把依赖到的文件也复制过去,等下开机时,可以直接启动bash

GRUB的应用_使用grub修改密码_22

然后还要系统系统的init程序,如果不指定,就会自动启动/sbin/init因为我们这个硬盘里没有,会出错的

GRUB的应用_grub的应用_23

你需要确定你刚在配置的那个硬盘的路径

然后使用vm创建一个新虚拟机,其他都一样,然后在选择磁盘的时候,选择使用现有的

GRUB的应用_使用grub修改密码_24

然后创建完成,启动就可以查看了

然后直接启动,出现grub菜单,然后使用‘e’键,然后在kernel这一行,加入参数selinux=0,这个参数要加在init前面,然后回车回到kernel这一行,然后摁‘b’启动就可以了

GRUB的应用_grub的应用_25

这就成功了

 

  把自己系统的mbr弄坏,然后使用光盘的grup进行引导修复

    GRUB的应用_使用grub修改密码_26

这就把grub的第一阶段给弄坏了,

如果这个时候你的系统是开机状态,直接使用命令grub-install --root-directory=/ /dev/sda就可以直接修复了,

GRUB的应用_使用grub修改密码_27

然后sync同步以后,在重启就没有问题了,

也可以使用grup然后回车进入命令行模式进行修复

GRUB的应用_使用grub修改密码_28

如果你的系统是关机,再启动就不行了,只能使用紧急救援模式进行修复

再把mbr弄坏,然后使用救援模式进行修复

弄坏之后进行重启,然后把光盘镜像挂载上,然后重启

GRUB的应用_使用grub修改密码_29

然后选择第三项,即Rescue installed system 然后回车

或者摁‘ESC’输入linux rescus回车就可以了

然后根据提示做就行了

GRUB的应用_grub的应用_30

然后切换到根下,使用chroot /mnt/sysp_w_picpath/ 切到实际的根上,然后执行grub-install就行了

GRUB的应用_使用grub修改密码_31

然后exit回到救援模式的bash下重启就行了(光盘卸掉)