如何使用Live USB设备恢复Linux系统

347 阅读6分钟

Fedora Live USB发行版为启动和进入恢复模式提供了一个有效的解决方案。

我的家庭实验室里有十几台物理电脑,还有更多的虚拟机。我使用这些系统中的大部分来进行测试和实验。我经常写关于使用自动化来使系统管理员的任务更容易。我也曾在多个地方写过,我从自己的错误中学习到的东西几乎比其他任何方式都要多。

在过去的几周里,我学到了很多。

我给自己制造了一个大问题。我做了多年的系统管理员,写了数百篇关于Linux的文章和五本书,我真的应该知道的更多。然后,我们都会犯错,这是一个重要的教训:你永远不会太有经验,不会犯错。

我不打算讨论我的错误的细节。只要告诉你这是一个错误,而且我在做之前应该对我所做的事情多加考虑就够了。此外,这些细节并不是真正的重点。经验不能把你从你要犯的每个错误中拯救出来,但它可以帮助你恢复。而这正是本文的内容。使用Live USB发行版来启动和进入恢复模式。

问题

首先,我创造了一个问题,基本上是/etc/default/grub 文件的一个错误配置。接下来,我使用Ansible将配置错误的文件分发到我所有的物理计算机上,并运行grub2-mkconfig 。所有的12台电脑。真的,真的很快。

除了两台之外,其他的都没能启动。它们在Linux启动的早期阶段崩溃了,出现了各种错误,表明无法找到/root 文件系统。

我可以使用根密码进入 "维护 "模式,但如果没有安装/root ,就不可能访问甚至最简单的工具。直接启动到恢复内核也不起作用。这些系统真的坏了。

Fedora的恢复模式

解决这个问题的唯一方法是找到一个进入恢复模式的方法。当所有其他方法都失败时,Fedora提供了一个非常酷的工具。用来安装Fedora新实例的同一个Live USB优盘。

在将BIOS设置为从Live USB设备启动后,我启动了Fedora 36 Xfce实时用户桌面。我在桌面上打开了两个相邻的终端会话,并在两个终端中切换到root权限。

我在其中一个中运行了lsblk 以供参考。我使用结果来确定/ 根分区以及bootefi 分区。我使用了我的一个虚拟机,如下图所示。在这种情况下没有efi 分区,因为这个虚拟机没有使用UEFI。

# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0           7:0    0  1.5G  1 loop
loop1           7:1    0    6G  1 loop
├─live-rw     253:0    0    6G  0 dm   /
└─live-base   253:1    0    6G  1 dm   
loop2           7:2    0   32G  0 loop
└─live-rw     253:0    0    6G  0 dm   /
sda             8:0    0  120G  0 disk
├─sda1          8:1    0    1G  0 part
└─sda2          8:2    0  119G  0 part
  ├─vg01-swap 253:2    0    4G  0 lvm  
  ├─vg01-tmp  253:3    0   10G  0 lvm  
  ├─vg01-var  253:4    0   20G  0 lvm  
  ├─vg01-home 253:5    0    5G  0 lvm  
  ├─vg01-usr  253:6    0   20G  0 lvm  
  └─vg01-root 253:7    0    5G  0 lvm  
sr0            11:0    1  1.6G  0 rom  /run/initramfs/live
zram0         252:0    0    8G  0 disk [SWAP]

/dev/sda1 分区很容易被识别为/boot ,而根分区也很明显。

在另一个终端会话中,我执行了一系列的步骤来恢复我的系统。具体的卷组名称和设备分区,如/dev/sda1 ,对你的系统来说会有所不同。这里显示的命令是针对我的情况的。

目的是使用Live USB启动并通过启动,然后在一个镜像目录中只挂载必要的文件系统,并运行chroot 命令,在chroot的镜像目录中运行Linux。这种方法避开了损坏的GRUB(或其他)配置文件。然而,它提供了一个完整的运行系统,并挂载了所有的原始文件系统以便恢复,既是所需工具的来源,也是要做的修改的目标。

下面是步骤和相关命令。

1.创建目录/mnt/sysimage ,为chroot 目录提供一个位置。

2.将根分区挂载在/mnt/sysimage:

# mount /dev/mapper/vg01-root /mnt/sysimage

3.把/mnt/sysimage 作为你的工作目录。

# cd /mnt/sysimage

4.挂载/boot/boot/efi 文件系统。

5.挂载其他主要文件系统。像/home/tmp 这样的文件系统在这个过程中是不需要的。

# mount /dev/mapper/vg01-usr usr

# mount /dev/mapper/vg01-var var

6.挂载重要的但已经挂载的文件系统,这些文件系统必须在chroot系统和原来的Live系统之间共享,后者仍然在那里运行。

# mount --bind /sys sys

# mount --bind /proc proc

7.确保最后完成/dev 目录,否则其他文件系统将无法安装。

# mount --bind /dev dev

8.将系统镜像转根。

# chroot /mnt/sysimage

现在系统已经准备好了,无论你需要做什么,都可以把它恢复到工作状态。然而,有一次我能够在这种状态下运行我的服务器好几天,直到我能够研究和测试真正的修复措施。我并不推荐这样做,但在紧急情况下,当事情需要启动和运行时,这可能是一个选择,现在就可以了!"。

解决方案

一旦我把每个系统都进入恢复模式,修复就很容易了。因为我的系统现在就像成功启动一样工作,我只需对/etc/default/grub/etc/fstab 进行必要的修改,然后运行grub2-mkconfig > boot/grub2/grub.cfg 命令。我使用exit 命令退出chroot,然后重新启动了主机。

当然,我不能自动地从我的错误中恢复。我不得不在每台主机上手动执行整个过程--这是对我使用自动化来快速、轻松地传播自己的错误的恰当报应。

学到的教训

尽管它们很有用,我以前很讨厌在我的一些系统管理员工作中的 "经验教训 "会议,但现在看来我确实需要提醒自己一些事情。因此,这里是我从这场自作自受的惨败中获得的 "教训"。

首先,那十个无法启动的系统使用了不同的卷组命名方案,而我的新GRUB配置没有考虑到这一点。我只是忽略了他们可能是不同的事实。

  • 完全想清楚了。
  • 不是所有的系统都是一样的。
  • 测试一切。
  • 验证一切。
  • 永远不要做假设。