# Change Root (日本語)

Chroot は見かけのルートディレクトリ（と動いているプロセスとその子プロセス群）を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため chroot監獄 と呼ばれます。ルートディレクトリを変更することは通常システムのメンテナンスに使われます。例えばブートローダを再インストールしたりパスワードを再設定するときなどです。

## 要件

- 他の Linux 環境からブートする必要があります（LiveCD や USB メディア、別にインストールされたディストリビューションなど）。

- chroot を行うには root 権限が必要です。

- ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください。（つまり i686 なのか x86_64 なのか）。アーキテクチャの確認は次のコマンドで行えます:

      # uname -m

- chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。スワップを有効にしたり (`swapon /dev/sdxY`)、インターネットに接続すると役立つかもしれません。

## パーティションをマウント

chroot しようとしているルートパーティションをマウントする必要があります。割り当てられたデバイス名を見つけて下さい:

    # lsblk /dev/sda

パーティションレイアウトを知るには、次のコマンドを使ってください.

    # fdisk -l

そして好きな場所にディレクトリを作り、マウントします:

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

次に、あなたシステムのパーティションが分割されている場合 (`/boot`, `/home`, `/var`, etc) それらもマウントする必要があります:

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

chroot した後もファイルシステムをマウントすることはできますが、事前に行ったほうが便利です。なぜなら chroot を解除したあとアンマウントする必要があるためです。またシャットダウンの安全性を高める利点もあります。外部の Linux はすべてのマウントされたパーティションを把握していて、シャットダウン中に安全にアンマウントしてくれるはずです。

## Change root

一時ファイルシステムを root でマウントします:

Note: 2012年の新しい Arch Linux インストール CD から、`arch-chroot /mnt/arch` コマンドを使うことができます。

    cd /mnt/arch
    mount -t proc proc proc/
    mount --rbind /sys sys/
    mount --rbind /dev dev/

インターネット接続を chroot 環境で使いたいときは、DNS サーバーの設定をコピーする必要があるかもしれません:

    cp /etc/resolv.conf etc/resolv.conf

それでは chroot を使いましょう:

    chroot /mnt/arch /bin/bash

Note: `chroot: cannot run command '/usr/bin/bash': Exec format error` というエラーがでた場合、おそらくインストールメディアと新しい root のプログラムのアーキテクチャが一致していません。
Note: `chroot: '/usr/bin/bash': permission denied` というエラーが出る場合、exec パーミッションを使ってマウントしなおして下さい: `mount -o remount,exec /mnt/arch`.

Bash の設定 (`~/.bashrc` もしくは `/etc/bash.bashrc`) を source コマンドで反映させることもできます:

    source ~/.bashrc
    source /etc/profile

必要なら bash のプロンプトに chroot を使っているとわかるようにできます:

    # export PS1="(chroot) $PS1"

## グラフィカルアプリケーションを動かす

システムで X を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。

chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、xhost コマンドを実行してください:

    $ xhost +

次に、アプリケーションに X サーバーを指定するために、chroot の中で DISPLAY 環境変数を X サーバーを動かしているユーザーの DISPLAY 変数と一致するように指定してください。X サーバーを実行しているユーザーで以下を実行することで

    $ echo $DISPLAY

DISPLAY の値を見ることができます。値が (例えば) ":0" の場合、chroot 環境で DISPLAY 環境変数を ":0" に設定するには:

    $ export DISPLAY=:0

これで chroot のコマンドラインから GUI アプリを起動できるようになりました。 ;)

## システムメンテナンスを行う

この時点で chroot 環境で必要なシステムメンテナンスを行えます。例えば:

- ブートローダの再インストール
- initramfs イメージのリビルド
- パッケージのアップグレードもしくはダウングレード
- パスワードの再設定

## chroot を終了する

システムメンテナンスが終わったら、chroot を終了します:

    # exit

そして一時ファイルシステムやデバイスをアンマウントしてください:

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

最後にルートパーティションをアンマウントして完了です:

    # cd ..
    # umount arch/

Note: `/mnt` (やその他のパーティション)が busy であるというエラーが出た場合、次の可能性があります:

- chroot 内でまだプログラムが動いている

- サブマウントが存在している。(例えば `/mnt/arch` の中に `/mnt/arch/boot` がある)。こちらのほうが可能性が高いです、`lsblk` を使いマウントポイントを確認してください:

      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 -o gid=5 -t devpts pts myroot/dev/pts/
    # cp -i /etc/resolv.conf myroot/etc/
    # chroot myroot
    # # inside chroot:
    # passwd # set a password
    # useradd -m -s /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

## chroot の代わりに systemd-nspawn を使う

また、同じことをするのに systemd-nspawn を使うことも可能です、これにはいくつかのメリットがあります ("systemd-nspawn" の man ページを見て下さい)。

手順はほとんど同じです:

まず root パーティションをマウントしてください。

    # mkdir /mnt/arch
    # mount /dev/sdx3 /mnt/arch

さらに　boot と home パーティションを root パーティションの中にマウントしてください。

    # mount /dev/sdx1 /mnt/arch/boot
    # mount /dev/sdx4 /mnt/arch/home

そして root パーティションにディレクトリを移動してから systemd-nspawn を実行してください。

    # cd /mnt/arch
    # systemd-nspawn

上述の通り proc, sys, dev, dev/pts などをマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。

終了するには、ログアウトするか poweroff コマンドを実行してください。それで上の説明と同じようにパーティションをアンマウントすることができます (proc, sys などは気にする必要がありません)。

関連項目: Arch systemd container (日本語) を見て下さい。

Category:

- System recovery (日本語)