设为首页 收藏本站
查看: 821|回复: 0

[经验分享] CentOS 系统启动流程之GRUB

[复制链接]

尚未签到

发表于 2018-4-25 06:56:30 | 显示全部楼层 |阅读模式
GRUB加密、修复和破解密码实战指南

  
GRUB(Boot Loader


  • 从系统启动流程可以得知,在BIOS读取相关信息之后,接下来是去第一个可以启动的设备当中的MBR中读取Boot Loader信息,Boot Loader提供具有菜单功能、直接加载内核信息,以及相关的控制权转交功能。所以说系统启动必须要有Boot Loader,然后才能去加载内核。

  • Boot Loader存储于MBR当中,MBR只有512bytes,其中446bytes存储Boot Loader,但是Boot Loader功能很强大,所以446bytes是远远不够的,所以就用到了grub,并将Boot Loader的程序运行与配置项加载分成三个阶段(stage)来运行。

  

  
grub: GRand Unified Bootloader

一、版本如下:

         grub 0.x: grub legacy

         grub 1.x: grub2

  

  
二、grub legacy:

  
1.分为三个阶段

  
⊙ stage1: 运行Boot Loader主程序,这个程序必须要安装在启动区,即MBR中。因为MBR空间有限,因此在MBR当中仅安装Boot Loader的最小程序,并没有安装Boot Loader的相关配置文件;

⊙ stage1_5: 在MBR随后的扇区中存放,让stage1中的bootloader能识别stage2所在的分区上的文件系统(相当于文件系统的驱动);

⊙ stage2:通过Boot Loader加载所有配置文件及相关的环境变量参数信息,这些配置文件及相关的环境参数都存放于磁盘分区上的/boot/grub目录下。
  

2.配置文件:

  
  /boot/grub/grub.conf<--/etc/grub.conf

DSC0000.png

  

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

⊙ boot单独分区是用来存放与linux系统启动有关的程序,比如,内核文件、启动引导装载程序,启动菜单配置文件等;

⊙ boot作为一个单独的分区,也就意味着这个单独分区下有一个grub,因为grub刚启动的时候,操作系统还没有启动(真正的根文件系统还没有被加载),所以,不能通过访问/boot/grub来实现,但是我们又需要访问这个文件来执行stage2 阶段。所以,grub中就有一个root命令,指明的就是把stage2 阶段直设为根,而grub自带有文件系统驱动(stage 1.5),所以就可以直接访问分区及根下的所有文件即kernel,initrd等来选择内核启动;

⊙ boot目录,有没有单独分区(或者说引导分区是不是一个独立的分区),决定了在grub中的访问路径是否一样。而grub中的root命令,指明的就是这个根分区是谁,如果boot被单独分区了,那么就直接指向这个新分区,访问路径就直接把boot给去掉了;如果boot没有被单独分区,就是挂在根分区上,那就意味着/boot目录是绕不过去的,访问的时候只能先访问根,在访问根下的boot。

⊙ grub要想访问某一分区,这个分区必须是基本磁盘分区,不可能是提供了非常复杂的驱动程序(如RAID,LVM)。如果想把根做的复杂些(比如LVM)但又不对boot做单独分区,那把逻辑卷往分区上一放,就找不到grub中的stage2阶段了,所以,要想把根做的复杂,就只能把boot作为一个单独的基本磁盘分区;

⊙ 如果不使用逻辑卷,boot是可以不用单独分区的。

  

4.grub功用


  • 提供启动菜单、并提供交互式接口;

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

         c: 命令模式,交互式接口

DSC0001.png


  • 加载用户选择的内核或操作系统;

        允许传递参数给内核

        可隐藏启动菜单


  • 为菜单提供了保护机制;

        为编辑启动菜单进行认证

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

  

5.识别硬盘设备:

  (hd#,#) 表示第几块磁盘的第几块分区


  • 硬盘代号以小括号()括起来

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

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

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

  

6.grub的命令行接口


  • help: 获取帮助列表

  • help KEYWORD: 详细帮助信息

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

  • root (hd#,#)

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

        例如:max_loop=100 selinux=0 init=/path/to/init


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

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

  • cat /proc/cmdline 内核参数

  • 内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

      
  

7.手动在CentOS 6 grub命令行接口启动系统:


  • grub> root (hd#,#) 这里的根为grub的根,而非根文件系统的根(真正的文件系统还没有加载)

  • grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE (文件系统的跟)

  • grub> initrd/initramfs-VERSION-RELEASE.img

  • grub> boot # 启动

DSC0002.png

   如果每次都手动编辑,并不是所有人都能够完成的,所以就加了一个菜单项,菜单上显示的内容其实也就是grub配置文件中的设置,如下所示:

DSC0003.png

  
三、grub legacy:配置文件

  

1.查看配置文件/boot/grub/grub.conf如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  [root@localhost ~]# openssl passwd -1    //MD5加密转换
  Password:
  Verifying - Password:
[size=1em]$1$X8cVMw5v$AH0aUHVNix7Tx6wmHAXsf1

[size=1em]

  [root@localhost ~]# vim /etc/grub.conf
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE:  You have a /boot partition.  This means that
  #          all kernel and initrd paths are relative to /boot/, eg.
  #          root (hd0,0)
  #          kernel /vmlinuz-version ro root=/dev/sda2
  #          initrd /initrd-[generic-]version.img
  #boot=/dev/sda
  default=0 #设定默认启动菜单项,默认为0开始
  timeout=5 #指定菜单等待选择的时长  
  splashimage=(hd0,0)/grub/splash.xpm.gz #指定菜单的背景图片的路径,为xpm格式,采用gzip压缩
  hiddenmenu #是否影藏菜单
  password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/ #菜单编辑认证
  title CentOS 6 (2.6.32-642.el6.x86_64) #定义菜单项
  password 123456 #可以选择明文
      root (hd0,0) #本次grub查找stage2及其kernel文件所在设备分区,指定grub的根
      kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=240533cf-b37f-4460-974f-702bab867da5 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #需要启动的内核  
      initrd /initramfs-2.6.32-642.el6.x86_64.img #内核匹配的ramfs文件
  

2.每行含义如下:


  • default=#: 设定默认启动的菜单项;假如同时装有多个操作系统,0表示定义的第一个title系统,1表示定义的第二个title系统,以此类推;

  • timeout=#:表示可供选择的等待时间,如果超出5秒,则使用默认的启动条目default定义的;

  • splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜单背景图片文件路径;

  • hiddenmenu:隐藏菜单,默认是不显示菜单信息,如果要想显示菜单,可以将该配置信息注释即可;

  • password [--md5] STRING: 启动菜单编辑认证

  • title TITLE:定义菜单项“标题”(操作系统名称), 可出现多次,用来引导不同的操作系统或内核;

         ◎root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub“根”。也就是说,表示的是内核文件的存放位置,这里指的是分区位置,而非根目录;
         ◎kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:内核的名称,以及一些启动时的核心参数。由于启动过程中需要挂载根目录,因此就需要指定根目录所在的分区。rhgb表示色彩显示,quiet表示静默模式加载内核。
         ◎initrd/PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件,虚拟文件系统;
         ◎password [--md5] STRING: 启动选定的内核或操作系统时进行认证。

  

=================================================================================

3.生成密码的命令:

       grub-md5-crypt

openssl passwd -1

DSC0004.png

  
[实验1为编辑启动菜单进行认证;为启用内核或操作系统进行认证]

操作步骤及过程如下:

1)复制一份内核文件,改名为Tao Linux,并分别在第一个title之前和第二个title之后添加生成的加盐密码,保存并退出,并重启系统;

DSC0005.png

   2)重启系统之后发现要为进行编辑启动菜单的认证,效果如下:

DSC0006.png

3)按“p”键输入密码之后,可以发现原来的提示信息又回来了,这是我们就可以编辑了

DSC0007.png

DSC0008.png

4)选择第二个内核作为启动程序,按回车键发现要想启动内核,要输入密码认证,说明我们为内核设置的密码,起作用了。

