\r\n\r\n
chrootコマンドは、あなたを刑務所に送ったり、開発またはテスト環境を隔離したり、単にあなたのシステムのセキュリティを向上させることができます。最も簡単な使い方を紹介します。
コマンドの有用性を計る場合、そのコマンドが提供する機能と使いやすさを考慮する必要があります。もし、人が使うには複雑すぎたり、使おうとしないほど長かったりすると、機能性もゼロになりかねません。誰も使わなければ、何の機能もない。
Linuxユーザーと直接、あるいはフォーラムで議論していると、chrootコマンドは使いにくいコマンド、あるいは過度に気難しく面倒な設定と認識されているようです。この非常に優れたユーティリティは、あまり使われていないようです。
chroot を使うと、通常のファイルシステムとは相互作用できないラップされたファイルシステムで、プログラムや対話型シェル (Bash など) をセットアップして実行することができます。ルートディレクトリになります。このため、この環境はchroot jailというニックネームで呼ばれています。jail」という用語は、通常のchroot環境よりも安全なchroot環境を作成するFreeBSDのjailコマンドと混同しないようにしましょう。
しかし、実は非常に簡単なchrootの使い方がありますので、順を追って説明します。ここでは、すべてのディストリビューションで動作する通常のLinuxコマンドを使用します。Linuxディストリビューションには、Ubuntuのdebootstrapのように、chroot環境を構築するための特別なツールがあるものもありますが、私たちのディストリビューションは、そのようなことはありません。
chroot環境は、仮想マシンと同様の機能を提供しますが、より軽量なソリューションとなります。キャプチャーシステムでは、VirtualBoxやvirtualmachinemanagerなどの仮想マシン監視プログラムのインストールや設定は必要ありません。また、キャプチャーシステムにカーネルをインストールすることも必要ありません。キャプチャシステムは、既存のカーネルを共有します。
ある意味、chroot環境は、仮想マシンよりもLXCなどのコンテナに近い。軽量で導入が早く、作成と起動を自動化することができます。コンテナと同様に、必要なタスクを実行するのに十分な数のOSをインストールするのが便利な構成方法です。chroot環境の使い方を見て、「何が必要なのか」という問いに答える。
一般的な使い方としては、以下のようなものがあります。
ソフトウェア開発、製品検証。開発者がソフトウェアを書き、製品検証チーム(PV)がそれをテストする。PVでは、開発者のパソコンでは再現できない問題が見つかることもあります。開発者は、一般ユーザーやPVが利用できない様々なツールやライブラリを開発用コンピューターにインストールします。chroot を使用すると、開発者は自分のコンピュータにシンプルなバニラのキャプティブ環境を持つことができ、ソフトウェアを PV で利用できるようにする前に、その環境に浸ることができるようになります。ソフトウェアが必要とする最小限の依存関係でキャプチャ環境を構成することができます。
開発者は、専用の開発環境を構築することで、そこで起きたことが実際のPCを混乱させることがないようにすることができます。
は、使用を推奨されていないソフトウェアが動作しています。時には、古いバージョンのものを実行する必要がある場合もあります。古いソフトウェアのニーズが、お使いのLinuxのバージョンと衝突したり、互換性がない場合、問題のソフトウェアのためにchroot環境を作成することができます。
復旧とファイルシステムのアップグレード:Linuxのインストールが動作しない場合、chrootを使って破損したファイルシステムをlivecd上のマウントポイントにマウントすることができます。これにより、破損したシステムに対して作業を行い、あたかもroot/に正常にインストールされたかのように修復を試みることができます。これは、破損したシステム上の期待されるファイルパスが、livecdのマウントポイントからではなく、ルートディレクトリから正しく参照されることを意味します。Linuxのファイルシステムをext2やext3からext4に移行する方法を説明した記事でも、同様の手法が使われています。
フェンシングの用途。インターネットに接続されたFTPサーバーなどをchroot環境で運用することで、外部からの攻撃による被害を抑えることができます。これは、システムのセキュリティを強化するための重要なステップです。
関連:LinuxでExt2またはExt3ファイルシステムをExt4へ移行する方法
chroot環境のルートとなるディレクトリが必要です。そこで、このディレクトリを参照するための略記法を用意し、変数を作成してそこにディレクトリ名を格納することにします。ここでは、"testroot "ディレクトリへのパスを格納する変数を設定しています。このディレクトリがまだ存在するかどうかは別として、近いうちに作成する予定です。ディレクトリが存在する場合は、空である必要があります。
chr=/home/dave/testrootディレクトリが存在しない場合は、作成する必要があります。このコマンドを使えばいいんです。p (parents)オプションは、見つからない親ディレクトリも確実に作成します。
mkdir -p $chrchroot環境が必要とするオペレーティングシステムの部分を保持するためのディレクトリを作成する必要があります。対話型シェルとしてBashを使用した最小限のLinux環境を構築します。また、touch、rm、lsの各コマンドも含める予定です。これでBashの内蔵コマンドやtouch, rm, lsが使えるようになり、ファイルの作成、一覧、削除ができるようになり、Bashが使えるようになります。この簡単な例では、これだけです。
作成が必要なディレクトリを{}波括弧の拡張子で列挙します。
mkdir -p $chr/{bin,lib,lib64}ここで、ディレクトリを新しいルートディレクトリに変更します。
cd $chr最小限のLinux環境で必要なバイナリを、通常の「/bin」ディレクトリからchrootの「/bin」ディレクトリにコピーしてみましょう。v (verbose) オプションは、コピー操作のたびにcpが何をしているのかを教えてくれます。は、各コピー操作の際に何をしているのかを教えてくれる。
cp -v /bin/{bash,touch,ls,rm} $chr/binでコピーしてもらった書類です。
これらのバイナリーは、依存関係を持ちます。そうしないと、bash、touch、rm、lsは動作しません。これを選択したコマンドごとに順番に行う必要があります。lddコマンドで依存関係をリストアップしてくれるから、暴飲暴食しちゃおう。
ldd /bin/bash依存関係が特定され、ターミナルウィンドウにリストアップされます。
これらのファイルを新しい環境にコピーする必要があります。リストから詳細を選んで一度にコピーするのは時間がかかるし、エラーが発生しやすいものです。
半自動化できるのはありがたい。再び依存関係をリストアップし、今度はリストを形成していきます。そして、そのリストをループしてファイルをコピーしていきます。
ここでは ldd を使って依存関係をリストアップし、その結果を egrep にパイプします。egrep を使うことは、grep と -E (extended regular expression) オプションを使うことと同じです。o (match only) オプションは、出力をマッチした部分のみに制限します。0-9]の数字で終わる、一致するライブラリファイルを探しています。
list="$(ldd /bin/bash | egrep -o '/lib.*\.[0-9]')"echoを使ってリストの中身を確認することができます。
echo $listこのリストができたので、次のようなループを使って、一度に1つのファイルをコピーしながら、段階的にリストを繰り返していくことができます。変数 i を使ってリストを反復する。リストの各メンバーについて、$chrの値であるchrootルートにファイルをコピーします。
v(冗長)オプションは、各コピーが実行されたときにcpに通知させます。-parentsオプションは、欠落している親ディレクトリをchroot環境に作成することを保証します。
for i in $list; do cp -v --parents "$i" "${chr}"; doneこれが出力です。
このテクニックを使って、他のすべてのコマンドの依存関係を捕捉します。実際の複製はループ技法で行うことにする。良いニュースは、依存関係を収集するコマンドに小さな編集を1つ加えるだけで良いということです。
上矢印キーを数回押すことでコマンドヒストリーからコマンドを取り出し、編集することができる。コマンドの周期的なコピーでは、変更は全く必要ない。
ここでは、上矢印キーでコマンドを探し、bashの代わりにtouchに編集しています。
list="$(ldd /bin/touch | egrep -o '/lib.*\.[0-9]')"これで、先ほどと全く同じ循環コマンドを繰り返すことができるようになりました。
for i in $list; do cp -v --parents "$i" "${chr}"; doneで書類をコピーしてもらいました。
lsのlistコマンドラインを編集できるようになりました。
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"ここでも、同じloopコマンドを使います。このコマンドは、どのファイルがリストにあるかは気にせず、リストを通して、やみくもにファイルをコピーしてくれます。
for i in $list; do cp -v --parents "$i" "${chr}"; donels の依存関係も、以下の場所にコピーされています。
最後にもう一度、listコマンドラインを編集して、rmに適用できるようにしました。
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"循環コピーコマンドの最後の使用。
for i in $list; do cp -v --parents "$i" "${chr}"; done最後の依存関係は chroot 環境にコピーされます。ようやくchrootコマンドを使う準備が整いました。このコマンドは、chroot環境のルートを設定し、シェルとして実行するアプリケーションを指定します。
sudo chroot $chr /bin/bashchroot環境がアクティブになりました。ターミナルウィンドウのプロンプトが変更され、インタラクティブシェルは当環境のbashシェルで対応することになりました。
環境に持ち込んだコマンドを試すことができる。
ls ls /home/dave/Documentsこの環境でlsコマンドを使用すると、期待通りに動作する。環境外のディレクトリにアクセスしようとすると、コマンドは失敗します。
touchでファイルを作成し、lsでファイルの一覧を表示し、rmでファイルを削除することができるのです。
touch sample_file.txt ls rm sample_file.txt lsもちろん、bashshellが提供するビルトインコマンドを利用することも可能です。コマンドラインでhelpと入力すれば、Bashがリストアップしてくれます。
helpchroot環境を終了する場合はexitを使用します。
exitchroot環境を削除するには、以下の場所で削除するだけです。
rm -r testroot/これにより、chroot環境内のファイルやディレクトリが再帰的に削除されます。
chroot環境は便利かもしれないが、設定に少し不便を感じるという方は、エイリアスや関数、スクリプトを利用することで、作業を繰り返すストレスやリスクを軽減できることを覚えておいてください。
関連:Linuxでエイリアスやシェル関数を作成する方法