Chroot (简体中文)

From ArchWiki
Revision as of 11:37, 7 November 2012 by Reverland (talk | contribs) (运行图形化的chrooted应用)
Jump to navigation Jump to search
翻译状态: 本文是英文页面 Change_Root翻译,最后翻译时间:2012-11-06,点击这里可以查看翻译后英文页面的改动。

Chroot 是将当前磁盘根路径(和当前进程和它们的子进程)更改到另一个根目录。当你更改根路径到另一个目录下时,你不能在那个目录外存取文件和使用命令。这个目录叫作 chroot jail。切换根目录通常为了系统维护,例如重装引导程序或者重置遗忘的密码。

必要条件

  • 你需要从另一个运行的linux环境启动(例如从liveCD或USB闪存介质,或者从另一个已经安装的linux发行版中)。
  • 为了chroot需要root特权。
  • 确定你启动进的linux环境的架构符合你想要更改的根路径的架构(例如,i686,x86_64)。你可以用以下命令得到你的当前环境架构:
# uname -m
  • 如果你需要任何在chroot环境中使用的内核模块,在chroot之前加载它。初始化你的swap (swapon /dev/sdxY)估计也很有用,并且在chroot之前建立网络连接。

挂载分区

你想尝试chroot进去的linux系统根分区需要被挂载。为了找出内核分配的设备名称,运行:

# lsblk /dev/sda

然后创建一个你想要挂载分区的目录并且挂载到它:

# mkdir /mnt/arch
# mount /dev/sda3 /mnt/arch

接着,如果你的系统的其它分区有单独分区(比如说 /boot/home/var等等),你也需要挂载他们:

# mount /dev/sda1 /mnt/arch/boot/
# mount /dev/sdb5 /mnt/arch/home/
# mount ...

尽管你chroot之后可以挂载文件系统,之前完事更加方便。原因就是你将不得不在退出chroot之前卸载临时文件系统,而这样做将让你用一个单个命令卸载所有文件系统。这也使得关机更加安全。因为外部linux环境知道所有挂载的分区,它能安全的在关机时卸载他们。

Change root

挂载临时文件系统:

Note: 使用更新的 (2012) Arch 发行版,以下mount命令可以被arch-chroot /mnt/arch取代,如果root分区被挂载在那里的话。当然,如果你愿意你还可以键入以下内容,或者如果你仅仅有一些其它“live”LInux发行版。
# cd /mnt/arch
# mount -t proc proc proc/
# mount -t sysfs sys sys/
# mount -o bind /dev dev/
# mount -t devpts pts dev/pts/

如果你已经建立了一个网络连接并且想要在chroot环境中使用它,你可能不得不拷贝你的DNS服务器信息让你能够联网:

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

现在chroot到你之前安装的系统中并且指定你的shell

# chroot . /bin/bash
Note: 如果你遇到错误 chroot: cannot run command '/bin/bash': Exec format error,很可能两个环境架构不匹配。

可选地,source你的Bash配置文件(~/.bashrc/etc/bash.bashrc),运行:

# source ~/.bashrc
# source /etc/profile

可选的,创建一个独特的提示符来区别你的chroot环境:

# export PS1="(chroot) $PS1"

运行图形化的chroot应用

如果你在系统上运行了X,你可以在chroot环境启动图形应用。

为了能连接你的X服务器,你不得不在终端中运行以下命令:

# xhost +

然后,将应用指向你的X服务器,运行:

# export DISPLAY=:0.0

系统维护

此时你可以执行任何你需要在chroot环境中执行的系统维护操作。一些常见的例子是:

退出chroot环境

当你完成系统维护后,退出chroot:

# exit

然后卸载临时文件系统和任何挂载的设备:

# umount {proc,sys,dev,boot,[...],}

最后,尝试卸载你的根分区:

# cd ..
# umount arch/
Note: 如果你得到错误说/mnt(或其它任何分区) is busy, 这可能意味着两种情况:
  • chroot环境中残留了一个运行的程序。
  • 或者,更常见的是,仍然存在子挂载(例如 /mnt/arch/boot挂载在/mnt/arch)。通过lsblk检查是否还存在任何挂载点(你也可以单输入一个mount查看):
lsblk /dev/sda
如果你仍然不能卸载分区,使用--force选项:
# umount -f /mnt

这之后,你可以安全地的重启了。