1.  二、修复linux系统

思路:恢复fstab文件找到分区à修复引导里的内核文件à修复grub–>还原init相关文件

·        1.进入修复模式

通过RHEL5光盘引导进入安装会话,输入linux rescue或按F5键进入rescue修复模式。

Linux 系统修复_grub vmlinuz fstab

进入修复模式之后,系统会提示选择语言Language和键盘类型Keyboard,直接回车就行了。

系统会再次询问是否配置网络,选择No,因为修复系统不需要用到网络。。然后会提示如下:

Linux 系统修复_grub vmlinuz fstab _02

   Rescue程序将查找当前硬盘上是否有已安装的linux系统,如果找到了的话,就自动挂载到/mnt/sysp_w_picpath下。选择”Continue”继续,rescue程序会搜索硬盘是否存在已安装过的linux和硬盘分区,最终结果如下图:

Linux 系统修复_grub vmlinuz fstab _03

搜索结果显示,找不到Linux分区,因为/etc/fstab文件被删除了,所以导致系统无法读取Linux分区,但是如果找到了,就将它挂到/mnt/sysp_w_picpath里面,可以读写。选择”OK”确定之后,系统会进入到修复模式的shell下。

Linux 系统修复_grub vmlinuz fstab _04

·        2.还原fstab文件

根据上面步骤得知,rescue程序无法找到硬盘分区,所以现在要做的事情就是恢复linux分区——也就是fstab文件(这个fstab文件在删除之前,有做过备份/etc/fstab.bak)。

#fdisk -l        查看磁盘分区

Linux 系统修复_grub vmlinuz fstab _05

根据fdisk –l输出,得到系统分区有两个/dev/sda1和/dev/sda2。可使用e2label命令查看这两个分区的卷标,

Linux 系统修复_grub vmlinuz fstab _06

由上图可得知/dev/sda1是/boot分区,而/dev/sda2无法查看,因为sda2是LVM分区。

使用命令激活LVM分区#lvm vgchange-ay  这个命令的作用就是告诉系统建立相关的device-mapper,这样就可以看到/dev下建立了/dev/mapper/VGname-LVname和/dev/VGname/LVname的设备文件和链接文件.

Linux 系统修复_grub vmlinuz fstab _07

使用ls /dev/mapper命令可以看到VolGroup00-LogVol00(就是/根分区)和VolGroup00-LogVol01(就是swap分区)

接下来,要挂载/根分区,并恢复fstab文件。

#mkdir test                 ---建立一个空目录用于挂载分区

#mount -t ext3 /dev/VolGroup00/LogVol00 /test     ---挂载包含根分区的LVM分区到test目录下

Linux 系统修复_grub vmlinuz fstab _08

将系统原来的/根分区挂载到/test目录之后,就可以还原fstab.bak到fstab了!

Linux 系统修复_grub vmlinuz fstab _09

#cp /test/etc/fstab.bak/test/etc/fstab     ----还原fstab文件

#reboot       ----重启系统

·        3.修复内核和grub

重启之后,按ESC键选择CDROM引导,输入linux rescue再次进入到修复模式。

此时再次进入到修复模式时,rescue程序将会找到fstab文件,也就是会找到linux分区!并且把损坏的原linux系统挂载到/mnt/sysp_w_picpath下。并且rescue程序会提示你,可以使用#chroot(changeroot修改根目录)修改根目录,进入到原系统中。如下图所示:

Linux 系统修复_grub vmlinuz fstab _10

选择OK之后,系统已经全部挂载到了/mnt/sysp_w_picpath,如果想进去,敲入#chroot/mnt/sysp_w_picpath,修改根目录为/mnt/sysp_w_picpath,使用ls命令可以查看原系统里的文件和目录。使用exit可以退回rescue程序下,再次使用ls命令可以比较一下区别。

Linux 系统修复_grub vmlinuz fstab _11

一般把处于resuce模式的系统称为伪系统,把#chroot/mnt/sysp_w_picpath后看到的称为真正的系统。

接下来要修复内核文件:

#exit         ---退回到resecu模式下

#mount /dev/hdc /mnt/source     ---挂载光驱cdrom到/mnt/source目录

#rpm -ivh/mnt/source/Server/kernel-2.6.18-164.e15.i686.rpm--root=/mnt/sysp_w_picpath/ --force

(需要修复的三个内核文件在系统盘server目录下kernel-2.6.18.rpm软件包里,所以要挂载光盘之后并安装kernel软件包)

Linux 系统修复_grub vmlinuz fstab _12

此时,内核已修复完成!再继续修复grub程序。。。

#chroot /mnt/sysp_w_picpath  进入到已损坏的linux系统中

#grub-install /dev/sda   安装grub程序到/dev/sda

#ls /boot/grub          查看grub目录下是否存在grub.conf文件。如果没有就手动编辑一个。

#vim /boot/grub/grub.conf

Linux 系统修复_grub vmlinuz fstab _13

手动编辑grub.conf配置文件内容如下:

Linux 系统修复_grub vmlinuz fstab _14

保存退出。。。grub修复完成!

4、修复/etc/inittab等文件

#rpm -qf/etc/inittab         查询包含inittab文件的软件包

#rpm -qf /etc/rc.d/rc.sysinit   查询包含rc.sysinit文件的软件包

#rpm -qf /etc/rc.d/rc.local   查询包含rc.local文件的软件包

Linux 系统修复_grub vmlinuz fstab _15

经过rpm –qf查询命令可得知,要修复的文件都包含在initscripts-8.45.rpm这个软件包里面。

下一步,要把文件从这个RPM里面分离出来,并还原到/etc目录下.

#exit

