コンテンツにスキップ

「Chroot」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
Usage: 翻訳
Kgx (トーク | 投稿記録)
他言語へのリンクを修正
 
(3人の利用者による、間の13版が非表示)
3行目: 3行目:
[[Category:サンドボックス]]
[[Category:サンドボックス]]
[[Category:コマンド]]
[[Category:コマンド]]
[[de:Chroot]]
[[en:Chroot]]
[[en:Chroot]]
[[es:Chroot]]
[[es:Chroot]]
[[fa:تغییر ریشه]]
[[fr:Chroot]]
[[fr:Chroot]]
[[pt:Chroot]]
[[pt:Chroot]]
[[ro:Chroot]]
[[ru:Chroot]]
[[ru:Chroot]]
[[tr:Chroot]]
[[zh-hans:Chroot]]
[[zh-hans:Chroot]]
{{Related articles start}}
{{Related articles start}}
16行目: 16行目:
{{Related|systemd-nspawn}}
{{Related|systemd-nspawn}}
{{Related articles end}}
{{Related articles end}}
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリと動いているプロセスとその子プロセス群を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は ''chroot監獄'' と呼ばれます。
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は ''chroot監獄'' と呼ばれます。


== 理由 ==
== 理由 ==
26行目: 26行目:
* パッケージのアップグレードもしくは[[ダウングレード]]。
* パッケージのアップグレードもしくは[[ダウングレード]]。
* [[パスワードリカバリ|パスワードの再設定]]。
* [[パスワードリカバリ|パスワードの再設定]]。
* chroot でパッケージをビルド[[DeveloperWiki:クリーンな chroot 内でビルドする]]を参照。
* chroot でパッケージをビルド[[DeveloperWiki:クリーンな chroot 内でビルドする]]を参照。


