grub:GRand Unified Bootloader

  • grub 0.x:grub legacy(centos5,6)
  • grub 1.x:grub2(centos7)

grub legacy(grub 0.x)

stage1:mbr

stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

stage2:磁盘分区(/boot/grub/)

centos6:

# ls /boot/grub/
device.map fat_stage1_5 grub.conf jfs_stage1_5 minix_stage1_5 splash.xpm.gz stage2 vstafs_stage1_5 e2fs_stage1_5 ffs_stage1_5 iso9660_stage1_5 menu.lst reiserfs_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5

stage2和内核,通常放置于基本的磁盘分区,不可以是lvm和软raid。读取lvm和软raid分区,是需要根文件系统里的驱动程序的,这时根文件系统还没有加载。

根文件系统,一般都是逻辑分区,以方便扩容和管理,如果/boot也和根文件系统在同一个分区里的话,由于grub程序无法加载逻辑分区里的文件,所以就无法访问/boot目录,也就不能加载内核,系统就无法启动了。所以这就是/boot独立分区的原因。

如果根文件系统不使用逻辑卷,那么/boot是可以不独立分区的。

安装centos6操作系统时,如果不是手动分区的话,会自动把/boot独立出来成一个分区;而把/和swap它们2个做成逻辑分区.

验证一下centos6:

首先使用fdisk,可以看出/dev/sda2是Linux LVM(逻辑分区);而/dev/sda1是普通分区。

再用pvs,可以看出/dev/sda2里的vg的名字是vg_c610

再用vgs,可以看出vg_c610里有2个LV

再用lvs,可以看出vg_c610里的2个LV分别是lv_root和lv_swap

再用mount,可以看出逻辑分区lv_root的挂载点是/;/dev/sda1挂载到了/boot

# fdisk -l /dev/sda
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 1045 7875584 8e Linux LVM
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 vg_c610 lvm2 a--u 7.51g 0
# vgs
VG #PV #LV #SN Attr VSize VFree
vg_c610 1 2 0 wz--n- 7.51g 0
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_root vg_c610 -wi-ao---- 6.71g
lv_swap vg_c610 -wi-ao---- 816.00m
# mount | grep "^/dev"
/dev/mapper/vg_c610-lv_root on / type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)

stage2的作用:

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

  • 按e键:进入编辑模式,用于编辑菜单
  • 按c键:命令模式,进入交互式界面。

2,加载用户选择的内核或操作系统

  • 允许传递参数给内核
  • 可以隐藏此菜单

3,为菜单提供了保护机制

  • 为编辑菜单提供密码保护
  • 为启动内核提供密码保护

