主要改错:1、通过mbr扇区修复引导 2、修复grub引导 3、centos7引导修复和更改启动顺序 4、通过复制U盘文件,进行引导修复
通过mbr扇区修复引导:
一、修复MBR:
MBR(Master Boot Record主引导记录):
硬盘的0柱面、0磁头、1扇区称为主引导扇区。其中446Byte是bootloader,64Byte为Partition table,剩下的2Byte为magic number。
备份MBR:
#dd if=/dev/sda of=/root/mbr.bak count=1 bs=512
破坏bootloader:
#dd if=/dev/zero of=/dev/sda count=1 bs=200
这里边block size只要小于等于446即可。
修复方式:
1、借助其他系统挂载磁盘修复。
修复方式同光盘修复类似,也是使用grub2-install命令。
2、借助安装光盘修复。
1.装入光盘,在光盘引导界面选择troubleshooting:
2.选择进入救援模式:
3.按回车键继续:
4.进入磁盘挂载选择模式:
磁盘将会被挂载至/mnt/sysimage/下
continue 以rw方式挂载分区。
read only 以ro方式挂载分区。
skip 跳过,将来自己手工挂载磁盘。
5.选择continue,稍等片刻,提示已经挂载完成。
6.此时进入救援模式的命令行:
7.使用grub2-install命令重建bootloader:
#grub2-install root-directory=/mnt/sysimage /dev/sda
显示无错误,使用sync写入硬盘,reboot重启系统。
8.重启后无错误,grub正常运行:
至此,MBR修复完成。
二、修复grub
grub配置文件丢失:
开机后会直接进入grub界面,显示为grub>:
修复步骤如下:
grub>insmod xfs
grub>set root=(hd0,1)
grub>linux16 /vmlinuz-xxxxx root=/dev/mapper/centos-root
grub>initrd16 /initramfs-.xxxxx.img
修复完成后即可进入系统,重建配置文件。
注意:CentOS7因为使用的是grub2,配置文件同grub有不少变化,一定要切记备份grub.cfg以便恢复。
列外:
1.
win pe修复win7引导后centos7引导消失的恢复方法:
步骤(一):用centos iso 制作启动u盘进入到安装centos的界面,开机选择的时候不要选择安装centos,而是选择trouble shooting疑难解答选项,然后选择rescue a centos system。按tab键选择continue (一定要选),然后选择ok.
步骤(二): 进入命令行界面,输入:chroot /mnt/sysimage ,接着就是重要的一步,安装grub2了。执行以下命令: /sbin/grub2-install /dev/sda, 安装成功后执行reboot重新启动系统。但是以上步骤只是又把centos的启动项找回来了,windows7的引导又不见了,win7的引导需要在后续步骤通过grub2来完成。
2.
恢复centos引导后继续恢复windows7引导的方法:
经过前面所述步骤之后centos系统又能打开了,所以可以直接通过centos的grub2功能实现windows的引导。此时可以输入此命令直接搞定:grub2-mkconfig -o /boot/grub2/grub.cfg,然而,输入该命令后并没有发现与window相关的任何信息,纠结了半天发现是centos不能识别本人win7系统的磁盘格式。也就是说使用上述命令的前提是centos能够识别windows7系统的磁盘格式。
由于本人的windows7系统安装在ntfs格式的分区中,所以我先安装ntfs-3g,使centos能识别出windows所在的分区。
步骤(一):安装ntfs-3g的步骤如下:
添加ntfs-3g下载源, 输入:
yum update
开始安装ntfs-3g,输入:
yum install ntfs-3g
至此,ntfs-3g安装完毕,只要成功安装了ntfs-3g, 那么恢复win7启动项的光辉时刻就已经到了,并且,步骤及其简单,您只需再次输入之前提到的命令:
grub2-mkconfig -o /boot/grub2/grub.cfg, 系统就能自动找到win7系统或xp系统的引导项,并加入到了grub.cfg菜单中。这样就避免了手工改动文件的危险,并且所有系统都能正常启动。不过,我多此一举的使用以下命令挂载了 windows NTFS 的分区(我的 Windows 分区分别是 /dev/sda1、 /dev/sda2、 /dev/sda4),注意:挂载是不必要的,因为在这个步骤中我们的真正目的是恢复win7的启动项,作为一个linux小白,我只是借此场景熟悉一下mount命令的用法而已。我用以下命令分别挂载了通过 grub2-mkconfig -o /boot/grub2/grub.cfg命令搜索到的所有windows分区:
cd /mnt
mkdir forwin
mount -t ntfs-3g /dev/sda1 /mnt/forwin
mkdir forwin2
mount -t ntfs-3g /dev/sda2 /mnt/forwin2
mkdir forwin3
mount -t ntfs-3g /dev/sda4 /mnt/forwin3
修复grub引导
在grub引导的页面可以按c键进入grub命令模式
首先需要确定你的ubutun安装到哪个硬盘哪个区;
1.1 可以先使用ls命令,查看所有硬盘分区,如(hd0), (hd1,gpt1)等等。
1.2 然后再使用ls (hd1, gpt8)查看。如果出现unknown filesystem则尝试其他的;如出现的是你ubutun主文件夹和文件的名字,基本就是它了。
确定之后,按照4步下面进行设置;
set root=(hd1,gpt8)
set prefix=(hd1,gpt8)/boot/grub
linux /boot/vmlinuz-xxx-xxx root=/dev/nvme0n1p8
上面这一步,要说两点:
(1)xxx-xxx是可以tab补全的。如果双tab后没有,有可能你第一步分区都没找对。
(2)/dev/nvme0n1p8这个分区,由于是在固态盘里,所以映射成nvme0n1p8了。猜测这里的8和第一步的gpt8中的8应该是一致的。但不能写成/dev/sda8。
initrd /boot/initrd.img
boot
boot之后应该就可以重新进入ubutun了。重新进入后,要做的就是更新grub配置。很简单,只需要下面一句:
sudo update-grub
该事件原因分析:由于/boot/下的vmlinuz文件丢失(原因暂不详),但grup.cfg还是原先版本的vmlinuz,所以启动找不到,kernel起不来。顺提一句,去掉grub多余引导项要修改的文件就是/boot/grub/grub.cfg. 去掉的内容可以。
centos7引导修复和更改启动顺序
引导顺序
UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/system/default.target
systemd执行sysinit.target初始化系统及basic.target准备操作系统
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
systemd执行graphical需要的服务
设置内核参数
设置内核参数,只影响当次启动
启动时,在linux16行后添加
systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=rescue.target
rescue.target 比emergency 支持更多的功能,例如日志等
systemctl default 进入默认target
破解CentOS7的root口令
方法一:
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动
mount –o remount,rw /sysroot 重新挂载根目录为读写
chroot /sysroot 切根
passwd root 修改root密码
touch /.autorelabel 创建文件,为避免selinux报错
exit
reboot
方法二:
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh 挂载为读写模式
按ctrl-x启动
chroot /sysroot 切根
passwd root 修改root密码
touch /.autorelabel 创建文件,避免selinux报错
exit
reboot
故障排除
/boot路径下所有文件丢失
进入救援模式
chroot /mnt/sysimage
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages/kernel-3.10.0-693.e17.x86_64.rpm --force --force选项是必须的
grub2-install /dev/sda 为boot所在磁盘修复grub文件
cd /boot/grub2/
grub2-mkconfig -o grub.cfg 如果不在/boot/grub2路径下需要指明路径grub2-mkconfig -o /boot/grub2/grub.cfg
启动默认内核选择
/etc/default/grub文件中GRUB_DEFAULT= (0为第一项,1为第二,以此类推),修改此项即可
通过复制U盘文件,进行引导修复:
1、进入急救模式
大致就是因为开机时系统没有找到grubx64.efi这个文件导致系统进不去了。于是开始进行系统修复(主要就是把丢失的这个文件给放到原来的位置上去),我在网上找了很多文章,大致都是需要使用Centos系统安装盘光驱或者Centos的U盘启动盘 在选择安装系统的界面如下图:
进入rescue system,然后将/mnt/sysimage文件夹下面的grubx64.efi文件复制到丢失文件目录/boot/efi/EFI/centos/下。
可能有些电脑在bios里面无法找到U盘启动选项,这些需要去找主板对应的bios设置进行设置,具体要看自己的电脑主板是什么品牌和型号就不在这里细说了(网上都能找到这些设置)。
在进入rescue system时,也有可能会报modprobe:ERROR: could not insert 'floppy’和modprobe:ERROR: could not insert ‘edd’:No。
然后后面会打印200个脚本执行超时,并最终进入>dracut:/#,这时候是因为进入rescue system选择设置中的stage2=xxxx路径不正确导致的,所以这个时候进入>dracut:/#后,执行:
查看/dev下面的硬盘和外部驱动器
ls /dev
一般U盘会是sdbx(x是数字)或者sdc这样的挂载路径,找到插入的U盘是哪一个,然后重启电脑,再次进入选择rescue system的页面
选择Rescue a CentOS system,然后按e进入它的引导配置编辑页面,然后修改配置中的stage2=hd:LABEL=CentOS\xxxx为stage2=hd:/dev/sdbx(sdbx为前面找到的U盘路径),然后按control + x运行,这时候就能正常进入rescue system了。
然后这个时候进入/mnt/sysimage文件夹下面,将grubx64.efi文件复制到丢失文件目录/boot/efi/EFI/centos/下重启即可。但是我却发现这个目录下面根本没有丢失那个文件,并且我在根目录下使用find . -name '*.efi’进行全局查找,其它目录下也没有丢失的这个文件,既然现在找不到这个文件,那就只能从外部把这个文件放进去了。
我在制作完成CentOS启动盘后,我的U盘中是有这个CentOS需要的系统文件的,那么我可以将的U盘挂载进去,就能拿到我的这个文件了。
2、挂载U盘
查看磁盘列表
fdisk -l
找到U盘的盘符,U盘容量固定8G、16G、或者32G、64G的,而且一般都是sdbx或者sdc这类名称,所以比较好找。
查看挂载列表
df -h
这个时候会发现CentOS并没有将U盘挂载上去。
挂载U盘
# 创建挂载的文件夹
mdkri /mnt/usb
# 将U盘挂载到文件夹下面
mount /dev/sdbx /mnt/usb
这个时候会发现CentOS的启动盘U盘无法进行挂载,估计可能是因为之前做了启动盘的原因,无法再次挂载,然后我使用了另外一个U盘,将U盘也格式化为FAT32格式,并将grubx64.efi放进去,然后进行挂载,结果发现挂载成功之后,里面并没有grubx.efi文件,而只有一个found+local的文件夹,里面也是空空如也,并且卸载这个U盘挂载umount \mnt\usb再插入windos电脑显示无法读取,只能进行格式化才行。可见这样进行挂载之后U盘的文件系统被破坏了,里面的文件也丢失了,这之后我还尝试过挂载另外的Liunx硬盘,依然是失败的。
3、最终解决办法
其实很简单,将CentOS的启动U盘拔出来,这时候运行命令
fdisk -l
可以发现启动盘还在,这是因为启动盘在启动了之后其实已经复制内容到系统中了,并虚拟了一个盘符进行挂载,这个时候的盘符跟插在电脑上的启动U盘已经没有什么关系了,并且因为这种启动U盘的特性,在启动之后并不能再看到真实的U盘盘符,所以把U盘拔掉再重新插上去即可。
再次插上去之后,会发现有一个名为sdc文件系统为FAT32(其它的类型U盘文件系统可能不一样)的盘符,我们直接使用命令将这个盘符挂载上去即可
mount /dev/sdc /mnt/usb
这个时候进入 /mnt/usb目录就能访问U盘中的文件了。
然后执行copy命令
# 将U盘中的grubx64.efi文件复制到/boot/efi/EFI/centos/目录中
cp /mnt/usb/EFI/BOOT/ /boot/efi/EFI/centos/grubx64.efi
卸载U盘
umount /mnt/usb
然后拔出U盘,重启电脑将bios中的启动项改回电脑的系统硬盘就能进入系统了。如果还有其它的文件丢失的话,也可以使用同样的方式将文件放入到丢失的位置上去。