連載
» 2012年07月20日 10時00分 UPDATE

FreeBSDのコレ知ってる?(2):軽量仮想化機能「chroot」と「jail」 (1/2)

現在主流の仮想化技術は、ハードウェアをソフトウェアで仮想化する方法を採用していますが、そこまで仮想化する必要がないケースもあります。そんな時に便利な2つのリソース・コンパートメント機能を紹介します。(編集部)

[後藤大地,@IT]

非ハイパーバイザ型の仮想化機能

 ハイパーバイザタイプの仮想化技術からアプリケーションとして動作する仮想化技術まで、現在はさまざまな仮想化技術が活用されている。メニーコアの時代に入るに従い、こうした仮想化技術はますます活躍の場を広げることになるものとみられる。

 しかしながら、マルチコアを備えた強力なマシンが出回る以前の段階から、こうした仮想化技術は利用されていた。現在主流の仮想化技術はハードウェアをソフトウェアで仮想化するという方法を採用しているが、実際にはそこまで仮想化する必要がないケースもある。

 今回はそうした仮想化技術の1つとして、最も基本となるchroot(8)を紹介するとともに、chroot(8)の仮想化機能をさらに推し進めたjail(8)を紹介する。これらの技術は簡単に利用できるので、実際にコマンドを試しながら、その効果や感触をつかんでもらえればと思う。

リソース・コンパートメント(資源隔離)による仮想化

 例えば、現在複数のUNIXマシンでさまざまなサービスを提供しており、これを1台のマシンに集約したいケースを考える。

 単純に考えれば、ハイパーバイザタイプの仮想化ソリューションを導入して、物理マシンを1ゲストOSとして仮想環境で動作させればよいとなる。特に管理の手間がいらないというのであれば、VirtualBoxにそれぞれゲストOSを追加して運用、というスタイルでも十分だろう。

 しかし、そのレベルで仮想化しなくても、複数のサービスを1台のマシンに集約することはできる。UNIXではリソースは基本的にファイルとしてアクセスする仕組みになっている。つまり、アクセスできるファイルを制限してやれば、動作しているサービスから見て、その違いに気が付かないようにすることができる。

 chroot(2)はこれを実施するための機能(システムコール)だ。chroot(2)を実行すると、ルートパスが指定されたパスに置き換わり、それ以上上部のパスにはアクセスできなくなる。これでサービスを特定のファイル名前空間に隔離することができる。chroot(2)はchroot(8)コマンドを使って利用できる。

chroot(8)で使うファイルを用意

 早速chroot(8)を使ってみよう。まず次のように/chroot/a/というパスに、現在動作しているシステムから最低限必要となるファイルをコピーする。

# mkdir -p /chroot/a
# cp -Rp /bin /sbin /lib /libexec /usr /var /etc /chroot/a/

 デバイスファイルも必要になるので、次のように作成してマウントする。

# mkdir /chroot/a/dev
# mount -t devfs devfs /chroot/a/dev

 これでchroot向けの閉じた空間の準備ができたので、次のようにchroot(8)を実行して/chroot/a/bin/shを/chroot/a/に閉じ込めた状態で起動する。

# chroot /chroot/a /bin/sh

 こうやって起動されたshは/chroot/a/より上のパスにはアクセスできない。shからは/chroot/a/が/として見えるようになる。

名前空間を隔離して上のパスへのアクセスを制限

 ファイルシステムの名前空間が隔離されていることを確認してみよう。まず、chrootに入っていない状態で、次のように/testというファイルを作成する。

# ps
  PID  TT  STAT    TIME COMMAND
 1021  v0  Is   0:00.00 login [pam] (login)
 1029  v0  I+   0:00.03 -csh (csh)
 1022  v1  Is+  0:00.00 /usr/libexec/getty Pc ttyv1
 1023  v2  Is+  0:00.00 /usr/libexec/getty Pc ttyv2
 1024  v3  Is+  0:00.00 /usr/libexec/getty Pc ttyv3
 1025  v4  Is+  0:00.00 /usr/libexec/getty Pc ttyv4
 1026  v5  Is+  0:00.00 /usr/libexec/getty Pc ttyv5
 1027  v6  Is+  0:00.00 /usr/libexec/getty Pc ttyv6
 1028  v7  Is+  0:00.00 /usr/libexec/getty Pc ttyv7
 1132   0  S    0:00.00 su -l
 1133   0  S    0:00.01 -su (csh)
 1138   0  R+   0:00.00 ps
# touch /test
# ls /test
/test
#

 次にchroot(8)で/chroot/a/に閉じ込めたshから/testを確認してみる。そうすると/testは存在しないというメッセージが出力される。chrootされた状態のshから/testにアクセスしても、実施には/chroot/a/testにアクセスしており、そのようなファイルは存在しないため、このメッセージが出力される。

# ps
  PID  TT  STAT    TIME COMMAND
 1021  v0  Is   0:00.00 login [pam] (login)
 1029  v0  I+   0:00.03 -csh (csh)
 1022  v1  Is+  0:00.00 /usr/libexec/getty Pc ttyv1
 1023  v2  Is+  0:00.00 /usr/libexec/getty Pc ttyv2
 1024  v3  Is+  0:00.00 /usr/libexec/getty Pc ttyv3
 1025  v4  Is+  0:00.00 /usr/libexec/getty Pc ttyv4
 1026  v5  Is+  0:00.00 /usr/libexec/getty Pc ttyv5
 1027  v6  Is+  0:00.00 /usr/libexec/getty Pc ttyv6
 1028  v7  Is+  0:00.00 /usr/libexec/getty Pc ttyv7
 1132   0  I    0:00.00 su -l
 1133   0  S    0:00.01 -su (csh)
 1146   0  S    0:00.00 /bin/sh
 1147   0  R+   0:00.00 ps
# ls /test
ls: /test: No such file or directory
#

 もう1つ、ps(1)コマンドの出力に注目してほしい。chrootに入る前とchrootに入った後とで同じプロセス一覧が見えていることが確認できる。chroot(2)はファイルシステムの名前空間を隔離するための機能であり、ほかの要素は隔離しない。つまり、同じプロセスリストが見えるし、ユーザーIDやネットワークインターフェイスも共通だ。

 ファイルシステムの名前空間を隔離するというのは、仕組みとして分かりやすい。ほかのリソースは共有するため、仮想化機能としてよりも、セキュリティ強化の目的で使われることが多い。こうしたアプローチはハイパーバイザなどのアプローチと比較してコストが低く、軽量・高速に動作するという特徴がある。

Index

連載:FreeBSDのコレ知ってる?

 第2回 軽量仮想化機能「chroot」と「jail」能

Page 1
 非ハイパーバイザ型の仮想化機能
 リソース・コンパートメント(資源隔離)による仮想化
 chroot(8)で使うファイルを用意
 名前空間を隔離して上のパスへのアクセスを制限

Page 2
 chroot(2)とよく似ているjail(2)の利用手順
 ファイルシステムの名前空間以外も隔離できるjail
 さらに隔離機能の強化が進むjail


       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。