CentOS 救援模式下备份数据或修复系统故障

Posted by feizaipp on April 25, 2019

我的博客

1. 概述

       在开发 Linux 系统的过程中,由于经常会修改内核或者修改 Linux 的基础库,所以难免会因为某些错误导致系统无法启动。那么遇到这种问题如何将损失降到最低尤为重要。有两种方法能将损失降到最低,一种是你有另一台机器供你调试;另一种是你要在系统无法启动的时候能及时的备份出数据。一般情况下我们可能没有条件有另一台机器供我们调试。本文我们介绍如何进入救援模式备份系统中的资料,或者修复系统的故障。

2. 进入救援模式

       进入救援模式需要你拥有 U 盘启动盘或者光盘。目前 U 盘比较常用,本文就以 U 盘为例。这里假设你已经有了 U 盘启动盘,插入 U 盘,重起系统,在启动 BIOS 界面时,按下 del/F12 键,根据主板而定。按下后进入 BIOS 配置界面,选择 U 盘启动。 U 盘启动后,进入安装界面,这里选择手动安装。然后按下 Ctrl+Alt+F2 切换到 shell 界面,这时我们就进入到救援模式了。

       救援模式就是启动 U 盘里的精简版的系统,此时我们的操作都是在 U 盘的系统里进行操作的,比如执行 ls 命令,显示的是 U 盘系统的跟文件系统。但是我们能通过 mount 命令,将磁盘块设备挂在到 U 盘的跟文件系统中,这时就可以操作磁盘里的数据了,就好像我们在主机系统上操作一样。

3. 备份数据

       上面说到已经进入 shell 界面了,注意这里在运行的是 U 盘里的系统,你需要挂载磁盘和当前插入的 U 盘(或者你再次插入一个 U 盘做备份也行)到当前的跟文件系统,然后将磁盘的数据拷贝到 U 盘里。一般数据都放在 home 盘,这里就以备份 home 盘为例。首先创建一个目录,执行 mkdir home usb 命令,然后挂载 home 盘到刚才创建的 home 目录,如果你不知道哪个分区是 home 盘的分区,你可以执行 fdisk -l 命令查看磁盘信息。如下图所示:

磁盘分区信息

       从上图可以看出,磁盘空间是 500G ,设备节点是 /dev/sda ,并且有四个分区。第一个分区是 EFI 分区;第二个分区是 boot 分区,第三个分区是 home 分区, 第四个分区是 LVM 逻辑磁盘分区。所以首先执行 mount /dev/sda3 home 命令,挂载 home 分区。执行成功后,通过访问 home 目录就能访问磁盘里的数据了。然后,挂载 U 盘, U 盘的分区信息也可以通过 fdisk -l 命令查看,如下图所示:

磁盘分区信息

       从上图可知, U 盘的设备节点是 /dev/sdb ,分区是 /dev/sdb4 。所以执行 mount /dev/sdb4 usb 命令,执行成功后就可以将 home 目录中数据拷贝到 usb 目录了,也就相当于将磁盘的 home 目录的数据备份到了 U 盘了。拷贝完成后,注意执行 umount usb 命令,将数据写入 U 盘。至此数据备份完成。

4. 修复系统

       重要的数据已经备份完了,但是怎么修复系统呢?重装系统还是比较麻烦的, CentOS 系统开发用的一大堆的 RPM 包和依赖都要重新安装,这些需要花费很长的时间。所以我们还是想办法能否修复系统。我曾经因为更新内核导致系统无法启动,那么能不能将内核在更新回去呢?答案是肯定的。还是需要借助 U 盘启动,启动 U 盘启动盘后,挂载磁盘的 root 分区,然后将新内核通过 RPM 包的方式安装到 root 分区。

4.1. 挂载 root 分区

       《3. 备份数据》一节中我们介绍了磁盘有四个分区,但是没有看到 root 这个分区啊?因为 root 分区是被 LVM 逻辑卷管理的。对于逻辑卷的操作使用下面的命令。

       通过 lvm lvscan 命令查看逻辑卷的信息是未激活状态,如下图所示:

磁盘分区信息

       使用 lvm vgchange -ay 命令激活逻辑卷分区,如下图所示:

磁盘分区信息

       再次通过 lvm lvscan 命令查看逻辑卷的信息是已经激活状态,如下图所示:

磁盘分区信息

       然后将磁盘 root 分区挂载到当前目录,首先在当前目录创建 new_root 目录,执行 mkdir new_root 命令。然后将 root 分区挂载到 new_root 目录,执行 mount /dev/centos/root new_root 命令。

4.2. 更新内核

       挂载成功后,使用 rpm 命令更新新的 kernel 到磁盘的 root 分区。通过 rpm 更新 kernel 时要先执行 chroot 命令将 new_root 目录设为根目录,因为新的 kernel 要安装到 new_root 目录去,即磁盘的 root 分区。还有一点要注意,因为新的内核要安装到 /boot 目录去,所以要将磁盘的 boot 分区挂载到 new_root 目录下的 boot 目录,这个问题调试了好久才找到原因。如果你的内核没问题的话应该可以从磁盘启动系统了。

5. 总结

       时刻谨记一点,救援模式下运行的系统是你 U 盘里的系统,要备份磁盘的数据或者修复磁盘的系统就要将磁盘挂载到 U 盘里运行的系统的根目录来。 Linux 一切皆文件,这话一点没错。