FreeBSD jail

FreeBSD jailはOSレベル仮想化機構実装の一つである。jailを使うと、管理者がFreeBSDベースの計算機システムをjailと呼ばれる独立した小さなシステムに分割できるようになる。

FreeBSD jailは、レンタルサーバ業者が業者の提供するサービスと顧客のサービスとを分離するのによく使われる。
このように分離することで安全性を確保し、管理の手間を軽減できる。
サーバデーモンの設定レベルで分離するのと違い、jailからは自分に割り当てられたファイルシステムおよびプロセス空間しか扱えないようになっている。

jailの利点 
FreeBSD jailには主に次の3つの利点がある。

 仮想化: 各jailはホストマシン上で動く仮想機械であり、独自のファイルシステムやプロセス空間、ユーザーアカウントを持つ。jailの中のプロセスからは実際のシステムなのかjailの中なのかはほぼ区別できない。
 安全性: 各jailは他のjailにアクセスできないようになっており、安全性が高まっている。
 権限委譲の簡素化: 管理者権限のスコープがjail内に制限されているため、システムの管理者は本来管理者権限が必要な仕事を、計算機全体を操作する権限を渡すことなく行わせることが出来る。

jailのやり方は従来のUnixでプロセスのスコープを制限するのに使われるchroot jailに似ている。FreeBSD jailはこれを強化したもので、各プロセスは他のjailで動いているプロセスに干渉したり、raw socketやdivert socket、routing socketを操作したりできないよう、特別なカーネル構造体を用いて管理してある。

jail(8)ユーザーランドコマンドとjail(2)システムコールはFreeBSD 4.0で登場した。jailの取り扱いを簡単にする新しいユーザーランドコマンド (たとえば、jailの一覧を出すjls(8))やシステムコール (たとえば、jailに新しいプロセスを追加するjail_attach(2))はFreeBSD 5.1から追加された。

jailの作り方 
FreeBSD jailの利用は次のように簡単に行える。

 /usr/jailのようにjailの中でrootディレクトリ (つまり、/) となるディレクトリを作る。
 jailの中で動かすプログラムやファイルを投入する (典型的には、/usr/jail/binにシェルを置いたり、procfsを/usr/jail/procfsにマウントしたりする)。jail(8)のオンラインマニュアルには、make world DESTDIR=/usr/jailとmake distribution DESTDIR=/usr/jailでこの作業を行うことが出来ると書いてあるが、必ずしもこの方法をとる必要はない。
 /usr/jail/devにdevfsをマウントする。(デバイスノード無しでも動作するが、非常に制限が強い)
 最後に、jailコマンドでjail内のshを使って/etc/rc initスクリプトを"仮想的に"起動する (例 jail /usr/jail hostname 10.0.0.22 /bin/sh /etc/rc)。

こうすることで、jailのコンテキストでいくつかのプロセスが実行される。そして、中で起動したプロセスはjailの中のプロセスの操作しかできず、jailのルートファイルシステムとして指定されたファイルシステム (ここでは、/usr/jail) の外にあるファイルをアクセスできなくなる。

jailを使い始めるときはjail(8)のオンラインマニュアルが参考になる。

同様の技術 
OSレベルの仮想化技術にはこのほかにOpenVZ/Virtuozzo, Linux-VServer, Solaris Containers, FreeVPS, LXCがある。

外部リンク 
 Jails: Confining the omnipotent root
 jail(8) man page
 FreeBSD jails at ONLamp
 A jail administration framework ezjail
 Jail on FreeBSD 6
 FreeBSD Handbook: Jails

FreeBSD
仮想化