# Change root (简体中文)

翻译状态： 本文是英文页面 Change_Root 的翻译，最后翻译时间：2013-06-20，点击这里可以查看翻译后英文页面的改动。

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

你也能运行如下命令获取你的分区布局

    # fdisk -l

现在创建一个你想要挂载root分区的目录并且挂载到它：

    # 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

作为root挂载临时文件系统：

Note: 使用更新的 (2012) Arch

发行版，以下`mount`命令可以被`arch-chroot`

/mnt/arch取代。你必须安装了arch-install-scripts才能运行arch-chroot。如果你在使用其它不同的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 /mnt/arch /usr/bin/bash

Note: 如果你遇到错误 `chroot: cannot run command '/bin/bash': Exec format error`，很可能两个环境架构不匹配。
Note: 如果你遇到错误 `chroot: '/usr/bin/bash': permission denied`,用执行权限重新挂载: `mount -o remount,exec /mnt/arch`。

可选地，source你的Bash配置文件(`~/.bashrc`和`/etc/bash.bashrc`)，运行：

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

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

    # export PS1="(chroot) $PS1"

## 运行图形化的chroot应用

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

为了chroot环境能连接到你的X服务器，在X服务器中打开一个终端(例如，在用户当前登录的桌面中)，然后运行如下命令给任何人连接到用户X服务器的权限：

    $ xhost +

然后，从chroot环境中将应用指向你的X服务器，将chroot中的DISPLAY环境变量设定成和拥有X服务器的用户DISPLAY变量相匹配。例如，运行：

    $ echo $DISPLAY

作为拥有X服务器的用户查看DISPLAY的值。如果是“:0”(例如是)，然后在chroot环境中运行

    # export DISPLAY=:0

现在你可以从chroot命令行启动图形界面应用;）

## 系统维护

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

- 重装引导。
- 重新构建initramfs镜像。
- 升级或降级软件包。
- 重置遗忘的密码.

## 退出chroot环境

当你完成系统维护后，退出chroot：

    # exit

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

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

最后，尝试卸载你的根分区：

    # cd ..
    # umount arch/

Note: 如果你得到错误说`/mnt`(或其它任何分区) is busy, 这可能意味着两种情况：

- chroot环境中残留了一个运行的程序。

- 或者，更常见的是，仍然存在子挂载(例如 `/mnt/arch/boot`挂载在`/mnt/arch`)。通过`lsblk`检查是否还存在任何挂载点(你也可以单输入一个mount查看):

      lsblk /dev/sda

  如果你仍然不能卸载分区，使用`--force`选项：

      # umount -f /mnt

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

## 示例

这也许能在浏览期间保护你的系统免于网络攻击：

    # # as root:
    # cd /home/user
    # mkdir myroot
    # pacman -S arch-install-scripts
    # # pacstrap must see myroot as mounted:
    # mount --bind myroot myroot
    # pacstrap -i myroot base base-devel
    # mount -t proc proc myroot/proc/
    # mount -t sysfs sys myroot/sys/
    # mount -o bind /dev myroot/dev/
    # mount -t devpts pts myroot/dev/pts/
    # cp -i /etc/resolv.conf myroot/etc/
    # chroot myroot
    # # inside chroot:
    # passwd # set a password
    # useradd -m -s /usr/bin/bash user
    # passwd user # set a password
    # # in a shell outside the chroot:
    # pacman -S xorg-server-xnest
    # # in a shell outside the chroot you can run this as user:
    $ Xnest -ac -geometry 1024x716+0+0 :1
    # # continue inside the chroot:
    # pacman -S xterm
    # DISPLAY=:1
    # xterm
    # # xterm is now running in Xnest
    # pacman -S xorg-server xorg-xinit xorg-server-utils
    # pacman -S openbox
    # # for java we need icedtea-web which requires some fonts:
    # nano /etc/locale.gen
    # # uncomment en_US.UTF-8 UTF-8, save and exit
    # locale-gen
    # echo LANG=en_US.UTF-8 > /etc/locale.conf
    # export LANG=en_US.UTF-8
    # pacman -S ttf-dejavu
    # pacman -S icedtea-web
    # pacman -S firefox
    # firefox
    # # firefox is now running in Xnest
    # exit
    # # outside chroot:
    # chroot --userspec=user myroot
    # # inside chroot as user:
    $ DISPLAY=:1
    $ openbox &
    $ HOME="/home/user"
    $ firefox

参见: Basic Chroot

Category:

- System recovery (简体中文)