一、CentOS 6 grub legacy:
1.启动流程:
POST �> Boot Sequence(BIOS) �> Boot Loader �>Kernel(ramdisk) �> rootfs �> switchroot �> /sbin/init �>(/etc/inittab,/etc/init/*.conf) �> 设定默认运行级别 �>
系统初始化脚本rc.sysinit �> 关闭或启动对应级别的服务 �> 启动终端
2.grub legacy
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader
能识别stage2(/boot)所在的分区上的文件系统
vmlinuz
stage2:磁盘分区(/boot/grub/)
initramfs―->读取/grub.conf 文件
grub 各阶段备份文件:――�》可以用于修复
301371ac642549a8631bc63cfccc8.jpg" src="http://www.178linux.com/Users/Lin/AppData/Local/YNote/data/ldt195175108@163.com/3ebabe0fca274555afdda2fc92a5d6bf/ed6301371ac642549a8631bc63cfccc8.jpg">
PHP/upload/image/20160921/1474438949130441.jpg">
3. grub 功用
stage2及内核等通常放置于一个基本磁盘分区
功用:
(1) 提供启动菜单、并提供交互式接口
a:内核参数
e: 编辑模式,用于编辑菜单
c: 命令模式,交互式接口
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3) 为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
4. grub的命令行接口
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#) #指定根目录
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;
例如: 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
识别硬盘设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0) 第一块硬盘,第一个分区
5. 手动在grub命令行接口启动系统:(启动选择菜单,选择"e")
grub> root (hd#,#) #指定根目录分区位置
一般为 root (hd0,0)
grub> kernel/vmlinuz-VERSION-RELEASE ro
root=/dev/DEVICE
# 指定内核vmlinuz以及根目录
grub>initrd/initramfs-VERSION-RELEASE.img
#指定initramfs
grub> boot #引导
6.grub legacy配置文件
grub 配置文件:/boot/grub/grub.conf<� /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/mapper/vg0-root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=2
splashimage=(hd0,0)/grub/splash.xpm.gz #开机启动画面背景图
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64) 第0启动项
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto
initrd /initramfs-2.6.32-642.el6.x86_64.img
title MaMaDan 第1 启动项目
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=usquiet rhgbcrashkernel=auto
initrd /initramfs-2.6.32-642.el6.x86_64.img
――――――――――――――――――――――――――――――�
启动效果:
PHP/upload/image/20160921/1474439290838747.jpg">
――――――――――――――――――――――――――――――-
quiet rhgb 可以删去,用于美化启动界面,但是会隐藏错误信息,删除后可以看到详细错误信息,以字符界面显示
基本必须项目:
default=#
timeout=#
title #############
root ( )
kernel /############
initrd /########
――――――――――――――――――――――――――――
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [�md5] STRING: 启动菜单编辑认证
添加在指定title 之内,则用于设定指定title 密码
建议使用加密口令
grub-md5-crypt 生成加密口令
或 openssl passwd -1
PHP/upload/image/20160921/1474439564538449.jpg">
root (hd#,#): grub查找stage2及kernel文件所在设备分区;为grub“根”
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
password [�md5] STRING: 启动选定的内核或操作系统时进行认证
8. grub加密
加密密码生成工具: grub-md5-crypt
eg: 生成密码为“123456”的加密字符
PHP/upload/image/20160921/1474439683839522.jpg">
在第一个title前添加password string
PHP/upload/image/20160921/1474439683708195.jpg">
9. 破解root口令:
10. 进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
PHP/upload/image/20160921/1474439683840261.jpg">
PHP/upload/image/20160921/1474439684951826.jpg">
(2) 在选定的kernel后附加
1,s,S或single都可以;
PHP/upload/image/20160921/1474439683462363.jpg">
按“回车”确认,并退回到前一界面
(3) 在kernel所在行,键入“ b”命令
PHP/upload/image/20160921/1474439683749454.jpg">
二、grub安装(修复)
安装grub:(救援模式下)
(1) grub-install 可以修复第一(MBR被破坏)、第二阶段
安装grub stage1和stage1_5到/dev/DISK磁盘上,并
复制GRUB相关文件到 DIR/boot目录下
grub-install �root-directory=DIR /dev/DISK
PHP/upload/image/20160921/1474440262159240.jpg">
修复前,需要先chroot /mnt/sysimage
grub-install /dev/sda
注意:修复第一阶段时,不可指定分区,指定设备即可
(2) 手动设定grub配置(注:此步骤不会生成grub.conf配置文件,需后续手动创建)
grub> root (hd#,#) #指定root分区
grub> setup (hd#) #修复 1.5 及 2阶段
检查并修复1.5,2 阶段
注意: /boot/grub 下的stage* 文件,是各阶段备份文件,用于修复grub的,若文件,grub setup 依赖于这些文件,
但是grub install 不依赖这些文件
三、grub 模拟损坏与修复
――――――――――――――――――――――――――――――――――�
1. 损坏第一阶段 stage1: (破坏mbr (446字节))
stage1 破坏:
PHP/upload/image/20160921/1474440262839877.jpg">
修复:
1 ) 救援模式下:
chroot /mnt/sysimage
grub-install /dev/sda
2) 若/boot/grub 中的各阶段备份文件存在,可直接在grub命令行下setup修复
grub
grub>root (hd0,0) # 指定根
grub>setup (hd0)
PHP/upload/image/20160921/1474440262509456.jpg">
PHP/upload/image/20160921/1474440262513884.jpg">
――――――――――――――――――――――――――――――――――
2. 损坏 1.5阶段 stage 1.5 :
dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
修复:
1)救援模式下:
chroot /mnt/sysimage
grub-install /dev/sda
2) 若/boot/grub 中的各阶段备份文件存在,可直接在grub命令行下setup修复
grub
grub>root (hd0,0) # 指定根
grub>setup (hd0)
――――――――――――――――――――――――――――――――――�
3. 破坏(删除)/boot/vmlinux,initramfs
修复:
1)救援模式下,挂载iso系统文件
chroot
mkinitrd/boot/initramfs-`uname -r`.img `uname -r`
#修复 initramfs
从光盘中复制mvlinuz*文件至/boot
完成后再手动建立grub.conf即可完成
chroot
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
scp host_ip:/boot/vmlinuz* /boot/
(从远程主机中拷贝vmlinuz文件)
完成后再手动建立grub.conf即可完成
――――――――――――――――――――――――――――――――――�
修复:
救援模式下:
挂载光盘 mount /dev/cdrom /dir
重建/boot:
rpm -ivh /##/cdrom/Packages/kernel-### �force
|replacepkgs
PHP/upload/image/20160921/1474440262213906.jpg">
PHP/upload/image/20160921/1474440262773514.jpg">
修复grub:
chroot /mnt/sysimage
grub-install /dev/sda
PHP/upload/image/20160921/1474440262319493.jpg">
重建grub.conf文件:
vi /boot/grub/grub.conf:
default=0
timeout=2
title mamadan
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/vg0/root
initrd /initramfs-2.6.32-642.el6.x86_64.img
――――――――――――――――――――――――――――――――――�
5. 删除/etc/fstab 以及/boot:
修复:
救援模式下:
此时由于fstab丢失,无法挂载根:
PHP/upload/image/20160921/1474440262303983.jpg">
救援模式shell下,使用 blkid 可以查看磁盘情况:
PHP/upload/image/20160921/1474440262528912.jpg">
(无法区分哪个是根,需要将每个分区都挂载,以确定哪个是根)
1) 系统内存在使用lvm时,需要先激活lvm:
vgchange -ay
PHP/upload/image/20160921/1474440262869440.jpg">
PHP/upload/image/20160921/1474440262600351.jpg">
挂载各分区,尝试确定根位置:
mkdir /mnt/sda1
mkdir /mnt/sda2
mkdir /mnt/sdb1
mkdir /mnt/sdb2
mount ………………..
略
2) 系统内仅使用普通分区时,直接挂载各分区来确认根位置
mkdir /mnt/sda1
mkdir /mnt/sda2
mkdir /mnt/sdb1
mkdir /mnt/sdb2
…………..
进入根对应分区,建立fstab文件,并重启系统,重新进入救援模式,让救援系统挂载根目录
注意: 需要挂载 root,usr,var 三个分区,否则修复/boot目录文件时,可能会
因无依赖文件而已报错
挂载分区:
mkdir /mnt/sysroot
mount /dev/vg0/root /mnt/sysroot
修复fstab:
# vi /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/vg0/root / ext4 defaults 1 2
/dev/vg0/usr /usr ext4 defaults 1 2
/dev/vg0/var /var ext4 defaults 1 2
重启,再次让救援系统尝试挂载根目录:
PHP/upload/image/20160921/1474440262255420.jpg">
根成功被识别并挂载后,按照/boot 修复方法继续修复即可
――――――――――――――――――――――――――――――――――