grub命令使用:

  • help获取帮助;help KEYWORD 某个命令的详细信息

  • 识别设备:root (hd#,#):hd和外面的括号是固定的。第一个数字标识是第几块磁盘;第二个数字标识是第几个分区。数字从0开始。从grub2开始就是从1开始编号了。

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

  • 查找命令:find

    查找时,必须指明在哪个磁盘的哪个分区。

    查找内核,知道内核文件的名字,但不知道在磁盘的哪个分区啊,但查找时还必须指明磁盘和分区,太坑了,只能瞎试了。在(hd0,0)里找到了内核文件。

    grub> find (hdx,y)/vmlinuz-3.10.0-957.el7.x86_64

    从网上找到的磁盘和grub命令里的hd(#,#)的对应关系,不知道对不对了

    • sda1表示第一块硬盘第1个主分区=hd(0,0)
    • sda2表示第一块硬盘第2个主分区=hd(0,1)
    • sdb1表示第二块硬盘第1个主分区=hd(1,0)
    • sdb2表示第二块硬盘第2个主分区=hd(1,1)
  • 进入选定磁盘:root

    grub> root hd(0,0)
    grub> find /vmlinuz-2.6.32-754.el6.x86_64
    hd(0,0)

    进入磁盘后,使用find命令时,就不用加磁盘了。

    注意:如果/boot是和根文件系统放在了一个文件系统上了的话,路径就要加上/boot。grub> find /boot/vmlinuz-2.6.32-754.el6.x86_64

  • 选择要启动的内核:kernel /PATH/TO/KERNEL_FILE

    内核的文件名:vmlinuz*

    额外还可以指定许多内核参数。

    例如:

    • selinux=0(不启用selinux功能)
    • init=/sbin/init(第一个用户空间的程序)
  • 选择要内核要使用的ramdisk文件:initrd /PATH/TO/RAMDISK_FLLE

    centos6:initramfs.img。

    注意:ramdisk文件的版本号要和内核的版本号完全一样

  • 启动选定的内核:boot

操作系统启动的内幕:

1,显示可启动的操作系统列表。

2,选择要启动的系统后,按e键,进入下面的画面。

第一行(root (hd0,0)):指定内核vmlinuz-2.6.32-754.el6.x86_64所在的磁盘和分区

第二行:vmlinuz-2.6.32-754.el6.x86_64的位置,和内核启动的参数。ro:是只读。root是根文件系统所在的分区。

第三行:内核启动时,使用的ramdisk文件的位置

当在选择要启动的操作系统的界面,敲回车后,实际允许的就是这3行指令。

手动启动系统

控制上图显示的内容的配置文件:/etc/grub.conf,损坏了的时候,就不知道要用哪个内核和ramdisk等启动系统了,但启动后,能进入grub命令行界面,这时可以手动指定内核,ramdisk后,执行开机。

1,选定要启动的kernel

grub> root (hd0,0)
grub> kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root

2,选定kernel要使用的ramdisk文件

grub> initrd /initramfs-2.6.32-754.el6.x86_64.img

3,启动选定的kernel

grub> boot

grub配置文件说明

/etc/grub.conf文件的内容:

  • default:多个操作系统的时候,让哪个操作系统被默认选择上。
  • timeout:等用户5秒,如果用户没有操作,则启动默认选项上的操作系统。
  • splashimage:选择操作系统界面的图片。
  • title:显示的内容
    • root:指定内核vmlinuz-2.6.32-754.el6.x86_64所在的磁盘和分区
    • kernel:vmlinuz-2.6.32-754.el6.x86_64的位置,和内核启动的参数。
    • initrd:内核启动时,使用的ramdisk文件的位置
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img

手动加一个操作系统:添加title和其下面的root等。

当按e键后,需要输入密码:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0。写在hiddenmenu上面。

当按回车键后,需要输入密码:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0,才能启动系统。写在initrd下面。

生成md5密码的命令:grub-md5-crypt

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img title CentOS 6 (my test)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img
password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0

启动时的menu图:

进入单用户模式的方法

1,在选定的操心系统上,按e键

2,在选定的kernel上,按e键,然后在显示的kernel参数后面,按空格 ,在按1或s或S键,然后回车,最后按b键。

grub坏了,修复grub

损坏情况1:/boot所在的分区里的内容,被误删除了,而且已经关机了,如何修复?

下面模拟这种损坏的情形,把损坏的grub的磁盘拆下来,连到另一个主机上,这个主机上有一个磁盘是/dev/sda,连上损坏的磁盘后,损坏的磁盘是/dev/sdb。修好后,拆下原来的/dev/sda,所以修好的磁盘就变成了/dev/sda。

1,找个新的磁盘,模拟成grub损坏的磁盘,分3个区,/dev/sdb1放/boot,/dev/sdb3放根文件系统,/dev/sdb2放swap

# fdisk -l /dev/sdb
Device Boot Start End Blocks Id System
/dev/sdb1 1 14 112423+ 83 Linux
/dev/sdb2 15 40 208845 82 Linux swap / Solaris
/dev/sdb3 41 105 522112+ 83 Linux
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb3
# mkswap /dev/sdb2

2,挂载分区

# mount /dev/sdb1 /mnt/boot/
# ls /mnt/boot/
lost+found

3,使用grub-install安装grub

选项--root-directory:告诉grub-install去哪个目录找/boot;后面的分区是告诉grub-install去哪个分区找/boot。

执行成功后,在/mnt/boot/grub目录下,创建出了stage文件。

# grub-install --root-directory=/mnt /dev/sdb1
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/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'. (fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
# ls /mnt/boot/grub/
device.map grub.conf minix_stage1_5 ufs2_stage1_5
e2fs_stage1_5 grub.conf~ reiserfs_stage1_5 vstafs_stage1_5
fat_stage1_5 iso9660_stage1_5 stage1 xfs_stage1_5
ffs_stage1_5 jfs_stage1_5 stage2

4,安装grub后,/boot目录下没有内核和ramdisk,所以从别的地方复制内核和ramdisk过来

# cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/
# cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot
# ls /mnt/boot/
grub initramfs-2.6.32-754.el6.x86_64.img lost+found vmlinuz-2.6.32-754.el6.x86_64

5,创建/boot/grub/grub.conf文件

注意:kernel和initrd放在(hd0,0)里了;而且假设根文件系统在/dev/sda3上。

default=0
timeout=5
title CentOS 6 (test)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3
initrd /initramfs-2.6.32-754.el6.x86_64.img

6,由于/dev/sda3里没有根文件系统,手动创建

# mkdir /mnt/sysroot
[root@c610 ~]# mount /dev/sdb3 /mnt/sysroot/
[root@c610 ~]# cd /mnt/sysroot/
[root@c610 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr bome root mnt media

7,内核启动后,要启动init程序,创建能够启动init的环境太复杂,简单点,就让内核启动后,不启动init,而是启动bash程序。

把bash的可执行文件和所依赖的库都拷贝到/dev/sda3.

用ldd命令可以知道可执行文件都依赖了哪些库文件。

测试bash是否可用,使用chroot命令切换根文件系统。切换后,直接进入了bash,说明bash可以正常运行。尝试运行ls命令,ls命令没有,因为没把ls的可执行文件和库拷贝过来。cd和pwd是bash的内建命令,所以可以正常使用。

[root@c610 sysroot]# cp /bin/bash /mnt/sysroot/bin
[root@c610 sysroot]# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffeb5542000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000030ab800000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000030a9000000)
libc.so.6 => /lib64/libc.so.6 (0x00000030a9400000)
/lib64/ld-linux-x86-64.so.2 (0x000056492e521000)
[root@c610 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
[root@c610 sysroot]# chroot /mnt/sysroot/
bash-4.1# ls
bash: ls: command not found
bash-4.1# cd /tmp
bash-4.1# pwd
/tmp
bash-4.1# exit
exit
[root@c610 sysroot]#

8,修改/boot/grub/grub.conf文件

由于内核启动后,默认是启动init程序,所以必须修改内核默认启动的程序,修改成bash

而且还要指明参数:selinux=0,放在init参数前面

default=0
timeout=5
title CentOS 6 (test)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-754.el6.x86_64.img

9,拆下原来的/dev/sda,所以修好的磁盘就变成了/dev/sda,用修改的磁盘系统系统。

正常启动了:

损坏情况2:/boot所在的分区里的内容,被误删除了,还好没有关机,如何修复?

不用拆硬盘了,直接在当前系统,恢复就好了。修复方法和上面差不多。

使用光盘,进入救援模式

也可以修复上述的损坏情况1。

光盘救援模式的原理是,光盘里有能运行的bash程序,通过bash程序,调用grub-install命令就完成了修复grub,如果/boot里的内核文件也损坏了,光盘里也有内核,可以复制过去。但是如果ramdisk坏了,就不能修复了。ramdisk是按照操作系统时生成的,所以光盘里没有。但可以在同一台机器上再安装一次,再生成一个ramdisk文件。

# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854

centos5,6的GRUB简介的更多相关文章

  1. MBR与GRUB简介

    在坛子里找到一篇关于grub和mbr工作原理的文章,以前一直都是一头雾水,今天转这文章学习下..哈.. 能正常工作的grub应该包 括一下文件:stage1.stage2.*stage1_5.menu ...

  2. GRUB启动管理器

    Linux学习笔记之 5 Linux GRUB启动管理器 1.GRUB简介 1.1grub与启动引导器     启动引导器是计算机启动过程中运行的第一个真正的软件,通常计算机启动时在通过BIOS自检后 ...

  3. Linux的启动流程以及GRUB详解

     一.Linux引导和启动流程       概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...

  4. grub.conf解析

    一.grub简介系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化 ...

  5. grub命令行和配置文件配置配置信息

    一.grub简介 GNU GRUB(简称“GRUB”)是一个来自GNU项目的启动引导程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系 ...

  6. linux 文件系统简介

    linux文件系统简介   文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...

  7. YUM源的简介,配置与使用

    A.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  8. linux文件系统简介

    文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...

  9. Tiny PXE Server简介

    Tiny PXE Server简介Tiny PXE Server是一款小巧而功能强大的网启软件.支持DHCP TFTP HTTP BINL DNS等多个协议,支持grub4dos,pxelinux,i ...

随机推荐

  1. Python通过win32 com接口实现offic自动化

    最近几天通过Python做一些自动生成office报表的东东,比如解析.xml文件,导出.html/WORD/PPT等格式,html不足一提,只需要简单的html静态网页知识即可,这儿要说的是怎么生成 ...

  2. Windows玩转Kubernetes系列2-Centos安装Docker

    接上一章,Windows玩转Kubernetes系列1-VirtualBox安装Centos,我们开始学习如何在Centos中安装Docker 准备 关闭防火墙 防火墙一定要提前关闭,否则在后续安装K ...

  3. Mondriaan's Dream 轮廓线DP 状压

    Mondriaan's Dream 题目链接 Problem Description Squares and rectangles fascinated the famous Dutch painte ...

  4. c语言秋季作业3

    本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业链接 我在这个课程的目标是 运用C语言编程解决一些简单的数学问题 这个作业在那个具体方面帮助我实现目标 学习if else ...

  5. DRF框架之使用Django框架完成后端接口(API)的定义

    学习DRF框架,首先我们就需要明白为什么要学习这个框架. 接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API). RESTful接口的需求如下: GET /boo ...

  6. 小米重新上锁[BL]

    解锁一时爽,bug火葬场.废话不多说,直接上教程. 首先安装 线刷工具:http://bigota.d.miui.com/tools/MiFlash2018-5-28-0.zip 解锁工具:http: ...

  7. 二、Linux系统硬链接和软链接详细介绍与实践

    链接的概念 在linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link).在默认不带参数的情况下,执行ln命令创建的链接是硬链 ...

  8. 用上自己的线程池,实现自己的RPC框架

    package github.com.AllenDuke.rpc.customer; import github.com.AllenDuke.rpc.netty.NettyClient; import ...

  9. 行人重识别和车辆重识别(ReID)中的评测指标——mAP和Rank-k

    1.mAP mAP的全称是mean Average Precision,意为平均精度均值(如果按照原来的顺利翻译就是平均均值精度).这个指标是多目标检测和多标签图像分类中长常用的评测指标,因为这类任务 ...

  10. jQuery 基础 (笔记源于runoob)

    您需要具备的基础知识 在您开始学习 jQuery 之前,您应该对以下知识有基本的了解: HTML CSS JavaScript jQuery ? jQuery是一个JavaScript函数库. jQu ...