以下是一些资源:
“更改根目录”或“ 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(或任何其他分区)正忙,则可能意味着以下两种情况之一:
在后一种情况下,只需简单地先卸载有问题的安装点即可。要提醒所有当前的安装点,请mount
不带参数运行。
最后:
reboot
chroot.sh
在我使用的每个系统的根目录中保留一个脚本,该脚本的内容或多或少与上述内容匹配。当我需要从LiveCD或其他东西chroot进入该系统时,只需挂载根文件系统并运行chroot脚本即可。不再需要疯狂地搜索正确的命令。