Linux boot分区意外格式化或清除之后…

boot分区在没有备份的情况下意外被清空,包括启动引导信息也没了。这时若Linux还在运行,那你是幸运的,

修复的方法:

1. cat  /etc/*release      #赶快先确定当前系统的具体版本。有ISO镜像赶快挂载上来.
   或  lsb_release -a      #或赶快找到对应版本的: >> kernel-`uname -r`.rpm 和 对应的grub-*.rpm 
   或  cat /proc/version

2. 找到当前系统的ISO镜像则:

mount -o loop /path/to/file.iso  /mnt/iso 
cd /mnt/iso/
find . -name 'kernel-*.rpm' -o -name 'grub-*.rpm'
umount /boot              #先卸载boot分区的挂载
mkfs.ext2  /dev/sda1      #注:此假设为boot分区。
mount /dev/sda1 /boot 
rpm -ivh --root=/ --force kernel-`uname -r`.rpm  #"--root=/"指定其安装的相对目录为"/"下的boot.它主要安装Kernel和驱动(ko);
                                                #vmlinuz:此为Linux的kernel文件. 
                                                #initramfs:此为Linux2.6的initrd文件,它包含了当前主机的磁盘驱动,
                                                #以便kernel可识别磁盘设备.
rpm -ivh --root=/ --force grub-*.rpm    #1. 它将安装grub、grub-install等到系统中.它不是必须安装的,
                                        #    若你的系统中已经可以使用grub-install,也可不安装.但你需要做以下操作:
                           #(1) mkdir /boot/grub/
                           #(2) cp  /usr/share/grub/`uname -m`-redhat/*  /boot/grub/,这里复制的文件是安装系统是创建的备份文件.
                           #    <1> stage1 :此为MBR引导信息(Bootloader)的备份.实际上就是磁盘0扇区446字节的备份文件。
                           #    <2> jfs_stage1_5,fat_stage1_5,xfs_stage1_5,iso9660_stage1_5,e2fs_stage1_5都是不同类型的文件系统,
                           #        bootloader通过它们来识别不同的boot分区,以便去查找stage2文件。
                           #    <3> stage2: 它会去找/boot/grub/grub.conf 来显示启动菜单.
                           
grub-install  /dev/sda          #这一步是安装启动引导,正常情况下:开机Post硬件自检-->
                                #BIOS按启动顺序设定去找Disk、CDROM、PXE等方式启动-->
                                #一般为Disk引导,当BIOS检查到Disk上第一个可用的MBR引导(bootloader)后-->
                                #bootloader显示启动菜单-->
                                #选择启动系统后-->
                                #bootloader依启动系统所在分区信息找到该OS的Kernel和initrd并装载到内存特定位置-->
                                #Kernel启动并检查initrd是否为cpio格式-->
                                #是则解压cpio到kernel初始化的rootfs文件系统中-->
                                #执行initrd中的init进程-->kernel退出,init进程启动.

若系统不幸已经关机,那么可通过以下方式急救:

1. PXE方式:

    这里具体如何部署PXE环境,就不做介绍了。
    这里我测试的环境是Cobbler代替PXE来做测试。

   启动Cobbler后,进入/var/lib/tftpboot目录下。

   service httpd start    
   service cobblerd  start   
   service dnsmsaq start
   cd  /var/lib/tftpboot
   <1> vim pexlinux.cfg/default 
    【
        LABEL CDLinux
        kernel memdisk raw iso initrd=BT8_cdlinux_net.iso  
        # 注意: BT8镜像是放在/var/lib/tftpboot/下的。
        # memdisk :引导IMG、IMA、ISO映像所必须加载的文件,它也可用来加载WinPE.ISO来提供网络PE.
        #     但需要注意的是:ISO文件在网络启动时,不支持外置应用程序,也就是说ISO镜像必须是将所有应用
        #     软件都安装到ISO镜像内的系统目录中才行。
            
    】

   <2> 注: 若CDLinux中不确定是否有支持Linux服务器的网卡驱动,建议先准备一个U盘,并将当前系统的ISO文件或直接将kernel-`uname -r`.rpm 和 grub-*.rpm拷贝到U盘上,然后,直接插到服务器上,在来从网络启动CDLinux.这样它会自动加载USB的驱动,并将其挂载到/media目录下。

   <3> 进入CDLinux后,操作方法就与CDROM的方式类似了。可直接参考CDROM方式即可。

   

2. CDROM方式:

这种方式最简单,也最靠谱,但你的Linux服务器需要有CDROM 和 一张Linux发行版镜像光盘。若没有这就不行了。

操作方法:

1. 修改BIOS,将CDROM作为首选启动项。

2. Linux光盘可任意发行版,但注意它必须支持Rescue模式。
        如:CentOS6.4的光盘引导中有"Rescue installed system"
           CentOS5 和Redhat5 的光盘启动后,可在 boot: 处输入: linux rescue回车进入Rescue模式。

3. 进入后,过程基本都一样.一路回车.但需要注意: 一定要配置好网络连接,给自己留条后路。最后它会自动检测磁盘上的根文件系统,若成功检测到,则会将其挂载到/mnt/sysimage上。接着,就会进入一个shell。

4. 进入shell后,可 chroot  /mnt/sysimage ,来切换到故障系统中。

5. 检查当前挂载的文件系统有哪些。

    df -Th

6. 尝试挂载boot分区到/boot下,若提示buzy或已挂载的错误,则先退出chroot模式。到最初shell界面,再次执行"df -Th" 查看是否挂载了/dev/sda1. 若已经挂载则先卸载它。

7. 注意: 

    做下面操作的前提是, chroot /mnt/sysimage  –>  mount /dev/sda1 /boot后。

<1> mount /dev/sr0 /mnt/cdrom     #这是假设你使用的光盘是当前系统的安装光盘.
<2> cd /mnt/cdrom/Package/        #这是假设你的系统是Redhat或CentOS,并且光盘是Redhat或CentOS的光盘.

<3> 强制安装kernel和grub

#注:若光盘不是当前系统的光盘,你就必须保障你的系统可以联网。然后,下载与当前系统版本一致的rpm包。
rpm -ivh --root=/ --force kernel-`uname -r`.rpm
rpm -ivh --root=/ --force grub-*.rpm  #注: grub-*.rpm可不需要,但你必须保证系统中可以使用dd命令。

<4> 安装Bootloader到0扇区

    grub-install /dev/sda
    #若你没有安装grub-*.rpm,系统中也没有grub-install命令,那你就必须保证系统中有dd命令了,
    # 否则就只能下载一个grub或dd包.接着执行以下命令: 
    #    <1> mkdir /boot/grub
    #    <2> cp /usr/share/grub/`uname -m`-redhat/*  /boot/grub/
    #    <3> dd if=/boot/grub/stage1  of=/dev/sda  bs=446  count=1

<5> 修改/etc/fstab

vim /etc/fstab

    /dev/sda1  /boot  ext2 defaults 1 2     #若之前是UUID,则这里可先手动改成磁盘路径。
    /dev/sda2 / ext4 defaults 1 1           #因为每次格式磁盘后,UUID会发生改变,为确保万无一失,这里可先该成磁盘路径.
    /dev/sda3 swap swap defaults    0 0

<6> 创建grub.conf

vim  /boot/grub/grub.conf 

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz  #注: 若/boot/grub/下没有这个图片文件,这里最好注释掉。
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
    root (hd0,0)
    #这里注意:kernel和initrd一定不能写错,kernel部分也可只写以下内容也可:
    #    "kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/sda2"
    #     但必须注意:root=LABEL=/
    #    root=UUID=....
    #    root=/dev/sda2 或是LVM路径等.
    kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/sda2 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD 
        SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-358.el6.x86_64.img

<7> 到此就修复boot分区完成了。接着reboot即可。

3. U盘启动CDLinux

这种方式我测试时,始终无法成功启动CDLinux.
若你已经能成功启动CDLinux,那这种方式当然也是可行的,也是最方便的。

原创文章,作者:Wn1m,如若转载,请注明出处:http://www.178linux.com/13007

评论列表(1条)

  • stanley
    stanley 2016-03-22 10:46

    系统恢复是非常严肃的事情,如果真的出现这个问题我不会参考这篇文章,因为少了详细的背景描述和更专业的技术介绍