Chroot と仮想マシンの違い
一見すると、chrootは仮想マシンやdockerのようなコンテナ化されたシステムに似ていると考えることができます。ある意味似ていますが、chroot は仮想マシンに比べてずっと軽いソリューションです。仮想マシンは、ホストマシンとは別のカーネルをインストールし、そこで動作させるためのハイパーバイザーが必要です。chroot は仮想マシンとは異なり、同じカーネルとプロセスを共有しますが、ファイルシステム内に jail を作成します。jailの内部では、root権限がないと外部を見ることができない。したがって、隔離されたファイルシステムは、chroot jail とも呼ばれます。
Chroot のさまざまな使用例
- CI/CDパイプラインにおける孤立したビルド環境。Chroot は、CI/CD パイプラインにおいて、アプリケーションのための隔離されたビルド 環境を作成するために使用されます。これは、独自の依存関係を持つアプリケーションを構築するのに役立ち、潜在的な競合を取り除くために、他のすべてのビルド環境から完全に分離されます。
- 開発環境とテスト環境の分離: 開発者のマシンでは動作するソフトウェアが、エンドユーザーのデバイスでは動作しないことがよくあります。これは、開発者が多くのツールや依存関係をシステムにインストールしているためです。普通の人は、自分のマシンにそれらの依存関係をすべてインストールしているわけではありません。ソフトウェアがすべてのデバイスで動作するかどうかをテストするために、開発者やテスターは chroot を使ってプレーンバニラ環境を簡単に作成することができます。
-
- 開発者のリスク軽減: 開発者のリスクを軽減する**:開発者である私たちは、しばしば、適切なサンドボックス化なしにシステムファイルと相互作用するプログラムを作成します。このようなリスクを低減するため、開発者向けには、サンドボックス化されていないシステムファイルを操作するプログラムを作成します。このようなリスクを減らすために、開発者はしばしばchrootを使って新しい作業環境を作り、データを失うリスクを減らしています。
- 同じソフトウェアの異なるバージョン。時には、開発目的のために、あるソフトウェアや依存関係の非常に古いバージョンまたは非常に新しいバージョンをインストールする必要があります。しかし、そのような競合する依存関係を使用すると、システムを混乱させる可能性があります。この状況は、chroot jailを使用することによって簡単に克服することができます。
-
- 壊れたシステムを修正する。もし、壊れたシステムがあれば、chroot の助けを借りて、簡単に修復することができます。デバイスでライブ Linux 環境を起動し、ファイルシステムをマウントするだけです。このマウントポイントを使用して、問題を解決するために様々なコマンドを実行することができます。これについては、このチュートリアルでさらに後述します。
-
- FTPサーバーを安全に実行する。FTPは、ファイル転送プロトコルの略です。FTPサーバーを実行すると、あなたが望んだファイルのみを共有する制御ができます。したがって、遠隔のピアはあなたのホストファイルシステムを見ることができず、それらにアクセスすることができません。
Chroot 環境の作成
これは、あなたのシステムに chroot 環境を作成するためのクイックガイドです。詳細な情報は arch wiki で得られます。
-
- chroot 環境を作るには、home フォルダの中に新しいディレクトリを作成し ます。このフォルダの中に、私たちの孤立したファイルシステムが今後存在することになります。このチュートリアルでは、このフォルダを “mte” と名付けました。
mkdir ~/mte
- 非常に最小限のLinux環境を構築しています。chroot環境内にシェルとして
bash
をインストールし、ファイルの一覧、削除、作成のためにそれぞれls
、rm
、touch
をインストールします。mteディレクトリの中に必要なディレクトリを作成しましょう。
cd ~/mte
mkdir bin
mkdir lib
mkdir lib64
- 通常のbinディレクトリから、必要なバイナリをchroot環境の~/mteにコピーします。
cp /bin/bash ~/mte/bin
cp /bin/touch ~/mte/bin
cp /bin/ls ~/mte/bin
cp /bin/rm ~/mte/bin
- バイナリをコピーするだけでは十分ではありません。バイナリをコピーするだけでは不十分で、その依存関係を mte フォルダにコピーする必要があります。必要な依存関係を知るには、
ldd
コマンドを使用します。bashの依存関係を知りたい場合は、次のように実行します。
ldd /bin/bash
上記のコマンドを実行すると、以下のような出力が得られます。
5. これらの依存関係をリストアップし、1つずつコピーしていくのは、骨の折れるほど時間がかかり、退屈です。そこで、この作業を自動化するために、bashスクリプトを使用します。copydependancy.sh “というファイルを作成し、その中に以下のシェルコマンドを記述してください。#chrootディレクトリの設定
mte="~/mte"
#バイナリ名を入力
echo -e "バイナリ名を入力してください♪ \n"
#端末の入力から読み込む
バイナリ名を読み込む
#依存関係を全てリストアップする
list="$(ldd /bin/$binaryname | egrep -o '/lib.\.[0-9]')".
# 依存関係リストをループする
for i in $list; do cp -v --parents "$i" "${mte}"; done
このスクリプトが何をするのかを見てみましょう。まず、このシェルスクリプトはバイナリ名を尋ねて、このバイナリ名からそのバイナリの依存関係をすべて見つけ出し、リスト変数に保存します。次に、リストの各項目で実行されるforループを実行し、依存関係を通常の「/bin」ファイルから「mte」chrootディレクトリにコピーします。
このスクリプトをどこかに保存しておき、新しい chroot 環境を作成するときに参照してください。 次に、このスクリプトのパーミッションを変更し、ターミナル内で実行します。chmod +x copydependancy.sh
- すべての依存関係がシステムにインストールされたので、chroot 環境を有効にしましょう。標準的な chroot コマンドは以下のようなものです。
chroot [-OPTION] [PATH FOR NEW ROOT] [PATH FOR SERVER] (新しいルートのパス) [サーバーのパス] (サーバーのパス)
しかし、今回の目的を達成するために、以下のコマンドを実行して chroot 環境を有効にします。
sudo chroot ~/mte /bin/bash
上記のコマンドは、「~/mte」ディレクトリのchroot環境を有効にし、bashシェルを実行するように指定します。ターミナルのプロンプトに変化が現れ、touch
, rm
, ls
コマンドでそれぞれファイルの作成、削除、リストアップができるようになりました。
chroot 環境を抜けるには、exit
コマンドを実行してください。
rm -rf ~/mte
Chroot を使って壊れたブートローダを修正する
chroot の最も魅力的な点は、壊れたシステムの中に入って、その中でコマンドを実行できることです。従って、chroot を使えば、システムを修正するために重要な更新をインストールしたり、問題を解決するためにブートローダ全体を再インストールしたりすることが簡単にできます。
しかしそのためには、ライブのLinux環境が必要です。Linux の ISO をダウンロードしてブータブル USB を作り、その USB からブートしてください。これで作業するためのライブ環境を手に入れることができます。chroot で作業するためにシステムパーティションをマウントしてください。sudo mount -t ext4 /dev/sda /mnt
dev/sda” を作業したいシステムパーティション名に変更して、grub bootloader がブートローダの問題を解決するために必要な情報を見つけられるようにします。
sudo mount --bind /dev /mnt/dev && (日本語)
sudo mount --bind /dev/pts /mnt/dev/pts &&.
sudo mount --bind /proc /mnt/proc &&.
sudo mount --bind /sys /mnt/sys
mnt “ディレクトリにchrootして、壊れたシステムに入りましょう。
sudo chroot /mnt
システムに grub ブートローダをインストールし、チェックし、更新してください。適切なドライブ名を使うようにし、これらのコマンドをやみくもにコピーペーストしないようにしましょう。
grub-install /dev/sda
grub-install --recheck /dev/sda
更新-grub
先程の exit コマンドでシェルを終了します。先にバインドしていたディレクトリのバインドを解除し、ファイルシステムをアンマウントします。これらのコマンドを順次実行します。
sudo umount /mnt/sys &&.
sudo umount /mnt/proc &&.
sudo umount /mnt/dev/pts &&.
sudo umount /mnt/dev &&.
sudo umount /mnt
PCを再起動し、ライブUSBを抜きます。コンピュータが起動すると、あなたの grub ブートローダは新品のように輝き、すべてが完璧に動作するはずです。
よくある質問
Chroot は安全ですか?
Chroot はセキュリティを意味するものではありません。Chroot はセキュリティを意味するものではありませんし、そうなることを意図したものでもありません。セキュリティに関しては、SELinux を使うことができます。chroot ディレクトリの中に誰かを入れると、その人は root ファイルシステムにアクセスできなくなりますが、それでシステムが壊れなくなるわけではありません。chroot は、セキュリティが低いということではありません。それ以上でも以下でもありません。
Chroot システムの制限事項とは何ですか?
Chroot システムは、root ユーザーによる意図的な改ざんから保護するためのものではありません。システムによっては、chrootされたプログラムが十分な権限を得て、独自のchroot環境を作り、chroot jailから脱走することがあります。chrootは、完全な隔離を意味するものではありません。通常、ユーザースペースでやりたいことは何でもできます。ハードウェアデバイスにアクセスし、他のプログラムをインストールする必要がなければ、何でもマウントして読むことができます。その場合、持っていないroot権限が必要になります。
Chrootはなぜjailと呼ばれるのですか?
Chrootは、まるで隔離された環境の中にいるようなので、jailと呼ばれています。このjailの中では好きなことができますが、rootユーザーの許可がないと出ることができません。また、rootユーザーから提供されるユーティリティには限りがあり、自分で何かをインストールすることもできません。これらの制限のために、chroot jailと呼ばれています。