CentOS 6常见启动故障及排错
单用户模式破解root口令
- 启动时在此界面按任意键进入启动菜单界面。
- GRUB的启动菜单页面,在此界面可以看到内核的启动选项,并提供了交互式接口,有e、a、c 三个选项可以使用,分别代表不同的作用。
-
a:修改内核参数
-
e:编辑启动项
- d:删除
- o:打开一个新行
- e:编辑行内容
- b:启动
-
c:命令模式,提供交互式接口
键盘敲a键,进入内核参数的编辑界面
- 在此界面输入1,而后回车进入单用户模式。
- 下图就是单用户的界面,不需要输入密码,直接以root身份登录,可以直接使用
passwd
命令修改口令,然后使用init
命令切换运行级别进行正常登录,看到登录页面后输入修改过的口令就可以直接登录。
进入救援模式的方法
- 使用光盘引导启动,光盘的系统版本要和需要修复的系统的版本对应。选中
Rescue installd system
回车进入。
- 选择使用的语言,直接回车,使用默认选项就可以。
- 选择使用的键盘类型,使用默认值,直接回车。
- 根据需求来选择是否设置网络,这里选择NO不进行设置。
- 接下来的几个页面是介绍救援模式的,选择
Continue
和OK
跳过即可;
- 选择第一项开启一个shell,进入命令行模式进行修复,修复完成后执行
exit
命令退出后选择第三项进行重启。
GRUB stage 1故障导致的系统无法启动
问题现象
GRUB 1阶段出现故障,导致无法通过硬盘引导启动,默认会尝试通过其它引导方式启动,下图就是尝试通过网络启动,但未能成功引导,报错操作系统没有发现。
破坏stage 1的方法:
#dd if=/dev/zero of=/dev/sda bs=1 count=446
#hexdump -C -n 512 /dev/sda #可以看到82 20之前的内容已经全部清零
#reboot
解决方法
挂载光盘进入救援模式,通过chroot /mnt/sysimage/
命令完成切根操作,通过grub-install
命令修复系统所在硬盘stage 1中的内容,通过hexdump
命令可以检测修复的结果,使用sync
同步磁盘写入,执行两次exit
命令退出后重新启动系统。
grub-install
命令不仅可以修复stage 1,同时还可以修复 stage 1.5和stage 2,此命令的执行过程中可能会出现一次执行不能修复的情况,重新执行一次便可以了。
GRUB stage 1.5故障导致的系统无法启动
问题现象
GRUB stage 1没有问题,所以系统可以读取硬盘启动,但又到不了stage 2 所以看不到启动菜单,便会出现下图的故障现象,会有一个黑屏界面。
破坏stage 1.5的方法:
# dd if=/dev/zero of=/dev/sda bs=1 count=10240 skip=512 seek=512
# hexdump -C -n 10240 /dev/sda #可以看到55 aa之后的内容已经全部清零
# reboot
解决方法
挂载光盘进入救援模式,通过chroot /mnt/sysimage/
命令完成切根操作,使用grub-install
命令或grub
命令以交互的方式进行修复,使用sync
同步磁盘写入,执行两次exit
命令退出后重新启动系统。
使用可交互的grub命令安装1.5阶段,此方法作为grub-install
修复方式的补充,这种方式的缺点是依赖于/boot/grub/目录下的1.5阶段备份文件,如果没有备份文件,则此方法不可用。
- root (hd0,0):根分区在第一个硬盘的第一个分区
- setup (hd0):表示要把grub装在那块硬盘上。
重装grub之后,/boot/grub/stage2文件被删除的报错
重装grub之后/boot/grub/stage2文件不再只是备份作用,而会变成启动时会被依赖的文件,丢失会影响启动,需要进入救援模式修复后才能正常启动。
删除/boot/grub/stage2文件的报错:
删除/boot/grub/目录导致的系统无法启动
问题现象
GRUB stage 2故障,1和1.5 stage的启动没有问题,启动到2 stage时由于没有grub.conf文件,会无法加载启动菜单和启动项,导致启动中止,会有``grub>_`字样的报错。
执行rm -rf /boot/grub
命令后重启服务器,便会出现下图中的报错;
解决方法
修复的命令参考下图,在grub>
后输入grub.conf文件中title
字段及下面的两行,这个过程可以使用Tab键补全,实例启动后记得恢复丢失的/boot/grub/grub.conf文件,否则下次重启还会无法启动。
删除/boot/目录导致的系统无法启动
问题现象
报错的界面和删除grub.conf文件的报错相同,会有``grub>_`字样的报错。但由于删除的是/boot目录,导致后续启动所依赖到的kernel文件和ramdisk文件也被一并删除,这种情况下,即使参考上面的方法进行修复也是无济于事。
执行rm -rf /boot
命令后重启服务器,便会出现下图中的报错;
解决方法
解决这个问题的思路是挂载光盘进入救援模式,切根后重新挂载光盘,复制光盘中的内核文件到boot目录中,再使用mkinitrd
命令生成initramfs文件,使用grub-install
命令生成/boot/grub目录,临时在grub目录下编辑一个用于引导启动的grub.conf文件,最后使用sync命令向磁盘同步一下数据,exit退出后重启。
具体操作方法参考下面截图:
临时创建/boot/grub/grub.conf文件,格式参考下图:
*补充:*initrd字段的参数比较长,比较容易输入错误,建议参考下图,通过vim的扩展命令模式直接将文件名读取到文件中,输入过程中支持tab键补全,避免因为文件名书写错误导致的修复失败。
删除/sbin/init程序导致的系统无法启动
问题现象
可以看到启动菜单和启动过程,启动会卡在sh-4.1#
字样的命令提示符处,无法进行输入,无法启动。
解决方法
强制重启后按任意键进入启动菜单页面,在启动菜单页面按a
键更改内核启动参数,将系统默认首个启动进程由/sbin/init改为/bin/bash。成功进入系统后,查询init程序的来源软件包,之后挂载光盘强制重新安装即可修复。这种修复方式可以用于某些特殊文件被破坏时,不需要进入救援模式就可以直接修复。
Note:
- 使用/bin/bash引导系统启动,进入系统后磁盘会是只读的,需要重新以读写方式挂载一下。
- 由于之前系统中已经安装过upstart软件包,所以安装时需要使用
--force
选项进行强制安装。
具体操作步骤请参考以下截图:
删除/etc/fstab文件和/boot目录导致的系统无法启动
问题现象
无法通过GRUB 2 stage的引导,报错与删除/boot目录的报错相同。
解决方法
修复方法和删除/boot分区的修复方法类似,比较麻烦的是进入救援模式后,由于/etc/fstab文件被被删除,导致之前系统中的分区无法被自动识别和挂载,不能直接进行切根修复。
- 挂载光盘进入救援模式,使用
fdisk -l
命令查看当前系统中的所有磁盘和每个磁盘的分区情况,找出每个设备所对应的挂载点,如果不清楚各个设备和挂载点的对应情况,可以将设备临时挂载一下,查看设备中的文件内容,推导出这个设备名之前所对应的挂载点名称。 - 清楚了设备和挂载点的对应挂载关系之后,便可以临时挂载根分区,重新创建/etc/fstab文件。挂载根分区时不要直接挂载到/mnt目录下,使用
df -h
命令可以看到/mnt/runtime目录下挂载的是loop0设备,对应的是光盘,直接向/mnt目录进行挂载会使之前的挂载被覆盖掉,导致救援模式不能正常使用。 - 重新创建好/etc/fstab文件后,退出重新进入救援模式,根分区会自动被挂载,通过切根的方式进入根分区。
- 挂载光盘通过安装kernel软件包,生成/boot分区下的vmlinuz和initramfs文件,通过grub-install命令生成grub目录,重新创建/boot/grub/grub.conf文件,编辑完成后退出重启主机正常登录。
观察fdisk -l
命令的显示结果,在boot字段下有*
标记的是boot分区,System字段下有swap字样的是swap分区,剩余的分区如果还有不清楚和挂载点对应关系的,可以通过临时挂载的方式,看下目录中的内容,根据目录中的内容和分区的大小来推导一下。根分区通过挂载是比较好识别的,看下里面的目录结构就清楚了。