以下是几种系统无法启动的情况以及相应的解决方法。
查看系统启动信息
如果启动能进入GRUB引导,但是系统启动的时候出现问题,可以通过修改GRUB的配置来查看启动的调试信息,定位到问题再进行解决。
1.系统启动时进入GRUB菜单;
2.按键盘上的'e'键,进入编辑模式;
3.选中kernel一项,按e编辑,删除最后的“rhgb quiet”,按enter保存,最后按b启动。
4.于是就看到系统启动过程中的调试信息了。(貌似直接启动系统,然后按Esc也能看到,不用搞这么复杂。)
这时可以进行手动引导。
grub的配置信息可以在/boot/grub/grub.conf中找到。
# vim /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/sda3 # 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) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=8f8608d3-c941-4092-a9c5-b5aa9221515f 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-431.el6.x86_64.img
如果grub.conf文件损坏,则开机的时候会出现 grub > (如下图)。
解决的方法是,手动输入系统引导信息。
grub > root (hd0,0) grub > kernel /vmlinuz-2.6.32-431.el6.x86_64 root=/dev/sda3 grub > initrd /initramfs-2.6.32-431.el6.x86_64.img grub > boot
root (hd0,0) 这里指定了/boot所在的磁盘分区,grub是从0开始算的,hd0,0是第一个硬盘第一个分区;
kernel 指定kernel的位置,输入 kernel /vm 后按tab键就能补全,root= 指明root(/)所在分区;
initrd 指定initrd镜像文件;
最后boot启动系统;
修复GRUB
GRUB程序在磁盘的前446字节,如果这446字节被破坏了,那么开机时就无法进入GRUB引导了。
可以用以下指令破坏GRUB程序(在虚拟机中实验)。
# dd if=/dev/zero of=/dev/sda bs=1 count=446
重启,然后GRUB就消失了。
修复方法:用光盘/U盘引导,进入救援模式(Rescue Mode),重新安装Grub引导。
进入救援模式后输入以下指令(sda是我虚拟机的硬盘,要按现实情况决定)
# chroot /mnt/sysimage # grub-install /dev/sda # sync
重启计算机,GRUB引导就回来了。
initrd镜像损坏
initrd镜像相当于最小的linux,它可以引导完整的系统。
initrd镜像存放在/boot/目录下,我虚拟机上的initrd镜像文件是/boot/initramfs-2.6.32-431.el6.x86_64.img
如果镜像文件损坏,系统将无法加载,过完GRUB引导后,会停滞不前,如图。
手动编辑Grub引导会发现缺少initrd镜像文件,如图。
修复方法:插入引导盘,进入救援模式,用 mkinitrd <镜像文件名> <内核版本号> 来修复initrd镜像。
进入救援模式后输入,
# chroot /mnt/sysimage/ # mkinitrd /boot/initramfs-2.6.32-431.el6.x86_64.img `uname -r` # sync
重启即可。
`uname -r` 指令可以获得当前kernel版本号。