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