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


[[email protected] ~]# openssl passwd -1    //MD5加密转换

Password: 

Verifying - Password: 

$1$X8cVMw5v$AH0aUHVNix7Tx6wmHAXsf1


[[email protected] ~]# 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#)

时间: 2024-11-07 00:48:33

CentOS 系统启动流程之GRUB的相关文章

Linux系统启动流程之grub

什么是GRUB GNU GRUB 是一个多重操作系统启动管理器.GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而来.GRUB 最初由Erich Stefan Boleyn 设计和应用: 系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成. Linux中GRUB的配置文件 [[email pr

inux系统启动流程之(2)grub

Linux系统启动流程之(2)grub Linux启动流程中在引导bootloader时会检查出磁盘的前446字节,从而找出/boot/grub下的相应的配置,来去挂载假根文件系统来解压内核来完成根切换. 回顾启动流程: POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /e

Linux系统启动流程之(3)系统故障修复之一

Linux系统启动流程之(3)系统故障修复之一 在使用linux中可能因为各种原因导致机器无法启动,于是针对这些问题都会应该有一个应对的措施,来恢复系统让此进行工作.下面用几个案例来逐一说明. 案例一: 破坏掉grub中bootloader,及磁盘的前446字节存放的 grub的stage1第一阶段. #使用dd命令将前446字节的bootloader数据填充为0 [[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=446 count=1

Linux系统启动流程之(3)系统故障修复之二

Linux系统启动流程之(3)系统故障修复之二 通过上一篇可以了解如何来重新安装grub从而修复grub引导,那么如果损坏的不仅仅为grub引导,如果还出现了其它更为严重的问题呢.下面几个案例来说明: 案例一: 通常系统服务运行之前会运行init程序来开启第一个进程,那么如果init被删除呢? #删除或者移动init程序到别处 [[email protected] ~]# which init /sbin/init [[email protected] ~]# mv /sbin/init /te

Linux系统启动流程之kernel

Linux系统启动流程之kernel   1.内核参数修改方法: 2.内核内核模块管理: 3.内核编译 用户空间访问.监控内核的方式:/proc, /sys 伪文件系统 /proc/sys: 此目录中的文件很多是可读写的 /sys/: 某些文件可写   1.内核参数修改方法: echo VALUE > /proc/sys/TO/SOMEFILE sysctl -w kernel.hostname= [[email protected] vm]# free -m  total   used   f

Linux系统启动流程之inittab

/etc/inittab详解 BIOS自检完成后,BIOS会根据用户设置的启动顺序来由那个设备来启动电脑的操作系统,这个设备一般是硬盘. 也就是进入到硬盘的MBR区域(引导扇区),这个区域中的有512个字节的大小,其中前446个字节中保存的程序是选择启动分区,也就是电脑由那个硬盘分区来载入开机的程序.那么在这个446个字节的空间中保存的就是启动程序,然后由这个小程序来加载存储在其他位置的操作系统,也就是启动grub程序. 当找到启动设备(硬盘)时,第一阶段所用的boot loader(存放在引导

Linux系统启动流程之chkconfig

根据用户的要求,需要在系统正常启动后自动运行某些脚本. chkconfig xxx on 这个命令就自动在对应的rc2 rc3 rc4的目录下创建脚本 先拿rc2.d来看看 这个是rc2.d目录里一个文件的内容,chkconfig 2345 57 43 2345指明了运行级别,当系统运行在2 3 4 5级别时运行该脚本,57是开机优先级 43是关机优先级.开机优先级数字越低越优先执行,关机优先级是数字越低就越迟关闭. 这个是我自己写的测试脚本 注意:这个脚本必须在/etc/rc.d/init.d

linux基础之CentOS系统启动流程

CentOS系统启动流程 Linux系统的组成部分:内核+根文件系统 内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序.安全功能 IPC:Inter Process Communication 消息队列.semerphor.shm socket 运行中的系统环境可分为两层:内核空间.用户空间 用户空间:应用程序(进程或线程) 内核空间:内核代码(系统调用) 内核设计流派: 单内核设计:把所有功能集成于同一个程序: Linux 微内核设计:每种功能使用一个单独的子系统实现: Windows

Centos启动流程及grub legacy

Linux系统的组成部分:内核+根文件系统 内核的功能:进程管理.内存管理.网络管理.文件系统.驱动程序.安全功能 系统在运行时要么就是在运行内核代码,要么就是在运行应用程序代码.如果一个程序大多数时间在内核的系统调用上,那样真正执行业务功能的时间就少了,实际生产力不大.通常在开发程序的时候,大都不是直接使用系统调用来实现功能,而是使用系统调用的二次封装(glibc库),所谓库,就是函数(功能)的集合,库中的函数名,能够接受的参数,参数类型都应该有定义(头文件). 库也是二进制程序,但是相比正常