Linux学习53 grub系统配置与使用

一、回顾

  1、CentOS6启动流程

    POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> Kernel(ramdisk) --> rootfs --> switchroot  --> /sbin/init --> (/etc/inittab,/etc/init/*.conf)--> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端并打印登陆提示符 

    首先是加电自检,然后根据我们Boot Sequence中所定义的启动次序逐一去搜索我们拥有启动功能的设备,找到以后去加载我们这个启动功能设备的BootLoader,他其实是存放在我们硬盘的MBR分区中的,BootLoader被加载完后他会显示一个菜单让用户选择要启动的内核或操作系统的版本,接着开始去加载用户选定的内核,Kernel还有可能借助于ramdisk来完成去加载根文件系统的操作,一旦完成了加载ramdisk接着我们的Kernel就能识别真正的根文件系统所在的设备,接着就去加载真正的根文件系统,并且在加载真正的根文件系统完以后去做根切换,根切换完成以后就开始运行真正根上的/sbin/init程序,而/sinb/init程序就会根据配置文件/etc/inittab以及/etc/init/*.conf里面所给出的设定来实现设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端并打印登陆提示符 

二、启动流程详细介绍

  1、Boot Sequence阶段

    a、其实我们虚拟机也有相应的BIOS系统,我们打开时候按f2可以进入或者我们启动时点击启动进入固件选项

    

     b、我们在boot这个选项中可以看到我们有系统启动的加载顺序我们可以使用+/-号进行切换    

    c、这就是我们的Boot Sequence阶段

  2、GRUB(Boot Loader)阶段

    a、grub:GRand Unified Bootload,简称为Grub

      grub 0.x:grub legacy传统版本的grub

      grub1.x:grub2,这个是完全重写的,只是基本兼容grub0.x

    b、grub legacy我们说过他运行的时候分为了三个阶段:

      stage1:mbr

      stage1.5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统,否则他是没办法去加载第二阶段的

      stage2:能够提供我们菜单和我们编辑时所能够看到的界面,他是存放在我们磁盘分区之上的,一般而言他是存放在我们系统挂载完以后/boot/grub目录下。

      配置文件:/boot/grub/grub.conf 并且他被符号链接至/etc/grub.conf,因此当我们的系统起动的时候如果要加载grub所在的磁盘时,会读取这个磁盘上的mbr从而能加载到stage1,stage1加载完以后随后他会去尝试去读取磁盘扇区中的stage1.5这一阶段,这一阶段读到以后从而就能够驱动真正的第二阶段所在的磁盘分区了,我们这个所加载的磁盘分区上不但有第二阶段的文件其实还有内核文件,以及ramdisk等等都在这个分区上,放置着,所以这就是为什么我们grub随后就能够加载到内核文件的原因,各位要记得我们主板的bios一定要能识别硬盘,然后bios才能帮你去加载硬盘中的Bootloader,磁盘中的bootloader自身在加载完以后就能够直接识别当前主机能识别到的硬盘设备了,这没什么问题,但是大家知道硬盘设备能识别并不意外这硬盘中的文件系统能够识别,因为文件系统是额外附加的一层软件组织的文件结构,所以如果我们要想对接某种文件系统通常必须要用到文件系统驱动,对应的应用程序必须能够识别并理解这个文件系统才可以,这种程序我们就称之为文件系统驱动,他在stage1.5阶段其实也就是给grub提供了文件系统驱动的。从而他就能够访问对应的第二阶段的内核所在的分区的,这通常应该是一个基本的磁盘分区,毕竟他的第1.5阶段也不能做的过于复杂,所以我们grub的第二阶段以及我们的内核以及我们的ramdisk文件通常都会放置在一个基本磁盘分区上。说白了就是我们创建了一个简单分区,他不会使用我们的软raid或逻辑卷等

    c、对于grub来讲他的功用有这么几个

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

        1)、e:进入编辑模式,用于实现编辑菜单

        2)、c:进入命令模式,命令模式指的是对于grub来讲他完全可以不用读取配置文件而能够允许打开他内置的命令行提示符,在我们键入的命令的支持下完成某些操作,这是一个真正的交互式接口。我们启动后到grub阶段的时候可以按c键进入

       

           可以敲help查看相应的命令

          

           比如我们设定我们基本的磁盘分区在什么地方

            

           还有我们可以手动指定我们的内核文件在什么地方和我们的根设备在什么地方

            

           我们还可以指明我们的ramdisk文件在什么地方

            

           接着我们可以敲boot命令来启动他

            

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

          1)、加载用户选择的内核时还允许用户通过编辑菜单传递参数给内核

          2)、还可以隐藏此菜单,我们打开CentOS6的时候这个菜单默认就是隐藏的

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

          1)、为编辑菜单进行认证

          2)、为启用内核或操作系统进行认证,比如我这边有十个内核,其中有些内核是为了调试的目的,不允许普通用户随意使用的,那么选择启动操作系统时你选择这个内核敲回车必须输入密码我们才能允许你使用这个内核。

  3、那么我们在grub中是怎么识别设备的呢?

    事实上grub是在我们的boot目录下的,而boot可不可以单独分区呢?也就是说我们/文件系统下里面有个boot目录,这个boot目录所对应的是一个单独的磁盘分区呢还是和根在一块呢?那么在一块儿可不可以呢?其实也是可以的。所以这样一来我们的boot目录其实我们在系统启动起来以后所能够看到的boot目录其实会有两种可能

    a、第一种可能是,假如我们有两个分区,第一个是boot分区,另一个是根分区,大家知道我们系统启动起来以后任何一个存储设备要想能够被访问到其前提是我们需要在当前的根文件系统的某个目录下挂载这个设备并作为其入口,通常就意味着在根文件系统上我们必须有一个目录叫做boot,但是我们这个boot没作为单独使用的存储空间,而把它当做另外一个分区的访问入口了,因此我们通过boot所访问的文件,比如我们访问的是/boot下的grub目录,这个grub目录是直接在这个分区上还是在这个分区上的boot目录下呢?也就是说我们通过根去找/boot/grub,我们boot是在根文件系统上是没问题的,作为挂载点来讲boot必须要在其上一级也就是根的目录下,因此这个boot是应该在新的磁盘分区上还是在根分区上呢?显然应该在根分区上的,所以boot一定是在根分区上的,那么我们boot目录下所找到的这个grub文件到底是在新boot所在的分区上呢还是说boot所在的分区下面还有个boot目录呢?当然肯定是直接就在boot所在的分区上啦,所以我们的/boot/grub直接就在对应的分区上。如果我们有一个/boot/vmlinuz文件也表示在我们的分区上直接会有一个vmlinuz文件

      

      但是有一个问题是,如果我们grub启动的时候,我们操作系统还没有启动起来,我们的Bootloader刚加载,这个时候内核都还没有加载就更不要说我们的根文件系统被加载,我们的根文件系统都还没有加载我们又怎么可能通过/boot来访问我们的grub分区呢?但是我现在需要访问这个分区,那么我们怎么去加载呢?所以这个时候作为grub的第一阶段来讲我们是绕一圈通过根文件系统所在的分区给挂载boot再去找grub呢还是我们直接去找grub?当然我们肯定是直接去找grub的,那么怎么去找呢?我们grub有个root命令,意思是把谁设置为grub的根,很显然grub要去找这个第二阶段在这个分区上我们就应该把这个boot所在的分区设置为grub的根,那么既然他是根了那么我现在要去找vmlinuz,他就成了根下的vmlinuz了,当然这个根是grub的根而不是文件系统的根。此时我们发现我们的boot目录就被抛弃了,压根就和现在的分区没关系。我们绕过去了根文件系统,因为压根这个操作系统就没启动根本就不可能会有根文件系统存在,而grub由于自己有文件系统驱动所以他能够直接访问这个分区,而把这个分区设置为根以后他里面的文件我都可以直接访问,比如vmlinuz,如果要访问grub目录下的某个文件呢?那就是/grub/grub.conf,这就是所谓如果我们root目录单独分区的话,如果我们grub这个单独的分区设定为根那么他的访问路径和我们平时在根文件系统上看到的路径是不一样的。

     b、我们还有另一种特殊情形,其实grub也可以不用单独分区,或者说我们boot也可以不单独分区,我们boot目录就是boot目录,boot目录下的文件就是boot目录下的文件,也就意味着根还是根,根下的boot还是boot,而boot里面的grub还是grub,但是他没有单独分区,那么如果没有单独分区,在系统启动之前我们这个根文件系统是没有被装载的,那么grub第一阶段被加载以后并且在运行了,他现在要访问grub的第二阶段了,或者说要找到我们的vmlinuz这样的文件,那么他的访问路径是什么呢?我们现在能否把这个boot目录设置为根呢?好像我们只能把某一设备设置为根,因此我们此时的根应该指向谁呢?就只能指向这个分区了,而boot目录此时没有单独分区,因此我们把根设定为这个分区要想找到grub目录你得先去找根,找到根再去找boot,所以如果我们这个时候在grub里面再去访问的话,文件系统就是/boot/grub/grub.conf,如果要访问内核那么内核就是/boot/vmlinuz。所以我们boot目录不管有没有单独分区或者说这个引导分区是不是独立的分区决定了我们在grub中的访问路径有可能是不一样的。

    c、我们grub中的root命令就是指明我们的根分区是谁的。但是我们grub如果要访问某一分区这个分区必须是基本磁盘分区,因为grub他不可能给里面提供非常复杂的驱动程序,让他能访问软raid或逻辑卷等这种复杂的文件系统一般是不这样提供的。

       

     d、对于我们阶段一来讲,他识别设备都以hd来标识,而且他标记磁盘时非常独特,首先hd的第一个数字表示你的第几块磁盘,第二个数字表示第几个分区。(hd#,#),这就表示第几块磁盘的第几个分区。

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

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

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

  4、grub的命令行接口

    a、grub的主要作用也无非就是去加载用户所选定的内核,内核应该会在某个磁盘的某个分区上,那到底在哪个磁盘的哪个分区的哪个文件上呢?这点其实特别关键

    b、我们相应的命令如下

      (1)、help:获取帮助列表,当然也可以用某个关键字查看这个关键字的详细信息

        help KEYWORD:详细帮助信息

        

         我们图中是help root,root的意思是设置当前使用的根设备的,那么什么叫根设备呢?对于我们启动Linux时grub来说根设备并不是说你的根文件系统所在的设备,而是你的第二阶段所在的磁盘分区来讲才叫根,而不是你真正操作系统的根,所以这个root指令就是用来设置grub的根设备

       (2)、find,到指明的磁盘分区上寻找文件

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

          现在我们在第一块盘的第一个分区中来找内核文件

        

         

       (3)、root将哪一个磁盘分区设定为根设备

        

       (4)、kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件,在此之前需要我们用root命令指明根设备,额外还可以添加许多内核支持使用的命令行参数。例如,我们可以再写上 init=/path/to/init,比如我使用这个文件当init程序都可以,当然此前我们传递过1用来表示启动单用户模式,另外我们还可以传递:selinux=0表示禁用selinux功能

      (5)、initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk,要记得ramdisk的版本号必须要与内核的版本号完全匹配才可以,如果我们的ramdisk文件与内核版本不匹配时将无法被内核所装载

      (6)、boot:引导启动选定的内核

  5、我们再次来看启动顺序

    a、所以我们开机时敲e键编辑可以看到会有如下信息

       

       我们看到我们首先设置第一块磁盘的第一个分区为根,第二步我们设置内核文件,initrd设置内核的补充性的ramdisk文件,他既然写到菜单中也就是说我们grub可以直接通过菜单读取这三行信息,如果我们得不到这个菜单信息也没关系,我们可以手动来设置他,我们可以按c键进行命令敲击来设置

      

      

       上述意思是我们设置grub的根为第一块硬盘的第一个分区,指定内核文件,然后以只读方式挂载根,并且是静默模式,然后指定ramdisk文件,最后启动

    b、所以我们要手动在grub命令行接口启动系统顺序如下

      

  6、相应的启动选项配置文件为:/boot/grub/grub.conf

    a、配置文件解析

       可以看到我们的title是我们一开始的菜单名称

        

       我们按e编辑时看到的菜单项就是下面的几项

      我们可以看到我们菜单项中还有一个字段和对应的文件叫hiddenmenu,这表示隐藏菜单,隐藏多少时间呢?可以看到上面的timeout,超时时间为5秒,也就是说如果超时时间超过5秒他就开始跳过菜单选项不让用户选择了

      default=0表示什么呢?我们可以有多个title指向多个内核,default用来指明哪一个是默认启动的,他从0开始编号,第0个编号,第1个编号,依次往后推

      splashimage表示我们启动的默认背景图片,如果我们安装系统时启动了图形界面而且我们系统支持在我们系统启动时就直接驱动显卡的话他是可以显示一个图形界面,这个背景就可以显示为一个图片,splashimage就是用来指明这个图片是谁的,他是xpm格式的

    b、/boot/grub/grub.conf文件常见的配置项为

      (1)、default=#:设定默认启动或加载的菜单项,菜单(title)项编号从0开始

      (2)、timeout=#:指定菜单项等待选项选择的时长

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

      (4)、hiddenmenu:隐藏菜单;

      (5)、password [--md5] STRING:菜单编辑认证,要输入指定的密码才能编辑菜单

        这个STRING一般是我们明文密码通过md5加密生成的密码串,我们可以通过openssl这个命令对我们明文进行加密,并且我们grub也给我们提供了一个grub-md5-crypt命令能够帮我们生成对应要保护的密码串

          

      (6)、title TITLE:定义菜单项"标题",可出现多次;用来引导多个不同的内核和操作系统

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

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

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

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

    c、接下来我们来演示一下加密效果

      (1)、首先我们先创建相应的密码串

        

      (2)、接下来我们设置配置文件

       (3)、接下来我们来看启动的启动效果

        1)、我们首先可以看到我们的两个菜单,此时我们可以发现我们没有办法敲e键进行编辑了

          

           我们可以看下面的选项,敲回车选定要启动哪一个或者敲p键键入密码

        2)、然后我们敲p键,左下角会让我们输入密码

          

         4)、然后我们就可以按e进行编辑了

          然后我们可以选定第一个菜单按回车,然后就发现会启动起来了

          然后我们可以选定第二个菜单按回车,然后会发现要让我们输入密码,输入密码后系统就能开始引导了

          

  7、进入单用户模式

    a、编辑grub菜单(选定要编辑的title然后使用e命令);

    b、在选定的kernel后附加

      1,s,S或single都可以

    c、在kernel所在行,键入"b"命令

三、grub相应操作

  1、相应问题

    a、如果我们grub配置文件丢了怎么办呢?其实如果我们grub的配置文件丢了他启动的时候只会发生一件事,他不会显示启动菜单而是直接显示grub提示符给我们了。此时我们可以这样玩,我们手动指定root,内核等等,然后再boot启动系统,然后再编辑grub配置文件就可以了

    b、但是如果我们grub中的文件坏了怎么办呢?比如第一阶段坏了,也就是我们mbr分区中的数据被覆盖掉了怎么办呢?如果我们一不小心使用dd命令往sda上覆盖了20个字节数据,那么他就坏了,就不能引导系统启动了。只要bootloader坏了那么这个硬盘上所有的操作系统都将无法引导。此时我们能做的只能是修复Bootloader,而要想能够修复Bootloader只有一个办法,进入救援模式或把硬盘拆下来放到其他主机上去修复。通过grub命令我们可以进行grub安装或重新修复的

  2、我们grub怎么安装呢?

    a、我们系统启动的好好的为什么还有安装grub的需要呢?比如我们现在有两块硬盘,我们想要给第二块硬盘安装grub是否有这个可能性呢?还有第二种,如果我们当前系统上没有grub,但他确实能够启动,我们可以借助光盘上的grub来启动当前系统上的内核。当我们开机以后只要能有grub这个提示符,也就是我们只要能在这里面创建命令这一切就简单的多了,我们只需要指明内核是我们磁盘上的内核,根文件系统是我磁盘上的根文件系统就可以了,这个grub在哪里无所谓,因此必要时我们为当前硬盘创建grub也是可以的。

    b、还有一种场景就是我们在我们的硬件上双系统互存,我们一般建议先装windows再装linux,因为windows的bootloader是不能引导Linux的,也就是说如果你先装linux再装windows,windows在安装时他会把bootloader给覆盖掉只保留windows自己的,所以你以后在系统上就只能看到windows了。但是如果你反过来,先装windows再装linux,linux的Bootloader是grub,grub是一个很开放的系统,包括Linux也是,他看到一个windows而且里面有bootloader的话他会把自己装在这个bootloader里面并且把windows给其保留并且把它作为一个启动项菜单来启动,所以以后你可以即能选择启动linux又能选择启动windows。但有人可能会发生这种事情,比如我也是按照这种方式做的,先装windows再装linux,但后来windows坏了,我又重装一遍,然后Linux也看不见了,这个时候就麻烦了,因此这个时候我们就可以想办法借助你的u盘或其它盘上的grub启动起来linux,而后在linux启动完以后在linux启动系统中使用grub-install 命令重装一遍grub,他依然会像安装系统一样的方法将你的windows的启动项也重新编辑,而后把自己的bootloader安装在mbr中去

    c、grub-instll:问题是如何安装grub呢?我们可以通过grub-install命令来安装,注意,此命令会安装第一阶段,第1.5阶段和第二阶段,我们第二阶段在哪儿呢?在你的磁盘的分区上的boot目录下,所以他会在此目录下装一个grub目录,所以他还必须得去找这么一个boot目录,然后在下面创建一个grub,如果说按照我们此前的法则,这个分区是单独的,他没有和我们的根分区在一块,大家知道我们的boot分区反而还不能在我们根所在的分区上,他要在别的分区上才可以,因此面对这种情形,假如现在我们有第二块硬盘,我们如何给第二块硬盘安装grub呢?而且安装完以后我们也期望我们对应的grub是在一个单独的分区上的,或者我们boot是一个单独的分区。该怎么实现呢?

  3、手动安装grub

    a、我们在主机上添加一块新硬盘,并给其分区,然后格式化文件系统

      

      

      mke2fs -t ext4 /dev/sdb1(将来当grub的根目录)

      mkswap /dev/sdb2

      mke2fs -t ext4 /dev/sdb3

     b、现在我们在系统的/mnt目录下创建一个boot,然后我们去挂载的时候把/dev/sdb1挂载至该目录

      

     c、现在我们来使用grub-install 来安装,我们设置安装的grub的根目录为/mnt,就不用再设置/mnt/boot了,因为他会自动去找boot目录的

      

 

      此时我们可以看到我们的stage1,stage1.5和stage2都在了,其实我们的stage1此时已经安装在我们这个/dev/sdb这块硬盘上的mbr中了。

     d、我们发现还没有配置文件,不过配置文件就需要我们自己写了,但是就算我们自己可以写但是此时我们的/mnt/boot目录下还没有内核文件,因此我们需要将我们的内核文件复制到我们的/mnt/boot目录中来,我们的内核文件在/boot下,还有我们的initrd文件也需要复制,复制完后我们就可以编辑我们的配置文件了(我们在写完配置文件后会将这块盘给拆下来在其它机器上启起来因此此处我们会写成 root (hd0,0),并且相应的设备名称会写成/dev/sda 如果不拆下来的话此时我们应该写成root(hd1,0),相应的设备应该写成/dev/sdb)

  

  

    e、然后我们先将我们计划作为根文件系统的/dev/sdb3挂载至当前文件系统然后创建对应的目录

    f、我们拷贝/bin/bash文件至相应我们创建的/bin目录,并且我们还可以通过ldd命令查看我们对应的二进制文件依赖于哪个库,然后我们再将对应的库文件拷贝至对应的路径就可以了

        

         

     g、此时我们可以来进行根切换然后验证我们对应的二进制文件是否可用,可以使用chroot命令

        

     h、到此为止我们这个系统就算是基本完成了,不过最后我们还需要编辑配置文件,在kernel后面加一项init=/bin/bash,而不是/sbin/init,这就是我们要求其限定的init为/bin/bash而不是/sbin/init,这样他就直接把bash作为第一个用户空间运行的程序了

      

     i、接下来我们新建一个虚拟机,选择这个虚拟机的硬盘文件为刚刚我们创建的那块硬盘文件,然后我们启动起来

      

       然后我们敲e键可以看到我们编辑的相应选项

      

       然后我们敲b键就可以启动了,不过会发现启动失败,报错原因为内核没找到selinux策略,所以我们在启动菜单kernel项再加上关闭selinux项(注意,此处selinux=0必须写在前面)

      

    j、然后我们发现我们已经启动起来了

      

   4、busybox介绍

    我们将来会演示一个什么呢?就是能够实现自己去编译内核,而且内核中的所有功能我们都是禁用的,你要去选定加载各种驱动程序,从哪儿加载我们要自己能学会,更重要的是我们最后这个用户空间的程序还是完整的,但是使用busybox提供,而且也是我们自己编译的,启动起来以后我们还会让他实现功能比如说能有多个虚拟终端,能给你提供账号密码认证,而且我们还可以在里面装上一个ssh服务可以远程连接,再给其提供一个nginx让其能够提供web服务,而总体上大小不超过10M左右,最大不会超过15M,而我们上机上的,就是安卓系统背后其实跑的就是一个kernel加上一个busybox,然后他里面又跑了一个java虚拟机把你的安卓程序部署在java虚拟机上,就这样在跑。但是为了方便使用他把整个系统做成了一个rom镜像,以后在需要用到时他把这个rom镜像就和我们装windows系统一样啥也不需要选择他就告诉你装好了,不过对于手机来讲可能要麻烦很多,因为他还要选择基带版本,我们要有对应的基带,不然它手机的频率,芯片这些都无法驱动。其实将来学到这个阶段以后你可以自己去到google官方站点安卓系统上去下载一个去加载一个内核源码文件,自己去做能适用在arm平台上的内核做交叉编译,而后给他提供他的自定义环境,把安卓系统也给他灌进去,这时候就是一个纯净无比的安卓系统,而且你自己可以给他做成rom,这个不难,不过你需要对你手机上的硬件的每一个芯片的型号有精确的理解,否则的话任何一个驱动选择不上你可能都没法做出来,这需要相当长的时间。

   5、现在我们将我们虚拟机中sda这块磁盘中的mbr中的Bootloader给他敲坏。方法很简单,我们使用dd命令就可以

    a、首先我们先备份一份mbr

      

     b、接着我们来把它敲坏,注意不要敲坏了分区表,我们敲坏前446个字节就可以了

      

       敲sync就同步到磁盘中去了

      此时其实我们的mbr表已经坏了,不信你可以重启一下

    c、现在我们来进行手动修复

      

       相当于设定我们的根,并且指定设备,此命令会自动把grub第一阶段给你重装一次,

    d、接下来我们用另一种办法进行修复,我们先再破坏一下然后再修复

      (1)、只要没有重启,我们可以通过grub命令进入grub命令提示符的接口下,在这个接口下也能做修复的,修复办法很简单,先指明谁是根,

      

       (2)、接下来我们需要安装第一阶段,安装第一阶段要确保这里根目录下的boot目录下得有第1和1.5阶段的文件,什么意思呢?大家知道我们在我们的/boot/grub目录中,有第一阶段和第1.5阶段的文件,他需要去读这个目录下的第一阶段给你装到mbr目录中去,因此在这个目录下我们可以直接使用setup命令进行安装第一阶段,安装到哪儿呢?就选择hd0这块硬盘上

      

         我们可以看到上面的信息,他首先装了第一阶段,然后把mbr后面的27个扇区作为了mbr的1.5阶段了

      然后我们可以quit退出,然后sync命令同步到磁盘中,然后reboot即可

  6、安装grub总结

    a、grub-install 

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

    b、grub

      grub> root (hd#,#)

      grub> setup (hd#)

  7、现在我们有意的再破坏一次,这次破坏了以后我们又重启了,此时我们就需要使用紧急救援模式来实现

    a、首先我们先破坏然后重启

      

     b、此时我们需要载入我们的光盘设备,然后进入紧急救援模式,也可以此时先敲ESC键,回到他的命令行模式下,键入linux rescue命令,这就是相当于进入了紧急救援模式,你可以把它理解为windows的win pe,就是帮我们修复磁盘的,只是此时我们称之为紧急救援模式而已

      

       

       上面表示如果他会去找我们当前是否安装的有文件系统,如果找到了他会将相应的根挂载至我们的 /mnt/sysimage这个目录下,到时候你可以去这个目录下找你需要的所有文件,

       

      上面表示他已经将/挂载至/mnt/sysimage,将来你用的时候使用chroot目录即可,然后我们就可以打开我们的shell了,此时我们就可以在shell目录下通过grub-install安装相应的grub文件即可

     

       然后我们再重启即可。

 四、作业

    

原文地址:https://www.cnblogs.com/Presley-lpc/p/12525121.html