Chroot
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 でマウントします:
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
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 環境で必要なシステムメンテナンスを行えます。例えば:
chroot を終了する
システムメンテナンスが終わったら、chroot を終了します:
# exit
そして一時ファイルシステムやデバイスをアンマウントしてください:
# umount {proc,sys,dev/pts,dev,boot,[...],}
最後にルートパーティションをアンマウントして完了です:
# cd .. # umount arch/
これで、安全に再起動することができます。
サンプル
以下のようにすることでブラウズ中にインターネット上の攻撃からシステムを保護することができます:
# # 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 コンテナ を見て下さい。