「Chroot」の版間の差分
(同期) |
(同期) |
||
4行目: | 4行目: | ||
[[fa:تغییر ریشه]] |
[[fa:تغییر ریشه]] |
||
[[fr:Chroot]] |
[[fr:Chroot]] |
||
+ | [[pt:Change root]] |
||
[[ro:Chroot]] |
[[ro:Chroot]] |
||
[[ru:Change root]] |
[[ru:Change root]] |
||
[[zh-hans:Change root]] |
[[zh-hans:Change root]] |
||
{{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}} |
||
60行目: | 60行目: | ||
=== arch-chroot を使う === |
=== arch-chroot を使う === |
||
− | Bash スクリプト {{ic|arch-chroot}} は |
+ | Bash スクリプト {{ic|arch-chroot}} は {{Pkg|arch-install-scripts}} パッケージに含まれています。{{ic|/usr/bin/chroot}} を実行する前にこのスクリプトは {{ic|/proc}} などの api ファイルシステムをマウントして chroot から使える {{ic|/etc/resolv.conf}} を作成します。 |
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します: |
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します: |
||
155行目: | 155行目: | ||
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。 |
Chroot は root 権限を必要しますが、場合によっては root 権限が使えないということもありえます。そのようなときは、他の実装によって chroot をシミュレートする方法があります。 |
||
− | === |
+ | === PRoot === |
− | [[ |
+ | [[PRoot]] を使うことで見せかけの root ディレクトリを変更して root 権限を使わずに {{ic|mount --bind}} を使用できます。アプリケーションをディレクトリに閉じ込めたり、別の CPU アーキテクチャでビルドされたプログラムを実行したいときに有用です。ただし、全てのファイルはホスト環境のユーザーによって所有されるため制限が存在します。Proot には {{ic|--root-id}} 引数があり、''fakeroot'' と同じような方法で制限を回避することができます。 |
=== Fakechroot === |
=== Fakechroot === |
2017年12月30日 (土) 20:46時点における版
Chroot は見かけのルートディレクトリ(と動いているプロセスとその子プロセス群)を別のディレクトリに変更する操作です。ルートディレクトリを変更している間はディレクトリ外のファイルやコマンドにアクセスできなくなります。そのため chroot監獄 と呼ばれます。
目次
理由
Chroot を行う主な理由は起動やログインができなくなった時のシステムメンテナンスです。例えば:
- ブートローダーの再インストール。
- initramfs イメージのリビルド。
- パッケージのアップグレードもしくはダウングレード。
- パスワードの再設定。
- chroot でパッケージをビルド。DeveloperWiki:Building in a Clean Chroot を参照。
要件
- chroot を行うには root 権限が必要です。
- 他の Linux 環境からブートする必要があります (LiveCD や USB メディア、別にインストールされたディストリビューションなど)。
- ブートした Linux 環境のアーキテクチャが、chroot しようとしているルートディレクトリのアーキテクチャと一致しているか確認してください (つまり i686 なのか x86_64 なのか)。アーキテクチャの確認は次のコマンドで行えます:
# uname -m
。 - chroot 環境でカーネルモジュールのロードをしたい場合、chroot する前にロードしてください。
- 必要であればスワップを有効にしてください:
# swapon /dev/sdxY
。 - 必要であればインターネットに接続してください。
パーティションをマウント
chroot する場合 Linux システムの root パーティションを最初にマウントする必要があります。カーネルによって割り当てられた名前を確認するには、次を実行:
# lsblk
そして root パーティションをマウントするディレクトリを作成してマウントします:
# mkdir /mnt/arch # mount /dev/sdx1 /mnt/arch
次に、他のシステムディレクトリ用のファイルシステム (例: /boot
, /home
...) が存在する場合は、それらもマウントします:
# mount /dev/sdx2 /mnt/arch/boot/ # mount /dev/sdx3 /mnt/arch/home/
Change root
arch-chroot を使う
Bash スクリプト arch-chroot
は arch-install-scripts パッケージに含まれています。/usr/bin/chroot
を実行する前にこのスクリプトは /proc
などの api ファイルシステムをマウントして chroot から使える /etc/resolv.conf
を作成します。
arch-chroot を実行するときは第一引数に新しい root ディレクトリを指定します:
# arch-chroot /mnt/arch
デフォルトの sh の代わりに bash シェルを起動するには:
# arch-chroot /mnt/arch /bin/bash
chroot から mkinitcpio -p linux
を実行して終了するには:
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux
chroot を使う
一時 api ファイルシステムをマウントします:
# cd /mnt/arch # mount -t proc proc proc/ # mount --rbind /sys sys/ # mount --rbind /dev dev/
また、任意で次のコマンドを実行:
# mount --rbind /run run/
インターネット接続を chroot 環境で使いたい時は、DNS サーバーの設定をコピーします:
# cp /etc/resolv.conf etc/resolv.conf
Bash シェルに chroot するには:
# chroot /mnt/arch /bin/bash
chroot した後は bash のローカル設定をロードします:
# source /etc/profile # source ~/.bashrc
systemd-nspawn を使う
systemd-nspawn を使うことで軽量な名前空間コンテナでコマンドや OS を実行することができます。大体は chroot と同じですが、ファイルシステムの階層だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化されるため強力です。
root パーティションのマウントポイントにディレクトリを移動して、systemd-nspawn を実行してください:
# cd /mnt/arch # systemd-nspawn
/proc
などの api ファイルシステムを手動でマウントする必要はありません。systemd-nspawn はコンテナ環境で新しい init プロセスを起動してそれら全ての面倒を見ます。同じマシンで別の Linux OS を起動するのと似ていますが、仮想マシンではありません。
終了するには、ログアウトするか poweroff コマンドを実行してください。その後 #chroot を終了する で説明しているようにパーティションをアンマウントすることができます。
グラフィカルアプリケーションを動かす
システムで X を動かしているならば、GUI アプリケーションを chroot 環境から起動できます。
chroot 環境を X サーバーに接続するには、X サーバーの中で (つまりログインしているデスクトップから) 端末を開き、xhost コマンドを実行してください、ユーザーの X サーバーに接続する許可を与えます:
$ 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/
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