目標は、ホストLinuxシステム内の置き換えられた(再配置された)ディストリビューション(/がグローバル/と一致してはならない)にプログラムをインストールして実行することです。プログラムは、別の/を使用するようには適合されていません。
fakechrootは、システムコールのレベルで動作する代わりにライブラリ置換を採用しているため、完全なソリューションではありません(したがって、静的にリンクされたバイナリには適していません)。
解決策は、おそらくptraceまたは namespaces(unshare) のいずれかに基づいている必要があります。
ptraceベースのソリューションは、おそらく名前空間/非共有ベースよりも効率が低くなります(ただし、後者のテクノロジは最先端であり、十分に検討されていない可能性があります)。
Ptrcedベースのソリューションに関しては、 https://stackoverflow.com/a/1019720/94687 のコメントのおかげで、UMViewを発見しました:
リンクされたドキュメントでは、ホストfsの「コピーオンライトビュー」を作成する方法について説明しています。これは、chrootを実行するのとまったく同じではありません。 umviewで/ -substitutionを達成する方法についての正確な説明は、私の質問への回答に含まれていると便利です(これを行う方法がわかったら、1つ書いてください!)。
umviewはUbuntuとDebianに含まれているため、オープンソースである必要があります-- http://packages.ubuntu.com/lucid/umview 。
別の実装については、 http://www.cs.vu.nl/~rutger/publications/jailer.pdf 、 http://www.cs.vu.nl/~)で説明されています。 guido/mansion/publications/ps/secrypt07.pdf 。
それらには、ルート変更ポリシールールCHRDIRがあり、その効果はchrootと同様です。 (セクション「投獄方針」)
ただし、ソースコードを公開していない可能性があります(部分的に変更されたstraceに基づいています http://www.liacs.nl/~wichert/strace/ -セクション「実装」)...
Geordi( http://www.eelis.net/geordi/ 、 https://github.com/Eelis/geordi )は、おそらく、必要な書き換えを行うために変更できます。投獄されたプログラムのシステムコールへのファイル引数の。
PRoot は、このためにすぐに使用できるptraceベースのツールです。 http://proot.me/ :
chroot相当
特定のLinuxディストリビューション内でコマンドを実行するには、ゲストrootfsへのパスをprootに指定し、その後に目的のコマンドを指定します。以下の例では、プログラムcatを実行して、ファイルの内容を出力します。
proot -r /mnt/slackware-8.0/ cat /etc/motd Welcome to Slackware Linux 8.0
何も指定されていない場合、デフォルトのコマンドは/ bin/shです。したがって、インタラクティブシェルとそのすべてのサブプログラムを制限する最短の方法は次のとおりです。
proot -r /mnt/slackware-8.0/ $ cat /etc/motd Welcome to Slackware Linux 8.0
Linuxカーネルでのuser_namespacesのサポート 質問があったときから、より成熟しています。これで、次のようにchroot
を使用して、通常どおりunshare
を実行して遊ぶことができます nshareでchrootをシミュレート :
unshare --user --map-root-user --mount-proc --pid --fork
chroot ......
su - user1
ser-Mode Linux を試すことができます。このようなカーネルをビルドするためのコードは現在主流のソースにあり、リンクしたページで(古い)プリコンパイル済みビルドを見つけることができます。