Change Root (日本語)
Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため chroot監獄 と呼ばれます。ルートディレクトリを変更することは通常システムのメンテナンスに使われます。例えばブートローダを再インストールしたりパスワードを再設定するときなどです。
Contents |
要件
- 他の 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 -t sysfs sys sys/ mount -o bind /dev dev/ mount -t devpts pts dev/pts/ # gnome-terminal がパーミッションを取得できない問題が起こった場合は、上の行の代わりに次の行を使って下さい mount -t devpts -o rw,nosuid,noexec,gid=5,mode=620,ptmxmode=000 devpts dev/pts
インターネット接続を chroot 環境で使いたいときは、DNS サーバーの設定をコピーする必要があるかもしれません:
cp -L /etc/resolv.conf etc/resolv.conf
それでは chroot を使いましょう:
chroot /mnt/arch /usr/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 +
次に、アプリケーションに 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/
これで、安全に再起動することができます。
サンプル
This may protect your system from Internet attacks during browsing:
# # 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
An Alternative to chroot Using systemd-nspawn
Alternatively, you can use systemd-nspawn to achieve the same thing, with added benefits (see the "systemd-nspawn" man page).
The steps are very similar:
First mount the root partition.
# mkdir /mnt/arch # mount /dev/sdx3 /mnt/arch
Then mount the boot and home partitions inside the root partition.
# mount /dev/sdx1 /mnt/arch/boot # mount /dev/sdx4 /mnt/arch/home
Then, simply cd into the root partition and run systemd-nspawn.
# cd /mnt/arch # systemd-nspawn
As you can see, there's no need to worry about mounting proc, sys, dev, or dev/pts. systemd-nspawn starts a new init process in the contained environment which takes care of everything. It's like booting up a second Linux OS on the same machine, but it's not a virtual machine.
To quit, just log out or issue the poweroff command. You can then unmount the partitions like described above (except without having to worry about proc, sys, etc).
Related: See Arch systemd container.