chroot

提供: ArchWiki
2023年11月1日 (水) 18:44時点におけるKgx (トーク | 投稿記録)による版 (→‎使い方: 情報を更新)
ナビゲーションに移動 検索に移動

関連記事

Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は chroot監獄 と呼ばれます。

理由

Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば:

Wikipedia:ja:Chroot#制限 も参照。

要件

  • chroot を行うには root 権限が必要です。
  • 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。
  • ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: # uname -m
  • chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
  • 必要であればスワップを有効にしてください:
    # swapon /dev/sdxY
  • 必要であればインターネットに接続してください。

新しいルートの場所を準備する

chroot ターゲットは、ファイルシステム階層を含むディレクトリである必要があります。

インストールガイド では、このディレクトリは /mnt になります。既存のインストールの場合は、既存のパーティションを自分で /mnt にマウントする必要があります。

lsblk を実行し、インストールのパーティションレイアウトをメモします。通常は、/dev/sdXY のようなものになります。NVMe ドライブの場合は /dev/nvme0nXpY になります。

ファイルシステムをマウントします。

# mount /dev/sdXY /mnt

EFI システムパーティション があり、それに変更を加える必要がある場合 (vmlinuz または initramfs イメージの更新など):

# mount /dev/sdXZ /mnt/esp

個別パーティション がある場合は、それらもマウントします。

次の例では、/path/to/new/root は新しいルートが存在するディレクトリです (例: /mnt)

使い方

ノート:
  • hostnamectllocalectltimedatectl などの systemd のツールは D-Bus の接続が必要なため chroot の中では動作しません [1]
  • chroot の新しいルート (/) となるファイルシステムは、アクセス可能でなければなりません(復号化、マウント済み)

chroot を使用するには、以下の 2 つの主要なオプションがあります。

arch-chroot を使う

Bash スクリプト arch-chrootarch-install-scripts パッケージに含まれています。/usr/bin/chroot を実行する前にこのスクリプトは /proc などの api ファイルシステムをマウントして、chroot から使える /etc/resolv.conf を作成します。

chroot に入る

最初の引数として新しいルートディレクトリを指定して arch-chroot を実行します。

# arch-chroot /path/to/new/root

これで、既存のインストールで利用できるほとんどの操作を実行できるようになります。D-Bus を必要とする一部のタスクは、使い方 に記載されているように機能しません。

chroot を終了する

chroot を終了するには、次を使用します。

# exit

1つのコマンドを実行して終了する

chroot からコマンドを実行して終了するには、次のように、末尾にコマンドを追加します:

# arch-chroot /path/to/new/root mycommand

たとえば、/mnt/arch にある chroot に対して mkinitcpio -p linux を実行するには、次のようにします。

# arch-chroot /mnt/arch mkinitcpio -p linux

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

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

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

$ xhost +local:

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

$ echo $DISPLAY

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

# export DISPLAY=:0

root 権限を使わない

Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。

PRoot

PRoot を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに mount --bind を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には --root-id 引数があり、fakeroot と同じような方法で制限を回避することができます。

Fakechroot

fakechroot は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで chroot をシミュレートすることができます。

# fakechroot fakeroot chroot ~/my-chroot bash

Unshare

Unshare, part of util-linux, can be used to create a new kernel namespace. This works with the usual chroot command. For example:

$ unshare --map-root-user chroot ~/namespace /bin/sh

Troubleshooting

arch-chroot: /location/of/new/root is not a mountpoint. This may have undesirable side effects.

Upon executing arch-chroot /location/of/new/root a warning is issued:

==> WARNING: /location/of/new/root is not a mountpoint. This may have undesirable side effects.

See arch-chroot(8) for an explanation and an example of using bind mounting to make the chroot directory a mountpoint.

参照