Change Root (日本語)

From ArchWiki
Revision as of 07:21, 27 August 2013 by Kusakata (Talk | contribs)

Jump to: navigation, search

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 から、以下のコマンドは arch-chroot /mnt/arch に置き換えられます。arch-chroot を実行するには arch-install-scripts がインストールされている必要があります。他の 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/
# 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
Note: chroot: cannot run command '/usr/bin/bash': Exec format error というエラーがでたら、アーキテクチャが一致していないおそれがあります。
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 +

次に、アプリケーションに 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/
Note: /mnt (やその他のパーティション)が busy であるというエラーが出た場合、次の可能性があります:
  • chroot 内でまだプログラムが動いている
  • サブマウントが存在している。(例えば /mnt/arch の中に /mnt/arch/boot がある)。こちらのほうが可能性が高いです、lsblk を使いマウントポイントを確認してください:
lsblk /dev/sda
それでもパーティションがアンマウントできない時は --force オプションを使って下さい:
# umount -f /mnt

これで、安全に再起動することができます。

サンプル

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).

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Describe the steps to run an X server inside the systemd-nspawn container. (Discuss in Talk:Change Root (日本語)#)

Related: See Arch systemd container.