Linux 引导流程 之 GRUB

来源:互联网 发布:linux光盘挂载的目录 编辑:程序博客网 时间:2024/04/29 12:58

                    

GNU   GRUB

Introduction

GNU GRUB is a Multiboot bootloader. It was derived from GRUB, the GRand Unified Bootloader,which was originally designed and implemented by Erich Stefan Boleyn.

Briefly, a boot loader is the first softwareprogram that runs when a computer starts. It is responsible for loading andtransferring control to the operating systemkernel software (suchas the Hurd orLinux). The kernel, in turn, initializes the rest of the operating system (e.g.GNU).

 

GRUB的配置文件 grub.conf

真正存在于 /boot 目录下,即 /boot/grub/grub.conf, 而/etc/grub.conf是一个软链接文件。

[root@localhost~]# ls -l /boot/grub/grub.conf /etc/grub.conf-rw-------.1 root root 759 Mar 24 18:10 /boot/grub/grub.conflrwxrwxrwx.1 root root  22 Mar 24 18:10/etc/grub.conf -> ../boot/grub/grub.conf

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

[root@localhost~]# cat /boot/grub/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 arerelative to /boot/, eg.#          root (hd0,0)#          kernel /vmlinuz-version roroot=/dev/sda3#          initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle centos (2.6.9-89.EL)    root (hd0,0)    kernel /vmlinuz-2.6.9-89.EL roroot=LABEL=/ rhgb quiet    initrd /initrd-2.6.9-89.EL.img

注释

default=0:系统缺省从第一个title启动,title之下的选项,多个操作系统时使用。default=0表示引导第一个映像所指定的系统,default=1表示引导第二个映像所指定的系统,依次类推。

timeout=5:画面等待选择时间,单位是s。

splashimage=(hd0,0)/grub/splash.xpm.gz:开机画面来自第一块硬盘的第一个分区(/boot),路径为/grub/splash.xpm.gz

hiddenmenu:隐藏选择菜单。

===以下比较重要===

titlecentos (2.6.9-89.EL):选择时的title名定义GRUB菜单项操作系统名称。每一个title都定义一个操作系统。

root(hd0,0):将GRUB的根分区设置成特定的设备和分区,比如说(hd0,0)。并挂入这个分区,即/boot 分区。那么此时GRUB的根分区就是/boot,这样件下面的kernel / initrd 根据相对路径读取文件。

kernel/vmlinuz-2.6.9-89.EL ro root=LABEL=/ rhgb quiet

指定内核所在位置,ro 表示以只读方式挂载kernel,

root=LABEL=/:挂载根分区.已卷标的形式(LABEL),要查看卷标使用命令e2label

以下为可选项

rhgb:以图形化形式启动

quiet:是否显示错误信息,这里为不显示

 

initrd/initrd-2.6.9-89.EL.img:指定内核的映像文件,路径同上

hd(X, Y)

对于Linux 系统来说,使用hd[字母]sd[字母]来表示第几块硬盘。然后 hd[字母][数字] sd[字母][数字]数字来表示第几个分区。

GRUB有点特殊:   X表示第几块硬盘,从0开始;  Y表示第几个分区,从0开始

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

(hd1, 1)表示2个磁盘第2个分区

 

grub.conf将会在系统引导时被读取

 

GRUB基本命令:

e(edit):编辑当前的启动菜单项c(command):进入GRUB的命令行方式b(boot):启动当前的菜单项d(delete):删除当前行esc返回GRUB启动菜单界面,取消所做的任何修改

应用实例:

案例:root密码忘记

进入单用户模式重新设置root密码:开机按任意键进入GRUB界面,按e 进入GRUB编辑行模式,选中kernel行,再次按e键,在新的界面的最后一行输入1 (运行级别) 或s ,即可进入单用户模式。

 首先启动linux ,在GRUB界面上会有一个“按任何键将进入启动的提示”!进入后,

1.(上下键)选择平时启动的kernel(像kernel /vmlinuz-2.6.9-89.EL roroot=LABEL=/),然后按 e ,进行修改,进入command

2.在最后输入 single 或 s 或 1

kernel /boot/vmlinuz-2.4.18-14single ro root=LABEL=/  single
4. 回车保存并返回,然后按b键启动,即可直接进入linux 单用户模式 
5. 用password  root命令修改密码

exit重新登录 或者 reboot 重启即可

 

当我们忘记root密码时如果GRUB没有设置密码(或者知道GRUB密码时)我们可以用单用户方法来修改密码;但是当我们设置了grub密码,却忘记了grub密码时,这是我们就只能得用光盘修改root密码

案例:为了系统安全,为GRUB设置密码

为grub程序设置密码,使用password,添加密码的位置不同,意义也不同。

1.若设置在title内(14行与15行间新添一行 password=load),表示启动该系统时,需要输入密码验证。

2.若放在title外,如title一行之上新添 password=edit,表示查看修改用户启动参数,需要密码验证。

3.统一密码,设置2后,在title部分最底部,即17行后新添一行 lock,表示系统密码和grub编辑密码相同