DSC0009.png

DSC00010.png

  

  
4.破解root口令:

   启动系统时,设置其运行级别1

5.进入单用户模式


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

  • 在选定的kernel后附加1, s, S或single都可以然后按回车键;

  • 在kernel所在行,键入“b”命令,进入单用户模式

      
  

[实验2]:单用户模式下修改密码:

     1)在进入开机界面的时候,按任意键进入菜单界面,如下演示: DSC00011.gif

2)因为我们在编辑启动菜单前设置了认证,所以需要输入密码,按“p”输入密码后进入编辑菜单,然后选定要启动的内核,按“e”键进入编辑模式,如下演示: DSC00012.gif

3)选定好要启动的kernel后,按“e”键进入,然后在选定的内核后添加1, s, S或single,然后按回车键,紧接着在kernel所在行输入“b”进入单用户模式,如下演示: DSC00013.gif

  
6.安装grub的两种方法:

  
1)使用grub-install命令直接修复
    安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下,命令如下:
         grub-install --root-directory=DIR /dev/DISK
   
2)使用grub进入命令提示符下的接口进行修复:
         grub> root (hd#,#)
         grub> setup (hd#)
注意:
   方法一:不要求指定的根下有boot目录,以及下面的grub,stage1,stage1.5,stage的文件,他会自动检测,装好并修复;
   方法二:要求在指明的root设备上必须要存在有一个grub目录,并且其下的stage1,stage1.5,stage2 这些文件必须    存在才可以修复。
  
[实验3破坏grub的第一阶段,并修复grub,完成启动](以CentOS 6 为例)


实验步骤如下:

  1)为了防止意外,我们首先将bootloader备份,如下:

[root@CentOS6 ~]# dd if=/dev/sda of=/root/mbr.bak count=1 bs=512
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000406463 s, 1.3 MB/s
2)接着把grub的第一阶段破坏了(注意不要把分区表给破坏了),如下:

[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破坏grub第一阶段
1+0 records in
1+0 records out
200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s
[root@CentOS6 ~]# sync  #同步到磁盘
   3)其实到这里,如果重启系统的话已经启动不起来了,因为把bootloader的第一阶段破坏了,后面的所有启动流程都将无法进行,连启动菜单都没有。只能通过在救援模式的环境下进行修复,因为在这里,我们没有重启,所以可以直接手动修复,方法如下:

  方法一:

[root@CentOS6 ~]# 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   #修复完成
[root@CentOS6 ~]# sync # 修复完成,并同步到磁盘
  方法二:grub命令,进入其命令提示符的接口下进行修复

[root@CentOS6 ~]# grub  # 使用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  # 查找stage1/1.5/2文件是否存在
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.
grub> quit #退出
quit
[root@CentOS6 ~]# sync # 同步到磁盘  

[实验4救援模式下怎样修复grub]

    如上实验是在不重启的情况下进行修复的,那怎样在重新启动是进行修复grub呢?那就要采用救援模式了,方法如下:

步骤如下:

1)首先破坏grub的第一阶段,重新启动

[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破坏grub第一阶段
1+0 records in
1+0 records out
200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s
[root@CentOS6 ~]# sync  #同步到磁盘  
  可以看到,系统已经彻底歇菜,启动不起来了!


DSC00014.png

    2)这个时候我们就需要挂载系统安装光盘,进入紧急救援模式,如下,选择第三项即可,或者按esc键,在命令行模式下输入 # linux rescue 就可进入救援按模式  

    DSC00015.png

  3)进入救援模式会提示要选择的相关信息。首先,选择要使用的语言:

DSC00016.png

   选择要使用的键盘

DSC00017.png

  这里提示我们要不要启动网络功能,如果我们需要通过上网下载文件来修复就选择启动网络服务,这里我们不需要,选择NO

DSC00018.png

   这里主要是提示我们,救援模式会尝试去寻找硬盘上是否有操作系统,如果有的话会挂载到/mnt/sysimage 下,可以到这个里面寻找所需要的文件。这里我们选择continue

DSC00019.png

搜索并提示我们系统找到了,并且已经挂载至/mnt/sysimage 下,如果要使用的话可以使用 chroot /mnt/sysimage 命令把根切换过去。选择OK

DSC00020.png

提示我们系统已经挂载到/mnt/sysimage 目录下

DSC00021.png

   提示我们是否开启一个shell脚本,这里选择OK

DSC00022.png

4)上面这些信息选择好以后就进入到了救援模式下,并打开了一个shell提示符,我们执行如下操作即可:

DSC00023.png

5)成功启动,并登陆:

DSC00024.png


总结:GRUB启动故障排除案例

1.MBR中grub损坏,1_5阶段的数据损坏,2阶段的grub损坏

2.initramfs*.img文件损坏,内核文件损坏

3./boot/grub/grub.conf文件丢失

4./etc/fstab丢失,无法挂载根等文件系统