#cp/mnt/source/Server/initscripts-8.45.30-2.el5.i386.rpm  /mnt/sysp_w_picpath/tmp

#chroot /mnt/sysp_w_picpath

#cd tmp/

#ls

#rpm2cpio initscripts-8.45.30-2.el5.i386.rpm  |cpio-imd    解压软件包到当前目录

#ls                            两个ls命令注意比较区别

#cd etc/

#ls

#cp inittab /etc/

#cp rc.sysinit /etc/rc.d/

#cp rc.local /etc/rc.d/

Linux 系统修复_grub vmlinuz fstab _16

最后只需要reboot就可以正常进入到linux系统了!!!!   OVER!


总结:

    linux grub恢复步骤:
    1、先确认MBR分区正常:如果启动系统后能出现"grub>"说明MBR 分区正常。及grub第一阶段正常
    2、在grub提示符下操作:
        grub> root (hd0,0)    ##指定内核所在的分区是那一个,一般为(hd0,0)
        grub> kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/volGroup-lv_root
             ## 指定系统的内核文件vmlinuz-2.3.654.x86_64,以及主机的根分区root=/dev/sda3,一般按TAB键可以补全,这里特别注意的是主机的根分区。一般系统在分区的时候一定是先分boot分区、home等 最后再分一个 /  分区,因此这里一定要注意此分区的写法,如果无法无法确定此分区,可以通过放入系统光盘,进入拯救模式下:
                 bash-4.1# fdisk -l
                 bash-4.1# e2label /dev/sda1 查看卷标,如果分区为lvm则如下
                 bash-4.1# lvs /vgchange -ay   加载lvm
                 bash-4.1# ls /dev/mepper/    得到系统的根分区
                 bash-4.1# blkid /dev/sda1    查看sda1分区的uuid,因为6以后的系统都是通过UUID来挂载分区的
        grub> initrd /initramfs--2.6.32-642.el6.x86_64.img  指定ramdis文件
        grub> boot启动
            正常清况下就可以启来。但是大部份是不正常情况因此主要操作如下

重点:
    3、进入光盘的拯救模式:
        bash-4.1# fdisk  -l
        bash-4.1# e2label /dev/sda1--3
        bash-4.1# ls /dev/mepper
        bash-4.1# lvs /vgchage -ay
        bash-4.1# blkid /dev/sda1
            ##以上几个操作主机是获取分区信息,UUID信息

    4、修复 /etc/fstab文件;通过上面几步获取到的根分区信息将其挂载
        bash-4.1# mount -t ext4 /dev/mapper/VolGroup-lv_root /mnt/test
        bash-4.1# cd /mnt/test ##这个test目录就是你问题主机的根分区,所有内容尽收眼底。此时你就有了两个操作系统目录。一个为当前光盘系统的目录,一个为真实系统的目录。操作理念为缺什么就从光盘里copy一份,但要注意位置要对应

        bash-4.1# vi /mnt/test/etc/fstab  ##同样要根据上面步骤获取信息
                    /dev/mapper/VolGroup-lv_root     /     ext4  defaults 1 1
                    UUID=74rsd-654e-782b-euff    /boot    ext4  defaults 1 2
                    /dev/mapper/VolGroup-lv_home    /home ext4    defaults 1 2
                    /dev/mapper/VolGroup-lv_swap    swap  swap  defaults 0 0

    5、修复/boot/grub/grub.conf
        bash-4.1# vi /mnt/test/boot/grub.conf
                   default=0
                   timeout=15
                   title CentOS 6 release
                           root hd0,0
                          kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/volGroup-lv_root
                          initrd /initramfs-2.6.32.642.el6.x86_64

    6、copy内核文件以及ramdisk文件
        bash-4.1# \cp -rfP /boot/grub/mlinuz-2.6.32-642.el6.x86_64 initramfs-2.6.32.642.el6.x86_64 /mnt/test/boot/
        或者:
        bash-4.1# grub-install --root-directory=/mnt/sysp_w_picpaths /dev/sda3

    6、使用chroot来测试以上操作是否正确
        bash-4.1# umount /mnt/test
        bash-4.1# chroot /mnt/sysp_w_picpath
            #如果不成功,先重启系统,并再一次进入光盘拯救模式,执行chroot /mnt/sysp_w_picpath 还不行,则根据提示缺少什么文件就将光盘中的对应的文件copy到持载目录 “mount /dev/mapper/VolGroup-lv_root /mnt/test”下对应的目录中。例如“no file /bin/sh"这样的提示时可以通过:ldd /bin/sh 这个命令查看这个文件所依赖的库文件在什么地方,将光盘中的库文件copy到对应的/mnt/test/下对应的目录即可。

    7、修复/etc/inittab等文件

        #rpm -qf /etc/inittab   查询包含inittab文件的软件包

        #rpm -qf /etc/rc.d/rc.sysinit   查询包含rc.sysinit文件的软件包

        #rpm -qf /etc/rc.d/rc.local   查询包含rc.local文件的软件包

                经过rpm –qf查询命令可得知,要修复的文件都包含在initscripts-8.45.rpm这个软件包里面。

                下一步,要把文件从这个RPM里面分离出来,并还原到/etc目录下.

        #exit

        #cp /mnt/source/Server/initscripts-8.45.30-2.el5.i386.rpm   /mnt/sysp_w_picpath/tmp

        #chroot /mnt/sysp_w_picpath

        #rpm2cpio initscripts-8.45.30-2.el5.i386.rpm  |cpio -imd    解压软件包到当前目录
        
        #cd etc/

        #ls

        #cp inittab /etc/

        #cp rc.sysinit /etc/rc.d/

        #cp rc.local /etc/rc.d/

        这样90%就可以恢复问题主机系统了。