在LInux启动过程中,涉及MBR主引导记录、GRUB启动菜单、系统初始化配置文件等各方面,其中任何一个环节出故障都可能会导致系统启动的失常。下面将介绍一些启动类故障修复的实例。这里的Linux主机是vmware上的虚拟机。
1.MBR扇区故障
MBR扇区又称为主引导扇区,总共512字节,里面不仅有系统包含的引导程序数据446字节,还有整个硬盘的分区表记录。当主引导扇区发生故障时,将无法进入引导菜单,加载系统。
下面开始做对MBR扇区进行备份,模拟破坏,修复的实验。
实验前提
首先准备一块硬盘做MBR扇区数据备份,用fdisk工具查看硬盘列表信息,再用fdisk工具对新增的硬盘/dev/sdb进行规划分区,sdb硬盘被划分sdb1分区。
实验操作步骤如下所示:
第一步,开始备份MBR扇区数据
输入dd命令将第一块硬盘sda的MBR扇区备份到第二块硬盘的sdb1分区中,并将其挂载到/backup目录中。
第二步,模拟MBR扇区故障
仍然输入dd命令,从设备文件zero中读取512字节的数据。,将其覆盖到第一块硬盘sda,人为的将MBR扇区的记录覆盖,从而破坏MBR扇区中的数据。
完成上述操作后,重启Linux系统,无法找到可用的操作系统,将会无法启动主机。
第三步,从备份文件中恢复MBR扇区数据
由于MBR扇区被破坏以后,无法从硬盘启动Linux系统,所以需要使用其他的硬盘中的操作系统进行引导,那么就需要获得一个可以执行命令的shell环境,从备份文件中恢复MBR扇区中的数据。操作步骤如下所示。
- 首先当出现安装向导界面时,选择“Rescue installed system”,以急救模式引导光盘中的Linux系统。
-
然后依次按enter键选择默认的语言,键盘格式,提示是否配置网卡时选择“No”,选择“Continue”确认并继续,接下来出现rescue窗口,单击“OK”。
-
接着进入到带“bash-4.1#”提示符的Bash Shell环境,先挂载保存有备份文件的硬盘分区sdb1,并将数据恢复到硬盘“/dev/sda”中。完成恢复操作后,执行exit命令退出临时shell环境。
- 最后执行reboot命令,系统自动重启。
综上,解决MBR扇区故障的思路一般是:提前做好备份文件,以安装光盘引导进入急救模式,从备份文件中恢复。
2. 修复GRUB引导故障
GRUB是大多数Linux系统默认使用的引导程序,可以通过启动菜单的方式选择进入不同的操作系统。当配置文件/boot/grub/grub.conf(7版本/boot/grub2/grub.conf)丢失,或者关键配置出现错误或者MBR记录中的引导程序遭到破坏时,Linux主机启动后可能只出现“grub>”的提示符,无法完成进一步的系统启动过程,如图所示:
以RedHat6为例
模拟grub故障(删除grub配置文件)
rm -rf /boot/grub/grub.conf
1. 直接在提示符后可以进行编辑
通过输入对应的引导命令,可参考其他相同版本系统中的grub配置文件的语句,然后执行boot命令即可正常引导Linux系统。不过由于“grub>”环境中使用的命令复杂,难以记住相关的命令选项,很少有人选择这种方式恢复grub配置文件。
[root@RedHat6-1 ~]# cat /boot/grub/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=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64)
root (hd0,0) //其他版本的grub配置语句
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=ef72b552-acad-4ffe-a665-1876d4a27bce rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
根据上述的配置文件内容手动输入
登录进系统之后,直接重建grub配置文件,具体内容参考其他正常主机的文件。
2. 使用安装光盘引导进入急救模式的Shell环境,通过之前的备份文件恢复重建grub.conf配置文件
cp /boot/grub/grub.conf /opt/grub.conf.bak //grub配置文件备份
若分区表未破坏,则急救模式将会找到硬盘中的Linux根分区,并将其挂载到光盘目录结构中的/mnt/sysimage/文件夹中,切换到待修复的系统根环境,从备份文件中恢复。
(1)进入光盘引导界面,详细步骤参考上述从备份中恢复MBR扇区步骤。
(2)进入“bash-4.1#”的Shell 环境以后,执行“chroot /mnt/sysimage”命令切换到系统的根环境。
[root@RedHat6-2 ~]# ls /boot/grub/ | grep grub.conf
grub.conf
但是需要注意的是如果MBR扇区引导程序出现损坏,可能在重建grub.conf配置文件后仍然无法启动系统,这时就要通过急救模式的Shell环境重新安装grub引导程序。
bash-4.1#chroot /mnt/sysimage //切换到Linux系统根环境
sh-4.1#grub-install /dev/sda //重新安装grub引导程序
sh-4.1#exit //退出chroot环境
bash-4.1#reboot //重启系统
3. 遗忘root用户的密码
大多数Linux主机中具有root权限的用户只有一个,所以需要通过其他路径重设root账号的密码。最简便的路径是在开机时通过修改GRUB引导参数进入单用户模式再重置root密码。
- 以RedHat6系统为例
第一步重新启动主机,当出现秒数倒计时按Esc键选择要进入的操作系统,再按e键进入编辑模式。
第二步定位到以kernel开头的一行并按e键在行尾添加“single”的启动参数表示要进入到单用户模式。
第三步按enter键确认后,按b键将系统引导进入单用户模式,直接进入shell环境。
第四步在单用户的shell环境中执行“passwd root”命令重新设置root用户的密码,输入“reboot”命令去重启系统。
第二步找到linux16开头的地方,按end键到最后,输入rd.break或者init=/bin/sh,按ctrl+x进入
第三步进入“switch_root:/# ”shell环境,切换到系统的根环境,重置root密码。
第四步输入重置的密码,查看系统的登录是否正常。
4. 挂载故障
由于用户写入大量的恶性数据到硬盘上,所以导致硬盘挂不上去出现挂载故障。下面就模拟挂载故障并进行解决。操作步骤如下所示:
第一步新添加一个硬盘,用fdisk工具对磁盘分区,并进行格式化。
首先打开虚拟机设置,按照向导添加硬盘。
然后重启系统,对添加的硬盘分区并格式化。
第二步将系统/dev/sr0的无用数据写入到新添加的磁盘上去。
第三步新建一个路径/abc,用mount命令将磁盘挂载到/abc路径下,有提示信息挂载不上去。
第四步输入fsck命令修复磁盘,再重新挂载上去。
以上皆是个人总结,有不足之处,还望指教。