5./boot 目录全部的文件丢失



解决方法(都是在救援模式下)
1. MBR中grub损坏,1_5阶段的数据损坏,2阶段的grub损坏
救援模式,

  • chroot /mnt/sysimage 切根,改变磁盘根目录
  • grub-install /dev/sda 安装grub引导程序到磁盘/dev/sda的MBR扇区

2. initramfs*.img文件损坏,内核文件损坏

1)initramfs*.img文件损坏,解决方法:


  # chroot=/mnt/sysimage
  # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  #创建 2)内核文件损坏
[size=1em]救援模式下


  • [size=1em]mkdir /mnt/cdrom

  • [size=1em]mount /dev/cdrom /mnt/cdrom  挂载光盘

  • [size=1em]进入/mnt/cdrom/Packages/ 目录下覆盖安装kernel包,
    rpm -ivh–replacepkgs kernel-VERSION.rpm –root=/mnt/sysimage –force

  • [size=1em]安装完成后会在/boot目录下自动生成相应版本的vmlinuz文件.
    (前提是内核版本未更新, 和光盘中的内核版本一致)


3. /boot/grub/grub.conf文件丢失
这个新建一个写上引导等信息就行,详见实验3,实验4

4. /etc/fstab丢失,无法挂载根等文件系统

同样新建一个/etc/fatab、填写上挂载信息
lvm 的话需要激活lvm逻辑卷


5. /boot 目录全部的文件丢失
结合上面,先MBR修复,然后内核文件修复和initramfs*.img文件 修复

  

  修复initramfs文件

  

  1、救援模式
  2、chroot /mnt/sysimage
  3、mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`
  4、exit;exit;reboot
  ===========================================================================================
  

  实验:
  删除/boot,恢复

  •   rm -rf /boot
  •   光盘启动,进入rescue模式
  •   mkdir /mnt/cdrom
  •   mount /dev/cdrom /mnt/cdrom
  •   rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm --root=/mnt/sysimage --replacepkgs|force
  •   chroot /mnt/sysimage
  •   grub-install /dev/sda
  •   vim /boot/grub/grub.conf
  ===========================================================================================
  实验:
  删除/boot 和/etc/fstab,恢复之

  •   rm -rf /boot /etc/fstab
  •   光盘启动,进入rescue模式
  •   检查/
  blkid;fdisk -l
  mkdir /mnt/sda2
  mount /dev/sda2 /mnt/sda2
  vi /mnt/sda2/etc/fstab
  /dev/sda1 /boot ext4 defaults 1 1
  /dev/sda2  /  ext4 defaults 1 2

  •   reboot
  •   光盘启动,进入rescue模式,挂载/mnt/sysimage
  •   mkdir /mnt/cdrom
  •   mount /dev/cdrom /mnt/cdrom
  •   chroot /mnt/sysimage
  •   rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm  --replacepkgs|force
  •   grub-install /dev/sda
  •   vim /boot/grub/grub.conf
  default=0
  timeout=3
  title wanglinux
  root (hd0,0)
  kernel /vmlinuz.... root=/dev/sda2
  initrd /initramfs .
  

  ===========================================================================================
  

  实验:
  逻辑卷情况下,删除/boot 和/etc/fstab,恢复之

  •   rm -rf /boot /etc/fstab
  •   光盘启动,进入rescue模式
  •   检查
  lvscan
  vgchange -ay
  mount /dev/vg0/root /mnt/sysimage
  vi /mnt/sysimage/etc/fstab
  /dev/sda1 /boot ext4 defaults 1 1
  /dev/vg0/root  /  ext4 defaults 1 2
  /dev/vg0/usr /usr
  /dev/vg0/var /var

  •   reboot
  •   光盘启动,进入rescue模式,挂载/mnt/sysimage
  •   mkdir /mnt/cdrom
  •   mount /dev/cdrom /mnt/cdrom
  •   chroot /mnt/sysimage
  •   rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm  --replacepkgs|force
  •   grub-install /dev/sda
  •   vim /boot/grub/grub.conf
  default=0
  timeout=3
  title wanglinux
  root (hd0,0)
  kernel /vmlinuz.... root=/dev/vg0/root
  initrd /initramfs .
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-451545-1-1.html 上篇帖子: Centos 7 添加epel源 下篇帖子: RHEL/CentOS6.6SSHD服务安装、配置、使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表