准备 chroot 来恢复损坏的 Linux 安装的正确方法是什么?

准备 chroot 来恢复损坏的 Linux 安装的正确方法是什么?

这个问题与经常被问到的问题有关。该程序经常被提及或链接到场外,但通常没有清楚和正确地陈述。为了将有用的信息集中在一个地方,这个问题试图为该程序提供清晰、正确的参考。


准备chroot恢复过程的环境?

许多 情况,修复损坏的 Linux 安装最好在安装内部进行。但如果系统无法启动,如何从内部进行修复?

假设你成功启动了另一个系统。进入后,你需要访问损坏的安装以修复它。许多恢复 操作方法建议使用chroot以便运行程序,就像您实际上已启动到损坏的安装一样。

  • 基本程序是怎样的?
  • 是否有公认的最佳实践可供遵循?
  • 为了使基本准备步骤适应特定的恢复任务,需要考虑哪些变量?

由于这是社区维基,请随意编辑这个问题以改进它。

答案1

以下是一些资源:

“更改根目录”或“chrooting”是一种放大文件系统部分的方法,例如,/path将指以前在 可访问的内容/mnt/path。表达式“chroot”中的“root”是指根文件系统/,而不是根用户。(尽管通常您需要根用户权限才能进行 chroot。)

准备

  • 本指南中的所有步骤都必须以 root 用户身份执行。

  • 我们假设您的硬盘位于 /dev/sda1,其文件类型为 ext3。如果您不知道磁盘的位置和文件类型,请阅读 的输出fdisk -l

  • 确保你启动的系统(例如 32 位 LiveCD)和你想要进入的系统(例如硬盘上的 32 位安装)的架构匹配。你可以使用 来确定你启动的架构uname -m

  • 确保您需要的所有内核模块都已加载。

  • 如果需要,请设置您的网络(例如,安装更新的软件包)。

  • 如果有必要,请初始化交换分区(例如swapon /dev/sda3)。

执行 chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
mount --bind /run /mnt/run  # (mentioned in comment below)

如果您的/boot目录与您的位于不同的分区/,并且您想要操作其中的文件(例如,如果您将使用 GRUB、执行内核升级等),您还需要挂载该分区。如果它位于 /dev/sda2 并且其文件类型为 ext2,则执行以下操作:

mount -t ext2 /dev/sda2 /mnt/boot

同样,对于文件系统的其他部分(/var/usr),它们位于单独的分区上,但您需要访问它们。通常,当您 chrooting 来修复某些东西时,您不需要访问 /home,因此您不必为此烦恼。

(在 chroot 之后也可以挂载文件系统,但是事先这样做更明智。原因是当您在之后执行此操作时,外部/内核环境将不知道已挂载的文件系统,因此如果您在退出 chroot 之前忘记卸载它们,系统在关闭时也不会知道卸载它们。这可能会损坏这些文件系统。)

如果您已经设置了网络并希望在 chrooted 系统中使用它,请复制过去,/etc/resolv.conf以便您能够解析域名:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

现在您已准备好进入已挂载的文件系统:

chroot /mnt /bin/bash

(如果返回错误chroot: cannot run command '/bin/bash': Exec format error,通常表示您使用一种体系结构(例如 x86_32)启动,并尝试 chroot 到另一种体系结构(例如 x86_64)。解决方案是使用具有与您想要 chroot 到的系统相同体系结构的 LiveCD。)

此时,您仍在运行启动时使用的内核,但所有路径/path都将引用以前的路径/mnt/path

如果您要使用 GRUB 进行任何操作,则需要确保您的/etc/mtab文件是最新的:

grep -v rootfs /proc/mounts > /etc/mtab

此时执行以下操作可能也会有所帮助:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

做你的脏活

此时,您可以执行任何需要进行的故障排除:

  • 将 GRUB 重新安装到磁盘的 MBR
  • 重置忘记的密码
  • 执行内核升级(或降级)
  • 重建你的 initramdisk
  • 修复你的 /etc/fstab
  • 使用包管理器重新安装包
  • 任何

打扫干净

完成后,确保所有正在运行的程序都已停止。然后退出 chroot:

exit

现在卸载您挂载的所有分区:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/run  # (mentioned in comment below)
umount /mnt/{proc,sys,dev}

最后尝试卸载您的硬盘:

umount /mnt

如果出现错误,提示 /mnt (或任何其他分区)正忙,则可能意味着以下两种情况之一:

  • 一个程序仍在 chroot 中运行。

  • 或者更常见的情况是:此挂载点仍存在于此挂载点上。例如,当尝试卸载 /mnt 时,/mnt/usr 仍处于挂载状态。

在后一种情况下,只需先卸载有问题的挂载点即可。要获取所有当前挂载点的提醒,请mount不带参数运行。

最后:

reboot

相关内容