centos5,6的GRUB简介
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

# 本人微信:xiaoshitou5854
centos5,6的GRUB简介的更多相关文章
- MBR与GRUB简介
在坛子里找到一篇关于grub和mbr工作原理的文章,以前一直都是一头雾水,今天转这文章学习下..哈.. 能正常工作的grub应该包 括一下文件:stage1.stage2.*stage1_5.menu ...
- GRUB启动管理器
Linux学习笔记之 5 Linux GRUB启动管理器 1.GRUB简介 1.1grub与启动引导器 启动引导器是计算机启动过程中运行的第一个真正的软件,通常计算机启动时在通过BIOS自检后 ...
- Linux的启动流程以及GRUB详解
一.Linux引导和启动流程 概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...
- grub.conf解析
一.grub简介系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化 ...
- grub命令行和配置文件配置配置信息
一.grub简介 GNU GRUB(简称“GRUB”)是一个来自GNU项目的启动引导程序.GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系 ...
- linux 文件系统简介
linux文件系统简介 文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...
- YUM源的简介,配置与使用
A.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...
- linux文件系统简介
文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...
- Tiny PXE Server简介
Tiny PXE Server简介Tiny PXE Server是一款小巧而功能强大的网启软件.支持DHCP TFTP HTTP BINL DNS等多个协议,支持grub4dos,pxelinux,i ...
随机推荐
- Frameworks.Entity.Core 1
CommonEnums 1系统模块BlockType 2证件类型IDType 3在线支付类型OnLineType 4操作权限,支持位移运算OperatorAuthority 5订单状态: 1000-待 ...
- ugui制作伸缩菜单
制作一个类似与这种格式的菜单,可以伸缩滑动的.今天正好项目需要用到类似功能,所以尝试了一下,做出如下的效果 虽然只是一个思路,但是可以扩展.声明一个object物体,为but,通过GetCompone ...
- Dart语言学习(九) 运算符
一.运算符及其描述 二.Dart运算符注意点 1. 除法运算符"/" 和 整除运算法"~/" 的区别 除法运算符 "/" 结果是浮点型 整 ...
- SpringCloud与微服务Ⅶ --- Feign负载均衡
官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...
- CSS 故障艺术
本文的主题是 Glitch Art,故障艺术. 什么是故障艺术?我们熟知的抖音的 LOGO 正是故障艺术其中一种表现形式.它有一种魔幻的感觉,看起来具有闪烁.震动的效果,很吸引人眼球. 故障艺术它模拟 ...
- OpenCV3入门1—环境搭建与实验
1.环境搭建 1.1 VS2017开发环境搭建 1).下载软件包 https://opencv.org/ 2).配置环境变量 配置win10系统环境变量,把下面路径添加到path. D:\WORK\5 ...
- 【动手学pytorch】softmax回归
一.什么是softmax? 有一个数组S,其元素为Si ,那么vi 的softmax值,就是该元素的指数与所有元素指数和的比值.具体公式表示为: softmax回归本质上也是一种对数据的估计 二.交叉 ...
- Codeforces_803
A. 填k个1,使矩阵主对角线对称,相同情况选择上面1数量多的. #include<bits/stdc++.h> using namespace std; ][] = {}; int ma ...
- 2019icpc徐州现场赛 H Yuuki and a problem (树状数组套主席树)
题意 2e5的数组,q个操作 1.将\(a[x]\)改为y 2.求下标l到r内所有的\(a[i]\)通过加法不能构成的最小的值 思路 通过二操作可以知道需要提取l到r内的值及其数量,而提取下标为l到r ...
- 使用logstash结合logback收集微服务日志
因为公司开发环境没有装elk,所以每次查看各个微服务的日志只能使用如下命令 这样子访问日志是并不方便,于是想为每个微服务的日志都用logstash收集到一个文件out中,那以后只要输出这个文件则可查看 ...