chrootコマンドを使う

chrootコマンドは、指定のディレクトリを、ルートディレクトリ(/)に変更するというコマンドです。

 

そのディレクトリを起点 (/) にしてしまったわけですから、元の /bin のコマンド群や /usr/lib のライブラリにはアクセスできません。 「chroot後、シェルを起動してくれ」といっても、新しい仮想的な環境の中に /bin/sh が存在しなければシェルを起動できませんし、プログラムが必要とする実行時ライブラリも入っていなければ起動不可能です。

 

しかし、新しいシステム環境を一から構築し、インストール、実行する場合には便利な機能です。

 

chrootで、起点を変更したあと、何かできなければ意味がありません。 デフォルトではシェルが起動するようになっているようですが、任意のコマンド実行することもできます。 chroot コマンドの形式:

 

chroot  directory  [command  [args] ...]

 

なので、空のディレクトリを作っただけで chroot してもエラーになってしまいます。 また、そのコマンドが必要とする実行時ライブラリ(共有ライブラリ)もなければなりません。 しかし、メモリ効率は無視してでも、単に実行するだけなら、静的リンクでビルドすれば、共有ライブラリ不要で実行可能です。

 

プログラムを静的リンクでビルドするには、gcc コマンドに -static オプションを指定します。

 

gcc  -static  -o program  source.c

 

しかし、glibcの静的ライブラリがシステムにインストールされてないかもしれません(私の場合はそうでした)。 その場合はパッケージマネージャから、glibcライブラリのスタティック版をインストールする必要があります。 VineLinuxでは、以下のようにインストールできました。

 

$  sudo  apt-get  install  glibc-static

 

このようにビルドされたプログラムを適当なディレクトリに配置すれば、chrootで実行可能です。 あと、chrootはスーパーユーザ権限が必要です。

 

$  sudo  chroot  MyDir/  /program

 

これでプログラムは実行されるでしょう。

 

もし、これに物足りなさを感じたら、ファイルシステムのすべてのファイルをコピーするという荒技もあります!