「Chroot」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(他言語へのリンクを修正)
 
(4人の利用者による、間の27版が非表示)
1行目: 1行目:
  +
{{Lowercase title}}
 
[[Category:システムリカバリ]]
 
[[Category:システムリカバリ]]
  +
[[Category:サンドボックス]]
[[en:Change root]]
 
  +
[[Category:コマンド]]
[[es:Change root]]
 
  +
[[de:Chroot]]
[[fa:تغییر ریشه]]
 
  +
[[en:Chroot]]
  +
[[es:Chroot]]
 
[[fr:Chroot]]
 
[[fr:Chroot]]
[[ro:Chroot]]
+
[[pt:Chroot]]
[[ru:Change root]]
+
[[ru:Chroot]]
[[zh-hans:Change root]]
+
[[tr:Chroot]]
  +
[[zh-hans:Chroot]]
 
{{Related articles start}}
 
{{Related articles start}}
  +
{{Related|PRoot}}
{{Related|64ビット環境に32ビット環境をインストール}}
 
{{Related|proot}}
 
 
{{Related|Linux Containers}}
 
{{Related|Linux Containers}}
 
{{Related|systemd-nspawn}}
 
{{Related|systemd-nspawn}}
 
{{Related articles end}}
 
{{Related articles end}}
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリと動いているプロセスとその子プロセス群を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。のた ''chroot監獄'' と呼ばれます。
+
[[Wikipedia:ja:chroot|Chroot]] は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。変更され環境は ''chroot監獄'' と呼ばれます。
   
 
== 理由 ==
 
== 理由 ==
23行目: 26行目:
 
* パッケージのアップグレードもしくは[[ダウングレード]]。
 
* パッケージのアップグレードもしくは[[ダウングレード]]。
 
* [[パスワードリカバリ|パスワードの再設定]]。
 
