a:修改内核参数
e:编辑启动项
d:删除o:打开一个新行e:编辑行内容b:启动c:命令模式,提供交互式接口
键盘敲a键,进入内核参数的编辑界面
在此界面输入1,而后回车进入单用户模式。 下图就是单用户的界面,不需要输入密码,直接以root身份登录,可以直接使用passwd命令修改口令,然后使用init命令切换运行级别进行正常登录,看到登录页面后输入修改过的口令就可以直接登录。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没有问题,所以系统可以读取硬盘启动,但又到不了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文件不再只是备份作用,而会变成启动时会被依赖的文件,丢失会影响启动,需要进入救援模式修复后才能正常启动。
删除/boot/grub/stage2文件的报错:
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文件,否则下次重启还会无法启动。
报错的界面和删除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键补全,避免因为文件名书写错误导致的修复失败。
可以看到启动菜单和启动过程,启动会卡在sh-4.1#字样的命令提示符处,无法进行输入,无法启动。
强制重启后按任意键进入启动菜单页面,在启动菜单页面按a键更改内核启动参数,将系统默认首个启动进程由/sbin/init改为/bin/bash。成功进入系统后,查询init程序的来源软件包,之后挂载光盘强制重新安装即可修复。这种修复方式可以用于某些特殊文件被破坏时,不需要进入救援模式就可以直接修复。
Note:
使用/bin/bash引导系统启动,进入系统后磁盘会是只读的,需要重新以读写方式挂载一下。由于之前系统中已经安装过upstart软件包,所以安装时需要使用--force选项进行强制安装。具体操作步骤请参考以下截图:
无法通过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分区,剩余的分区如果还有不清楚和挂载点对应关系的,可以通过临时挂载的方式,看下目录中的内容,根据目录中的内容和分区的大小来推导一下。根分区通过挂载是比较好识别的,看下里面的目录结构就清楚了。
