GRUB第1阶段在硬盘512字节MBR的前446字节的BootLoader
1.进入救援模式
2.grub命令进行修复
3.重启
1.破坏grub stage1
[root@CentOS6 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446 #80开头分区表前446全部清零
[root@CentOS6 ~]#hexdump -C /dev/sda -n 512
2.模拟主机启动:重启
重启:重启后直接进入通过光盘启动
3.修复:进入救援模式
bash-4.1#grub #进入grub修复模式
grub>root (hd0,0) #执行命令
grub>setup hd(0) #执行命令
bash-4.1#sync #同步执行
bash-4.1#exit #退出重启
GRUB第2阶段在硬盘512字节MAR的后面
1.破坏
[root@CentOS6 boot]#dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
2.模拟开机:重启
3.进入救援模式:执行grub工具进行修复
bash4.1#grub
grub>root (hd0,0)
grub>setup (hd0)
grub>kernel /vmlinuz-3.10.0-957.el7.x86_64
grub>initrd /initramfs-3.10.0-957.el7.x86_64.img
grub>boot #直接启动,不能重启,重启后又回到原来界面,无法正常启动
4.创建/boot/grub/grub.conf 文件
登录后创建grub.conf文件可使用vim技巧编写,相比在救援模式下更方便
[root@CentOS6 grub]#vim grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/win.xpm.gz #自定义开机图片
password --encrypted $6$mf63Un9Wz7abC8QS$plEbdHMfMQ08OyZgwALCSoSUUYyV0LgeqSW1iFfTHkv.BAZ7EXeGVO1TSvpeDYBncaPfr
vDJOIOEDma6FfbMK. #设置grub口令password magedu/password --md5 MD5密码/password --encrypted sha密码
title test linux #描述,不写此条,开机起不来
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 root=/dev/sda2 rhgb #vim读取技巧 :r! ls /vmlinux- /initramfs-
initrd /initramfs-2.6.32-754.el6.x86_64.img #vim行互换技巧:ddp
4.1可对启动时进入grub添加口令
(1)生成MD5密码方式
[root@CentOS7 grub]#openssl passwd -1
Password:
Verifying - Password:
$1$siisB1r/$X.irtYAm3Mm21FcEV7t4e/
(2)生成sha512密码方式
[root@CentOS6 ~]#grub-crypt
Password:
Retype password:
$6$mf63Un9Wz7abC8QS$plEbdHMfMQ08OyZgwALCSoSUUYyV0LgeqSW1iFfTHkv.BAZ7EXeGVO1TSvpeDYBncaPfrvDJOIOEDma6FfbMK.
4.2 自定义开机背景
图片要求分辨率大小:640x480
[root@CentOS6 data]#convert -resize 640x480 -colors 14 win.jpg win.xpm #图片格式转换工具
[root@CentOS6 data]#rpm -qf `which convert`
ImageMagick-6.7.2.7-6.el6.x86_64
[root@CentOS6 data]#gzip win.xpm #压缩图片
5.重启:修复完毕,正常启动
GRUB第3阶段在/boot/下文件,主要包括:
/boot/grub、/boot/grub/grub.conf #指定真正根/位置
/boot/vmlinuz-2.6.32-754.el6.x86_64
/boot/initramfs-2.6.32-754.el6.x86_64.img #标明内核文件位置
修复步骤总结:
1.chroot切根
2.生成grub文件:grub-install /dev/sda #grub交互式方式依赖grub文件存在
3.挂载光盘,拷贝vmlinuz文件
4.生成initramfs文件
5.创建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=1 #默认启动第几个内核,0表示第一个
timeout=5 #设置开机选择内核timeout时间
splashimage=(hd0,0) #hd0:第一块硬盘;0第一个分区 /grub/splash.xpm.gz #开机背景图片
hiddenmenu #默认隐藏执行过程
title CentOS 6 (2.6.32-754.el6.x86_64) #启动菜单描述
root (hd0,0) #hd0:第一块硬盘;0第一个分区(df 查看/boot在/dev/sda1)
kernel /(#实际路径/boot)vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=36b79b9b-c4e4-4111-a733-cd3b72a1f3b2 (#挂载的真正的根/;blkid查看的设备是/dev/sda2,对应挂载点就是根/) (rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb #图形界面 quiet #内核启动阶段,默认不显示 #内核参数)
initrd /initramfs-2.6.32-754.el6.x86_64.img #只读挂载根的驱动文件
title CentOS 8 (4.6.32-754.el6.x86_64) #自己加的,测试重启开机显示内核选项
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=36b79b9b-c4e4-4111-a733-cd3b72a1f3b2 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM
initrd /initramfs-2.6.32-754.el6.x86_64.img
硬盘的第一个分区是/boot 而不是 /
系统启动时执行的第一个脚本:/etc/rc.d/rc.sysinit
sysinit读取/etc/fstab 重新挂载根/
[root@CentOS6 ~]#cat /etc/rc.d/rc.sysinit|grep fstab #sysinit 中执行/etc/fstab文件内容
[root@CentOS6 boot]#cat /etc/fstab #关于根开机挂载内容
(1)破坏:删除/boot
[root@CentOS6 boot]#rm -rf /boot
(2)模拟启动:重启
(3)重启进入救援模式:
3.1切根,生成grub文件:
bash-4.1# chroot /mnt/sysimage #切根
sh-4.1# grub-install /dev/sda
sh-4.1# mount /dev/sr0 /mnt
sh-4.1# cp /mnt/isolinux/vmlinz /boot
sh4.1# mkinitrd initramfs.img`uname -r`
default=0
timeout=5
title test linux
kernel /vmlinuz root=/dev/sda2
initrd /initramfs.img
注意: grub-install 执行过程出错(如按Ctrl C或设备名错误),需要删除/boot下所有文件重新执行才可以生效;错误提示如下:No suitable drive was found in the generated device map.
1.激活逻辑卷组:vgchange -ay 卷组名
2.挂载逻辑卷根:mount /dev/mapper/VolGroup-lv_root /mnt/tmp
3.重写fstab文件
6.重启,修复/boot
7.chroot且跟
8.rpm重装内核,生成内核文件:rpm -ivh 内核包 --force
9.grub-install /dev/sda生成grub文件
10.创建grub.conf
逻辑卷的grub.conf配置文件如下:
1.破坏:删除 /etc/fstab、 /boot
2.模拟机器启动:重启
3.重启修复:进入救援模式
查看挂载关系,此时显示没有挂载/ 、/boot,可以查看到有两个逻辑卷
查看逻辑卷状态:Not available
4.激活并挂载逻辑卷
bash-4.1# vgchange -ay VolGroup
bash-4.1# mkdir /mnt/tmp
bash-4.1# mount /dev/mapper/VolGroup-lv_root /mnt/tmp
bash-4.1# vim /mnt/tmp/etc/fstab #我这里没有lv_home逻辑卷
/dev/VolGroup/lv_root / ext4 defaults 0 0
/dev/VolGroup/lv_swap swap swap defaults 0 0
/dev/sda1 /boot ext4 defaults 0 0
挂载逻辑卷根:
重写/etc/fstab文件,重启后再次进入救援模式可挂载根;后续步骤按删/boot 进行修复
5.重启,进入救援,修复/boot
通过安装内核包方式快速修复/boot(生成包括vmlinuz、initramfs文件)
注意:进入救援,若先挂载再切根,执行rpm后会提示:命令未找到;
必须先切根再挂载,才可以正常执行!
bash-4.1#chroot /mnt/sysimages
sh-4.1#rpm -ivh /mnt/Packages/kernel-2.6.32-754.el6.x86_64.rpm --force
grub-install /dev/sda
default=0
timeout=5
title linux
kernel /vmlinuz-2.6.32-754.el6.x86_64
initrd /initramfs-2.6.32-754.el6.x86_64.img #由rpm生成的内核文件读入
1.centos6中添加磁盘
[root@CentOS6 ~]#echo ‘- - -’ > /sys/class/scsi_host/host2/scan
2.分区
[root@CentOS6 ~]#fdisk /dev/sdb
3创建文件系统
[root@CentOS6 ~]#mkfs.ext4 /dev/sdb1
[root@CentOS6 ~]#mkfs.ext4 /dev/sdb2
4.创建grub各个阶段:指定grub1,1.5阶段以及2阶段安装路径,2阶段安装在/dev/sdb1分区上,因此需要先挂载分区
[root@CentOS6 ~]#mkdir /mnt/boot
[root@CentOS6 ~]#mount /dev/sdb1 /mnt/boot
[root@CentOS6 ~]#grub-install --root-directory=/mnt /dev/sdb
5.拷贝内核文件:vmlinuz、 initramfs、grub.conf
注意: kernel后面必须指定 init启动寻找路径:
6.挂载根分区,创建根目录结构
7.拷贝命令,驱动:
[root@CentOS6 data]#bash copycmd.sh #拷贝命令脚本
[root@CentOS6 data]#ethtool -i eth0 #查看网卡驱动名
[root@CentOS6 data]#modinfo e1000 #查看网卡驱动位置
[root@CentOS6 data]#cp /lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/root/lib #拷贝网卡驱动
8.新建虚拟机,删除原有硬盘,添加自制Linux硬盘.vmdk文件
删除E:\Virtual Machines\CentOS 6 64 位 (2) \CentOS 6 64 位 (2).vmdk;
拷贝E:\Virtual Machines\CentOS6.10\ CentOS6.10-5.vmdk 到E:\Virtual Machines\CentOS 6 64 位 (2) \目录下;
打开虚拟机,选择磁盘路径E:\Virtual Machines\CentOS 6 64 位 (2) \ CentOS6.10-5.vmdk ,启动虚拟机:成功启动
测试:加载网卡,ping另一同网段主机:OK
insmod /lib/e1000.ko
ifconfig eth0 192.168.37.107/24
ping -c 3 192.168.37.100