[[Wikipedia:ja:Chroot#制限]] も参照。
[[Wikipedia:ja:Chroot#制限]] も参照。
38行目: 38行目:
* 必要であれば[[スワップ]]を有効にしてください: {{bc|# swapon /dev/sd''xY''}}
* 必要であれば[[スワップ]]を有効にしてください: {{bc|# swapon /dev/sd''xY''}}
* 必要であればインターネットに接続してください。
* 必要であればインターネットに接続してください。

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

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

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

{{ic|lsblk}} を実行し、インストールのパーティションレイアウトをメモします。通常は、{{ic|/dev/sd''XY''}} のようなものになります。NVMe ドライブの場合は {{ic|/dev/nvme0n''X''p''Y''}} になります。

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

# mount /dev/sd''XY'' /mnt

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

# mount /dev/sd''XZ'' /mnt/''esp''

[[パーティショニング#パーティションを分割する|個別パーティション]] がある場合は、それらもマウントします。

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


== 使い方 ==
== 使い方 ==
49行目: 69行目:
=== arch-chroot を使う ===
=== arch-chroot を使う ===


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


==== chroot に入る ====
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します:


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


# arch-chroot ''/path/to/new/root''
デフォルトの sh の代わりに bash シェルを起動するには:


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


chroot から {{ic|mkinitcpio -p linux}}実行して終了するには:
==== chroot を終了する ====


chroot を終了するには、次を使用します:
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux

# exit

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

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

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

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

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

=== Btrfs での実行 ===

サブボリュームのある [[Btrfs]] ルートファイルシステムでは、chroot に入る前に、すべてのサブボリュームが [[fstab]] で指定されたとおりに正しくマウントされていることを確認する必要があります。

[[archinstall]] の Btrfs デフォルト設定の例:

{{bc|1=
# mount -o subvol=@ /dev/sd''XY'' /mnt
# mount -o subvol=@home /dev/sd''XY'' /mnt/home
# mount -o subvol=@pkg /dev/sd''XY'' /mnt/var/cache/pacman/pkg
# mount -o subvol=@log /dev/sd''XY'' /mnt/var/log
# mount -o subvol=@snapshots /dev/sd''XY'' /mnt/.snapshots
# mount /dev/sd''XZ'' /mnt/boot
# arch-chroot /mnt
}}

{{Tip|[[Btrfs#Compression|compression]] など、他のマウント オプションを指定することもできます。}}


=== chroot を使う ===
=== chroot を使う ===


chroot を直接実行する場合は、実際の chroot の前に以下の手順が必要です。
{{Warning|{{ic|--rbind}} を使用すると {{ic|dev/}} と {{ic|sys/}} の一部のサブディレクトリがアンマウントできなくなります。その状態で {{ic|umount -l}} でアンマウントを行おうとするとセッションが破壊され、再起動が必要になります。可能であれば {{ic|-o bind}} を使ってください。}}


一時 api ファイルシステムをマウントします:
まず、一時 API ファイルシステムをマウントします


# cd /mnt/arch
# cd ''/path/to/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/

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


また、任意で次のコマンドを実行:
また、任意で次のコマンドを実行:
78行目: 130行目:
# 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''}}。
** もしこれをチェックしても解決しない場合は、新しい環境のベースコンポーネントが無傷であることを [https://www.tldp.org/LDP/LG/issue52/okopnik.html 確認してください] (Arch root の場合は {{Pkg|pacutils}} から {{ic|1=paccheck --root=''/location/of/new/root'' --files --file-properties --md5sum glibc filesystem}} を試してみてください。)
}}
}}


97行目: 154行目:


{{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}}
{{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}}

chroot の使用が終了したら、次の方法で終了できます。

# exit

次に、一時ファイルシステムをアンマウントします。

# cd /
# umount --recursive ''/location/of/new/root''

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


== グラフィカルアプリケーションを動かす ==
== グラフィカルアプリケーションを動かす ==
113行目: 181行目:


# export DISPLAY=:0
# export DISPLAY=:0

== chroot を終了する ==

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

# exit

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

# cd /
# umount --recursive /mnt/arch/

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


== root 権限を使わない ==
== root 権限を使わない ==
143行目: 198行目:
=== Unshare ===
=== Unshare ===


{{Pkg|util-linux}} の一部である Unshare を使用して、新しいカーネル名前空間を作成できます。これは通常の chroot コマンドで機能します。 例えば:
Unshare, part of {{Pkg|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
$ unshare --map-root-user chroot ~/namespace /bin/sh


== ヒントとテクニック ==
== Troubleshooting ==

=== chroot 検出 ===

{{ic|systemd-detect-virt --chroot}} chroot 環境で呼び出されたかどうかを検出します。他の仮想化環境の検出については、{{man|1|systemd-detect-virt}} を参照してください。より広範な議論と従来のツールの使用法については、[https://unix.stackexchange.com/questions/14345/how-do-i-tell-im-running-in-a-chroot how-do-i-tell-im-running-in-a-chroot] を参照してください。

== トラブルシューティング ==


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


Upon executing {{ic|arch-chroot ''/location/of/new/root''}} a warning is issued:
{{ic|arch-chroot ''/location/of/new/root''}} を実行すると、警告が発行されます。


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


バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、{{man|8|arch-chroot}} を参照してください。
See {{man|8|arch-chroot}} for an explanation and an example of using bind mounting to make the chroot directory a mountpoint.


== 参照 ==
== 参照 ==


* [https://help.ubuntu.com/community/BasicChroot Basic Chroot]
* [https://help.ubuntu.com/community/BasicChroot Chroot の基本]

2024年3月21日 (木) 01:02時点における最新版

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

Btrfs での実行

サブボリュームのある Btrfs ルートファイルシステムでは、chroot に入る前に、すべてのサブボリュームが fstab で指定されたとおりに正しくマウントされていることを確認する必要があります。

archinstall の Btrfs デフォルト設定の例:

# mount -o subvol=@ /dev/sdXY /mnt
# mount -o subvol=@home /dev/sdXY /mnt/home
# mount -o subvol=@pkg /dev/sdXY /mnt/var/cache/pacman/pkg
# mount -o subvol=@log /dev/sdXY /mnt/var/log
# mount -o subvol=@snapshots /dev/sdXY /mnt/.snapshots
# mount /dev/sdXZ /mnt/boot
# arch-chroot /mnt
ヒント compression など、他のマウント オプションを指定することもできます。

chroot を使う

chroot を直接実行する場合は、実際の chroot の前に以下の手順が必要です。

まず、一時 API ファイルシステムをマウントします。

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

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

# 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
    • もしこれをチェックしても解決しない場合は、新しい環境のベースコンポーネントが無傷であることを 確認してください (Arch root の場合は pacutils から paccheck --root=/location/of/new/root --files --file-properties --md5sum glibc filesystem を試してみてください。)

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

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

chroot の使用が終了したら、次の方法で終了できます。

# exit

次に、一時ファイルシステムをアンマウントします。

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

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

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

util-linux の一部である Unshare を使用して、新しいカーネル名前空間を作成できます。これは通常の chroot コマンドで機能します。 例えば:

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

ヒントとテクニック

chroot 検出

systemd-detect-virt --chroot chroot 環境で呼び出されたかどうかを検出します。他の仮想化環境の検出については、systemd-detect-virt(1) を参照してください。より広範な議論と従来のツールの使用法については、how-do-i-tell-im-running-in-a-chroot を参照してください。

トラブルシューティング

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

arch-chroot /location/of/new/root を実行すると、警告が発行されます。

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

バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、arch-chroot(8) を参照してください。

参照