4.密码加密,终端使用grub-md5-crypt,输入密码后复制加密后字符串,将上述所说行改成 password --md5 字符串

 

        GRUB的密码设置可分为全局密码(针对GRUB)和菜单密码(针对的单一title或者说是操作系统),为了防止他人通过GRUB修改root密码大家需要设置一个全局密码。在title这个参数的上一行可以加上password=密码,保存后重新启动计算机,再次登录到GRUB菜单页面的时候就会发现,这时已经不能直接使用e命令编辑启动标签了,须先使用p命令,输入正确的密码后才能够对启动标签进行编辑。

       虽然我们设置了全局密码,但是如果他人得到了全局密码后仍然可以修改GRUB启动标签从而修改root密码;这样我们就可以设置菜单密码,设置菜单密码也非常简单,我们只需要在title的下一行加上password=密码,然后保存退出。这样即使有了全局密码也必需输入菜单密码才能够引导系统。此外,如果直接对GRUB进行明文加密也是非常不安全的,所以就要使用MD5对其进行加密。在终端中输入grub-md5-crypt回车,这时系统会要求输入两次相同的密码,之后系统便会输出MD5码。大家只需要将生成的MD5密文复制下来,然后在按照password --md5 MD5密文这个格式设置全局或者菜单密码,保存退出,重启计算机即可。


GRUB所在文件的路径:/boot/grub/grub.conf, 也可修改 /etc/grub.conf

给GRUB 设置密码有两种方式,一种是设置明文密码,一种是用 md5 设置加密密码(这也有两种),下面一个一个来作介绍:

 

1、给 GRUB 设置明文密码

编辑 GRUB 的配置文件

[root@localhost ~]# vi /etc/grub.conf#boot=/dev/hdbdefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm.gz# 下面就是设置的 GRUB 密码,123 就是GRUB 的密码password=123titlecentos (2.6.9-89.EL)# 添加 lock 选项,这样在每次系统启动的时候都会要求输入 GRUB 密码,才能进入系统,# 如果不添加 lock 选项,那么只有在要修改 GRUB 时,才需要输入密码lockroot (hd0,0)kernel /vmlinuz-2.6.9-89.EL roroot=LABEL=/ rhgb quietinitrd /initrd-2.6.9-89.EL.img
注:上面红色部分为自己手工添加的部分

重新启动电脑,进入GRUB 启动菜单 ,提示需要按‘p’ 键,以输入 GRUB 密码。

 

2、给 GRUB 设置加密密码

使用GRUB自带的grub-md5-crypt生成GRUB  MD5 加密密码

[root@localhost  ~] # /sbin/grub-md5-cryptpassword:Retype password:


# 下面就是输入的密码生成的 MD5 加密密码,将其复制或者记下来,下面用得到

 

或者在GRUB交互命令行界面中使用md5crypt命令,生成MD5加密密码

[root@localhost ~]# grubgrub>md5cryptmd5cryptPassword:123456123456Encrypted:$1$/o5CK1$CfVn1O6SFLiyJXBg4konh.grub> quitquit

接下来:复制密文添加到/etc/grub.conf 配置文件中, title的上面一行。

[root@localhost ~] # vi /etc/grub.conf#boot=/dev/hdbdefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm.gz# 明文密码与加密密码的设置就是这里的设置稍微有所不同,这样就算是别人看到你的 GRUB 配置文件,也无法知道你的密码。password --md5 $1$/o5CK1$CfVn1O6SFLiyJXBg4konh.titlecentos (2.6.9-89.EL)# 添加 lock 选项,这样在每次系统启动的时候都会要求输入 GRUB 密码,才能进入系统,# 如果不添加 lock 选项,那么只有在要修改 GRUB 时,才需要输入密码lockroot (hd0,0)kernel /vmlinuz-2.6.9-89.EL roroot=LABEL=/ rhgb quietinitrd /initrd-2.6.9-89.EL.img
注:上面红色部分为自己手工添加的部分

保存退出,reboot


案例:系统引导出错,无法正常引导,通过GRUB命令行修复

现象: 当开机后进入GRUB界面但没有菜单,直接进入命令行界面:

或者 有GRUB菜单,可以直接按‘e’编辑启动条目,也可以按 ‘c’键进入grub命令行

启动命令行后,默认当前的工作路径是 /boot

grub>  它是一个minimalBASH-like line , 利用 help 命令查看grub可用命令

GRUB支持手工完成系统引导过程:正确引导kernel载入

grub> cat ./grub/grub.conf   #查看配置文件grub> root  (hd0,0)   #系统所在的分区grub> kernel /vmlinuz-2.    #指定内核位置 可以指定运行级别grub> initrd  / #指定镜像文件grub> boot

案例:linux 修复模式(无法引导,不能通过以上方式修复:假设 /etc/inittab被损坏或删除)

利用Linux安装光盘修复

首先修改BIOS把BOOT设置为光盘启动,然后利用安装光盘重新引导系统

在安装界面出现时:按下 F5 键,进入linux rescue 修复模式

键入:

boot: linux rescue  #进入修复模式

选择continue选项,把/ 根目录挂载到 /mnt/sysimage目录下

sh-3.2#chroot /mnt/sysimage  #改变根分区,因为/目录挂载到了 /mnt/sysimage 下。

将 备份文件恢复,然后退出,系统会自动重新引导