首页 > 代码库 > CentOS 系统启动流程之GRUB

CentOS 系统启动流程之GRUB

系统启动之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

技术分享


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

 功用:

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

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

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

技术分享

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

        允许传递参数给内核

        可隐藏启动菜单

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

        为编辑启动菜单进行认证

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


4.识别硬盘设备:

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

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

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

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

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


5.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


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

      grub> root (hd#,#) 

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

      grub> initrd/initramfs-VERSION-RELEASE.img

      grub> boot  # 启动

技术分享

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

技术分享




三、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: 

$1$X8cVMw5v$AH0aUHVNix7Tx6wmHAXsf1


[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

技术分享


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

操作步骤及过程如下:

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

技术分享

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

技术分享

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

技术分享

技术分享

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

技术分享

技术分享



4.破解root口令:

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

5.进入单用户模式

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

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

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


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

    1)在进入开机界面的时候,按任意键进入菜单界面,如下演示:技术分享

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

技术分享

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

技术分享



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#)











CentOS 系统启动流程之GRUB