不幸的是,在更新的安装部分期间,我的笔记本电脑在执行更新时因电池电量不足而休眠。
启动 rEFInd 时仅显示 Windows,而不显示 Manjaro。
这次更新的规模相当大,其中包括 Linux 内核。
在阅读 rEFInd 的文档后,作者指出它在查找内核方面做得非常好。我还知道 Linux 可以在运行时进行自我更新,并且对于大多数(如果不是全部)程序来说,程序可以继续运行,并在重新启动后开始使用更新的文件。
我的想法是,正在运行的系统(即更新前的系统)位于内存中,而更新则被写入磁盘并安装在正确的位置。知道休眠会将 RAM 写入我的交换分区后,我尝试启动的系统(本应位于 RAM 中的系统)现在已被换出。
我的问题是,知道我在 USB 上有基于 Linux 的发行版,是否可以以恢复之前的会话并继续更新的方式启动,就好像什么也没发生一样?
如果没有,我是否能够安全地 chroot 进入 Manjaro,更新它,清除交换,然后正常启动它,因为一切都安装了一半?吃豆人对此有何反应?
答案1
我能够chroot
使用可启动的 USB 记忆棒在实时操作系统中修复此问题。现在,我将逐步描述我为解决此问题所做的工作。
1. 获取一个可启动的 U 盘
任何基于 Linux 的操作系统都可以,只要它具有基本实用程序(大多数操作系统都有),例如chroot
和fsck
。
2. 启动实时操作系统
将 USB 记忆棒插入计算机中或任何有实时操作系统的地方,然后从引导加载程序或 BIOS 进行引导。
3. chroot 进入损坏的系统
现在我们正在外部系统中工作,我们将使用它直接从终端访问我们损坏的系统。
3.1.手动方式
此过程或多或少是通用的,您可能必须根据分区布局进行更改,并且需要特权访问,在本示例中使用sudo
.
首先,让我们创建一个目录,我们将在其中挂载损坏的系统/
目录:
mkdir broken-root
现在我们必须将文件系统安装到该文件夹中。使用任何允许您查找应预安装在实时操作系统中的所有可用分区的工具(例如:gparted),查找损坏的操作系统的根分区。在此示例中,我们假设根分区是 /dev/sda2
:
sudo mount /dev/sda2 broken-root
现在我们还必须安装启动分区。此步骤取决于您启动系统的方式。如果您使用 EFI,并且假设您的启动分区由以下给出 /dev/sda1
然后使用以下命令安装它:
sudo mount /dev/sda1 broken-root/boot/efi
如果您的系统不使用 EFI,请寻找挂载引导分区的正确方法。
我们还必须绑定系统目录:
sudo mount --bind /proc /broken-root/proc
sudo mount --bind /dev /broken-root/dev
sudo mount --bind /sys /broken-root/sys
最后启用网络:
sudo cp /etc/resolv.conf /broken-root/etc/
我们现在可以chroot
进入系统:
sudo chroot broken-root
3.2.自动化方式
有一些工具可以为您自动执行此过程。我发现的是拱形 chroot和manjaro-chroot,但可能有更多自动化工具可用于不同的操作系统。
4.检查文件系统是否有错误
运行sudo fsck /dev/sda2
以检查根分区中的错误并修复它们。我在更新后执行了此操作,但在更新时发现了一些错误,因此最好在更新之前执行此操作。
5. 执行更新
现在您已进入损坏的系统,现在可以进行更新了。由于我的系统在更新过程中休眠,pacman 锁定了自身,因此您必须删除位于的文件才能/var/lib/pacman/db.lck
继续。
解除锁定后,使用sudo pacman -Syu
.
即使在此之后也可能会出现问题,至少我是这样,所以我跑去sudo pacman -Qkk
列出有问题的软件包,当然,内核就是其中之一。然后重新安装所有显示问题的软件包。
笔记:该-Qkk
标志非常详细,它列出了预期的内容,只查找最相关的内容!
6. 将交换擦拭干净
我忘记这样做了,系统试图恢复之前的状态,但在睡眠时进行了更改,最终出现了充满错误的黑屏,并通过拔掉电源强制我的计算机关闭它。
要解决此问题,当仍在实时操作系统中时,要么禁用从交换恢复(这就是我所做的),要么清除交换文件或分区。它应该以任何一种方式工作,但我建议禁用交换中的恢复,然后在您现在修复的操作系统中将其擦除干净,只是因为它对我有用。
7. 就是这样!
现在,再次启动我的计算机后,Manjaro 将显示在我的引导加载程序中。我像往常一样从它启动,它没有显示任何错误,一切似乎都按预期工作。
参考
Manjaro Wiki - Grub/恢复 GRUB 引导加载程序