* [[パスワードリカバリ|パスワードの再設定]]。
* chroot でパッケージをビルド[[en2:DeveloperWiki:Building in a Clean Chroot|DeveloperWiki:Building in a Clean Chroot]] を参照。
+
* chroot でパッケージをビルド[[DeveloperWiki:クリーンな chroot 内でビルドする]]を参照。
   
 
[[Wikipedia:ja:Chroot#制限]] も参照。
 
[[Wikipedia:ja:Chroot#制限]] も参照。
33行目: 36行目:
 
* ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: {{ic|# uname -m}}。
 
* ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます: {{ic|# uname -m}}。
 
* chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
 
* chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
* 必要であればスワップを有効にしてください: {{ic|# swapon /dev/sd''xY''}}
+
* 必要であれば[[スワップ]]を有効にしてください: {{bc|# swapon /dev/sd''xY''}}
 
* 必要であればインターネットに接続してください。
 
* 必要であればインターネットに接続してください。
   
  +
== 新しいルートの場所を準備する ==
== パーティションをマウント ==
 
   
chroot する場合 Linux システムの root パーテションを最初にマウンる必要があります。カーネルによって割り当てられた名前を確認するには、次を実行:
+
chroot ターゲットは、ファイルシステム階層を含むデレクリである必要があります。
   
  +
[[インストールガイド]] では、このディレクトリは {{ic|/mnt}} になります。既存のインストールの場合は、既存のパーティションを自分で {{ic|/mnt}} にマウントする必要があります。
# lsblk
 
   
  +
{{ic|lsblk}} を実行し、インストールのパーティションレイアウトをメモします。通常は、{{ic|/dev/sd''XY''}} のようなものになります。NVMe ドライブの場合は {{ic|/dev/nvme0n''X''p''Y''}} になります。
そして root パーティションをマウントするディレクトリを作成してマウントします:
 
   
  +
ファイルシステムをマウントします。
# mkdir /mnt/arch
 
# mount /dev/sdx1 /mnt/arch
 
   
  +
# mount /dev/sd''XY'' /mnt
次に、他のシステムディレクトリ用のファイルシステム (例: {{ic|/boot}}, {{ic|/home}}...) が存在する場合は、それらもマウントします:
 
   
  +
[[EFI システムパーティション]] があり、それに変更を加える必要がある場合 ([[vmlinuz]] または [[Arch ブートプロセス#initramfs|initramfs]] イメージの更新など):
# mount /dev/sdx2 /mnt/arch/boot/
 
# mount /dev/sdx3 /mnt/arch/home/
 
   
  +
# mount /dev/sd''XZ'' /mnt/''esp''
{{Note|[[ディスク暗号化|暗号化]]したファイルシステムにアクセスするときは、まずコンテナのロックを解除してください (例: [[ディスク暗号化#ブロックデバイスの暗号化|dm-crypt/LUKS]] による暗号化をしている場合 {{ic|# cryptsetup open /dev/sdX# ''name''}})。それから device-mapper によって与えられた名前を使ってファイルシステムをマウントしてください ({{ic|# mount /dev/mapper/''name'' /mnt/arch/...}})。詳細: [[Dm-crypt/デバイスの暗号化#デバイスマッパーで LUKS パーティションのロックを解除・マップ|デバイスマッパーで LUKS パーティションのロックを解除・マップ]]。}}
 
   
  +
[[パーティショニング#パーティションを分割する|個別パーティション]] がある場合は、それらもマウントします。
== Change root ==
 
   
  +
次の例では、{{ic|''/path/to/new/root''}} は新しいルートが存在するディレクトリです (例: {{ic|/mnt}})
{{Note|''localectl'' や ''timedatectl'' などの [[systemd]] のツールは [[D-Bus]] の接続が必要なため chroot の中では動作しません [https://github.com/systemd/systemd/issues/798#issuecomment-126568596]。}}
 
  +
  +
== 使い方 ==
  +
  +
{{Note|
  +
* ''hostnamectl''、''localectl'' や ''timedatectl'' などの [[systemd]] のツールは [[D-Bus]] の接続が必要なため chroot の中では動作しません [https://github.com/systemd/systemd/issues/798#issuecomment-126568596]。
  +
* chroot の新しいルート ({{ic|/}}) となるファイルシステムは、アクセス可能でなければなりません(復号化、マウント済み)}}
  +
  +
chroot を使用するには、以下の 2 つの主要なオプションがあります。
   
 
=== 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 を終了するには、次を使用します:
  +
  +
# 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]] など、他のマウント オプションを指定することもできます。}}
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux
 
   
 
=== 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}} を使ってください。}}
   
 
また、任意で次のコマンドを実行:
 
また、任意で次のコマンドを実行:
89行目: 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 /mnt/arch}}。
+
* {{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}} を試してみてください。)
 
}}
 
}}
   
109行目: 155行目:
 
{{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}}
 
{{Tip|必要なら bash のプロンプトに chroot を使っていることをわかるようにできます: {{ic|1=# export PS1="(chroot) $PS1"}}。}}
   
  +
chroot の使用が終了したら、次の方法で終了できます。
=== systemd-nspawn を使う ===
 
   
  +
# exit
systemd-nspawn を使うことで軽量な名前空間コンテナでコマンドや OS を実行することができます。大体は chroot と同じですが、ファイルシステムの階層だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化されるため強力です。
 
   
  +
次に、一時ファイルシステムをアンマウントします。
root パーティションのマウントポイントにディレクトリを移動して、systemd-nspawn を実行してください:
 
   
# cd /mnt/arch
+
# cd /
  +
# umount --recursive ''/location/of/new/root''
# systemd-nspawn
 
 
{{ic|/proc}} などの api ファイルシステムを手動でマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。
 
   
  +
{{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}} してください。}}
終了するには、ログアウトするか poweroff コマンドを実行してください。その後 [[#chroot を終了する]] で説明しているようにパーティションをアンマウントすることができます。
 
   
 
== グラフィカルアプリケーションを動かす ==
 
== グラフィカルアプリケーションを動かす ==
126行目: 170行目:
 
システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。
 
システムで [[Xorg|X]] を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。
   
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます:
+
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、[[xhost]] コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます ([[Xhost]] を参照):
   
 
$ xhost +local:
 
$ xhost +local:
138行目: 182行目:
 
# export DISPLAY=:0
 
# export DISPLAY=:0
   
== chroot終了する ==
+
== root 権限使わない ==
   
  +
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。
システムメンテナンスが終わったら、chroot を終了します:
 
   
  +
=== PRoot ===
# exit
 
   
  +
[[PRoot]] を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに {{ic|mount --bind}} を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には {{ic|--root-id}} 引数があり、''fakeroot'' と同じような方法で制限を回避することができます。
そして一時ファイルシステムや root パーティションをアンマウントしてください:
 
   
  +
=== Fakechroot ===
# cd /
 
# umount --recursive /mnt/arch/
 
   
  +
{{Pkg|fakechroot}} は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで chroot をシミュレートすることができます。
{{Note|{{ic|umount: /path: device is busy}} のようなエラーが表示される場合、次の可能性があります: chroot 内でまだプログラム (例: シェル) が動いている、またはサブマウントが存在している。プログラムを終了して {{ic|mount | grep /mnt/arch}} でサブマウントを探して {{ic|umount}} してください。{{ic|umount}} が上手く通らない場合は {{ic|umount --force}} でアンマウントできることがあります。それでも駄目の場合は {{ic|umount --lazy}} を使って下さい。解決できない場合はすぐに {{ic|reboot}} してください。}}
 
   
  +
# fakechroot fakeroot chroot ~/my-chroot bash
== root 権限を使わない ==
 
   
  +
=== Unshare ===
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。
 
   
  +
{{Pkg|util-linux}} の一部である Unshare を使用して、新しいカーネル名前空間を作成できます。これは通常の chroot コマンドで機能します。 例えば:
=== Proot ===
 
   
  +
$ unshare --map-root-user chroot ~/namespace /bin/sh
[[Proot]] を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに {{ic|mount --bind}} を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には {{ic|--root-id}} 引数があり、''fakeroot'' と同じような方法で制限を回避することができます。
 
   
  +
== ヒントとテクニック ==
=== Fakechroot ===
 
   
  +
=== chroot 検出 ===
{{Pkg|fakechroot}} は chroot コールを傍受して結果を偽装するライブラリです。通常ユーザーで 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] を参照してください。
# fakechroot fakeroot chroot ~/my-chroot bash
 
  +
  +
== トラブルシューティング ==
  +
  +
=== arch-chroot: /location/of/new/root is not a mountpoint. This may have undesirable side effects. ===
  +
  +
{{ic|arch-chroot ''/location/of/new/root''}} を実行すると、警告が発行されます。
  +
  +
==> WARNING: ''/location/of/new/root'' is not a mountpoint. This may have undesirable side effects.
  +
  +
バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、{{man|8|arch-chroot}} を参照してください。
   
 
== 参照 ==
 
== 参照 ==
   
* [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) を参照してください。

参照