「Chroot」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→chroot を使う: 英語版より記事を転載) |
Kusanaginoturugi (トーク | 投稿記録) (== chroot を終了する == を削除。Note を差し替え) |
||
126行目: | 126行目: | ||
# umount --recursive ''/location/of/new/root'' |
# umount --recursive ''/location/of/new/root'' |
||
− | {{Note| |
+ | {{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}} してください。}} |
== グラフィカルアプリケーションを動かす == |
== グラフィカルアプリケーションを動かす == |
||
143行目: | 143行目: | ||
# 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 権限を使わない == |
2021年9月22日 (水) 10:47時点における版
Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。この変更された環境は chroot監獄 と呼ばれます。
目次
理由
Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば:
- ブートローダーの再インストール。
- initramfs イメージのリビルド。
- パッケージのアップグレードもしくはダウングレード。
- パスワードの再設定。
- chroot でパッケージをビルド。DeveloperWiki:クリーンな chroot 内でビルドするを参照。
要件
- chroot を行うには root 権限が必要です。
- 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。
- ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます:
# uname -m
。 - chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
- 必要であればスワップを有効にしてください:
# swapon /dev/sdxY
- 必要であればインターネットに接続してください。
使い方
chroot を使用するには、以下の 2 つの主要なオプションがあります。
arch-chroot を使う
Bash スクリプト arch-chroot
は arch-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 を使う
次の例では、/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 した後は bash のローカル設定をロードします:
# source /etc/profile # source ~/.bashrc
When finished with the chroot, you can exit it via:
# exit
Then unmount the temporary file systems:
# cd / # umount --recursive /location/of/new/root
グラフィカルアプリケーションを動かす
システムで 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, 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.