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


52

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


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

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

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

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

由于这是Community Wiki,请随时编辑此问题以进行改进。

Answers:


72

以下是一些资源:

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

制备

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

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

  • 确保引导到的系统(例如32bit LiveCD)的体系结构与要输入的系统(例如硬盘驱动器上的32bit安装)的体系结构匹配。您可以使用确定启动的体系结构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

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

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

同样,对于你的文件系统(的任何其他部分/var/usr驻留在独立的分区,但你需要访问)。通常,当您正在扎根修复某些问题时,您将不需要访问/ home,因此无需费心。

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

如果您已经设置了网络并想在chroot系统中使用它,请复制过来,/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)启动,并尝试将根目录转换为另一种体系结构(例如x86_64)。解决方案是使用LiveCD,该CD具有与您想要的系统相同的体系结构。 chroot into。)

此时,您仍在运行启动时使用的内核,但是所有路径/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

做你的肮脏的工作

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

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

打扫干净

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

exit

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

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

最后尝试卸载硬盘驱动器:

umount /mnt

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

  • 程序保留在chroot内部。

  • 或更频繁地:该安装点上仍然存在安装点。例如,在尝试卸载/ mnt时,仍会挂载/ mnt / usr。

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

最后:

reboot

10
作为准备,我倾向于chroot.sh在我使用的每个系统的根目录中保留一个脚本,该脚本的内容或多或少与上述内容匹配。当我需要从LiveCD或其他东西chroot进入该系统时,只需挂载根文件系统并运行chroot脚本即可。不再需要疯狂地搜索正确的命令。
瑞安·汤普森

4
先生,您救了我的培根-很棒的文字。在这种情况下,我希望SO有+1000按钮。
zelanix '16

1
使用以下方法:SHELL=/bin/bash chroot /mnt如果livecd的默认SHELL不在chroot环境中(例如systemrescuecd的defalut zsh),则可以!在Vim中进行修复。
Alois Mahdal

我发现,你还需要安装/run这些天mount --bind /run /mnt/run
cengique
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.