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

qua*_*ote 62 livecd chroot system-recovery community-faq-proposed

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


为恢复过程准备chroot环境的正确步骤是什么?

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

让我们假设您设法引导到备用系统。到达那里后,您需要访问损坏的安装以修复它。许多恢复 入门指南推荐使用的chroot才能,如果你是真正引导到碎安装运行程序。

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

由于这是社区 Wiki,请随时编辑此问题以对其进行改进。

dub*_*jim 84

以下是一些资源:

“更改根目录”或“chrooting”是一种放大文件系统的一部分的方法,例如,这样/path将引用以前在/mnt/path. 表达式“chroot”中的“root”指的是根文件系统/,而不是根用户。(尽管通常您需要 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
Run Code Online (Sandbox Code Playgroud)

如果您的/boot目录/与 . 如果它在 /dev/sda2 并且它的文件类型是 ext2,那么执行:

mount -t ext2 /dev/sda2 /mnt/boot
Run Code Online (Sandbox Code Playgroud)

同样,对于文件系统 ( /var, /usr) 的任何其他部分,它们驻留在单独的分区上但您需要访问。通常,当您使用 chroot 来修复某些内容时,您将不需要访问 /home,因此您无需为此烦恼。

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

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

cp -L /etc/resolv.conf /mnt/etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

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

chroot /mnt /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

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

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

grep -v rootfs /proc/mounts > /etc/mtab
Run Code Online (Sandbox Code Playgroud)

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

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt
Run Code Online (Sandbox Code Playgroud)

做你肮脏的工作

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

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

打扫干净

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

exit
Run Code Online (Sandbox Code Playgroud)

现在卸载您安装的所有分区:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}
Run Code Online (Sandbox Code Playgroud)

最后尝试卸载您的硬盘:

umount /mnt
Run Code Online (Sandbox Code Playgroud)

如果您收到一条错误消息,指出 /mnt(或任何其他分区)正忙,这可能意味着以下两种情况之一:

  • 一个程序在 chroot 内部运行。

  • 或者更频繁地:这个挂载上仍然存在挂载点。例如,尝试卸载 /mnt 时,/mnt/usr 仍处于挂载状态。

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

最后:

reboot
Run Code Online (Sandbox Code Playgroud)

  • 作为准备,我倾向于在我使用的每个系统的根目录中留下一个名为“chroot.sh”的脚本,其内容或多或少与上述内容相符。当我需要从 LiveCD 或其他东西 chroot 到该系统时,我只需挂载根文件系统并运行 chroot 脚本。不再疯狂地搜索正确的命令。 (11认同)
  • 先生,你救了我的培根——精彩的文章。在这种情况下,我希望 SO 有一个 +1000 按钮。 (4认同)
  • 我发现这些天你还需要使用“mount --bind /run /mnt/run”来挂载“/run”。 (3认同)