「Chroot」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎chroot を使う: 記事の追加および翻訳)
79行目: 79行目:
 
{{Warning|{{ic|--rbind}} を使用すると {{ic|dev/}} と {{ic|sys/}} の一部のサブディレクトリがアンマウントできなくなります。その状態で {{ic|umount -l}} でアンマウントを行おうとするとセッションが破壊され、再起動が必要になります。可能であれば {{ic|-o bind}} を使ってください。}}
 
{{Warning|{{ic|--rbind}} を使用すると {{ic|dev/}} と {{ic|sys/}} の一部のサブディレクトリがアンマウントできなくなります。その状態で {{ic|umount -l}} でアンマウントを行おうとするとセッションが破壊され、再起動が必要になります。可能であれば {{ic|-o bind}} を使ってください。}}
   
  +
次の例では、{{ic|''/location/of/new/root''}} は新しいルートが存在するディレクトリです。
一時 api ファイルシステムをマウントします:
 
  +
まず、一時 api ファイルシステムをマウントします:
   
# cd /mnt/arch
+
# cd /location/of/new/root
 
# mount -t proc /proc proc/
 
# mount -t proc /proc proc/
# mount --rbind /sys sys/
+
# mount -t sysfs /sys sys/
 
# mount --rbind /dev dev/
 
# mount --rbind /dev dev/
   
90行目: 91行目:
 
# mount --rbind /run run/
 
# mount --rbind /run run/
   
  +
UEFI システムを実行している場合は、EFI 変数にもアクセスする必要があります。それ以外の場合、GRUBをインストールすると、次のようなメッセージが表示されます: {{ic|UEFI variables not supported on this machine}}:
インターネット接続を chroot 環境で使いたい時は、DNS サーバーの設定をコピーします:
 
  +
  +
# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/
  +
  +
次に、chroot 環境でインターネット接続を使用するには、DNS の詳細をコピーします:
   
 
# cp /etc/resolv.conf etc/resolv.conf
 
# cp /etc/resolv.conf etc/resolv.conf
   
Bash シェルに chroot するには:
+
最後に、{{ic|''/location/of/new/root''}} に chroot し、Bash シェルを使用するよう変更するには:
   
# chroot /mnt/arch /bin/bash
+
# chroot /location/of/new/root /bin/bash
   
 
{{Note|
 
{{Note|
 
* {{ic|chroot: cannot run command '/usr/bin/bash': Exec format error}} というエラーが表示される場合、ホスト環境と chroot 環境のアーキテクチャが一致していません。
 
* {{ic|chroot: cannot run command '/usr/bin/bash': Exec format error}} というエラーが表示される場合、ホスト環境と chroot 環境のアーキテクチャが一致していません。
 
* {{ic|chroot: '/usr/bin/bash': permission denied}} というエラーが表示される場合、exec パーミッションを使ってマウントしなおして下さい: {{ic|mount -o remount,exec ''/location/of/new/root''}}。
 
* {{ic|chroot: '/usr/bin/bash': permission denied}} というエラーが表示される場合、exec パーミッションを使ってマウントしなおして下さい: {{ic|mount -o remount,exec ''/location/of/new/root''}}。
  +
** if checking this did not help, then [https://www.tldp.org/LDP/LG/issue52/okopnik.html make sure] the base components of the new enviroment are intact (if it's an Arch root try {{ic|1=paccheck --root=''/location/of/new/root'' --files --file-properties --md5sum glibc filesystem}}, from {{Pkg|pacutils}})
 
}}
 
}}
   

2021年7月22日 (木) 13:03時点における版

関連記事

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

理由

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

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

要件

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

使い方

ノート:
  • 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 を実行するときは第一引数に新しい root ディレクトリを指定します:

# arch-chroot /location/of/new/root

例えば、インストールガイドでは、このディレクトリは /mnt になります。

# arch-chroot /mnt

chroot を終了するには、次のコマンドを使用します

# exit

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

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

# arch-chroot /location/of/new/root mycommand

例えば、chroot から mkinitcpio -p linux を実行して終了するには:

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

chroot を使う

警告: --rbind を使用すると dev/sys/ の一部のサブディレクトリがアンマウントできなくなります。その状態で umount -l でアンマウントを行おうとするとセッションが破壊され、再起動が必要になります。可能であれば -o bind を使ってください。

次の例では、/location/of/new/root は新しいルートが存在するディレクトリです。 まず、一時 api ファイルシステムをマウントします:

# cd /location/of/new/root
# mount -t proc /proc proc/
# mount -t sysfs /sys sys/
# mount --rbind /dev dev/

また、任意で次のコマンドを実行:

# mount --rbind /run run/

UEFI システムを実行している場合は、EFI 変数にもアクセスする必要があります。それ以外の場合、GRUBをインストールすると、次のようなメッセージが表示されます: UEFI variables not supported on this machine:

# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/

次に、chroot 環境でインターネット接続を使用するには、DNS の詳細をコピーします:

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

最後に、/location/of/new/root に chroot し、Bash シェルを使用するように変更するには:

# chroot /location/of/new/root /bin/bash
ノート:
  • chroot: cannot run command '/usr/bin/bash': Exec format error というエラーが表示される場合、ホスト環境と chroot 環境のアーキテクチャが一致していません。
  • chroot: '/usr/bin/bash': permission denied というエラーが表示される場合、exec パーミッションを使ってマウントしなおして下さい: mount -o remount,exec /location/of/new/root
    • if checking this did not help, then make sure the base components of the new enviroment are intact (if it's an Arch root try paccheck --root=/location/of/new/root --files --file-properties --md5sum glibc filesystem, from pacutils)

chroot した後は bash のローカル設定をロードします:

# source /etc/profile
# source ~/.bashrc
ヒント: 必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: # export PS1="(chroot) $PS1"

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

システムで 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

chroot を終了する

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

# exit

そして一時ファイルシステムや root パーティションをアンマウントしてください:

# cd /
# umount --recursive /mnt/arch/
ノート: umount: /path: device is busy のようなエラーが表示される場合、次の可能性があります: chroot 内でまだプログラム (例: シェル) が動いている、またはサブマウントが存在している。プログラムを終了して findmnt -R /location/of/new/root でサブマウントを探して umount してください。umount が上手く通らない場合は umount --force でアンマウントできることがあります。それでも駄目の場合は umount --lazy を使って下さい。解決できない場合はすぐに reboot してください。

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.

参照