FreeBSD 8.0-RELEASE

本稿が掲載されるころにはメジャーバージョンアップとなるFreeBSD 8.0-RELEASEが公開されているか、遅れても数日中にはリリースされる見通しになっている。8.0はタイムスケジュール的にはそれほど注目に値するリリースになる予定ではなかったが、最終的に重要な機能が追加された注目すべきメジャーアップブレードバージョンとなった。

本稿では、特にユーザが違いを実感しやすいところに焦点をあてて、FreeBSD 8.0で注目される新機能と、現在の取り組み、アップグレード時の注意事項を紹介する。なお執筆時点ではRELEASE版がでていないため、RC版で動作を確認している。RELEASE版と違いがある可能性もある。

ネットワークスタックの仮想化"Vimage Jail"

FreeBSD 8.0で導入された機能のうちもっとも注目に値するものがVimageだ。FreeBSDはこれまでOS全体でひとつのネットワークスタックを提供してきた。たとえばJailを使ってFreeBSDの上に仮想のホストを1,000個作った場合、それらのルーティングは1つのルーティングテーブルで処理される。

FreeBSD 8.0ではネットワークスタックが仮想化され、個別にネットワークスタックを持てるようになった。簡単にいうと、Jailごとに独立したネットワークスタックが作れるようになる。たとえばJailを1,000個作ったとすると、それぞれのJailにそれぞれネットワークスタックを作ることができる。ホストのルーティングテーブルはJailのルーティングテーブルには影響しない。FreeBSD上にまったく独立したネットワークを構築できるようになる。FreeBSDプロジェクトではこのネットワークの仮想化機能をVimageと呼んでいる。

リスト1

options         VIMAGE
nooptions       SCTP

Vimageはもともとネットワークプロトコルの研究開発用にFreeBSD 4の時代に開発されたもの。FreeBSDの内部で独立したネットワークを構築できれば設計したネットワークプロトコルの動作検証を簡単に実施できる。8.0にマージされたVimageは実験的な機能と位置づけられているため、試してみるには上記オプションを追加してカーネルを再構築する必要がある。また、ほかのネットワーク機能と組み合わせた動作検証や負荷試験もそれほど広く実施されているわけではないため、本番環境で使うなら十分な試験をする必要がある。

Vimageに対応したJailを構築するには、jail(8)コマンドに「-c vnet」オプションを指定する。このオプションはまだマニュアルには記載されていないので注意が必要だ。

プロンプト1

mycom# jail -c vnet path=/ persist
mycom# jail -c vnet path=/ persist
mycom# jail -c vnet path=/ persist
mycom# jls
   JID  IP Address      Hostname                      Path
     1  -                                             /
     2  -                                             /
     3  -                                             /
mycom# jls -s
enforce_statfs=2 host=new ip4=inherit ip6=inherit jid=1 name=1 path=/ persist securelevel=-1 vnet=new allow.set_hostname host.domainname="" host.hostid=0 host.hostname="" host.hostuuid=00000000-0000-0000-0000-000000000000
enforce_statfs=2 host=new ip4=inherit ip6=inherit jid=2 name=2 path=/ persist securelevel=-1 vnet=new allow.set_hostname host.domainname="" host.hostid=0 host.hostname="" host.hostuuid=00000000-0000-0000-0000-000000000000
enforce_statfs=2 host=new ip4=inherit ip6=inherit jid=3 name=3 path=/ persist securelevel=-1 vnet=new allow.set_hostname host.domainname="" host.hostid=0 host.hostname="" host.hostuuid=00000000-0000-0000-0000-000000000000
mycom#

これ以外にも8.0ではJailに対して複数のIPv4/IPv6を割り当てたり、まったくIPを割り当てないで作成することが可能。Jailの中にJailを作るという階層化Jailも実現されている。ネットワークスタックの整理が進められ、IPv4をサポートせずにIPv6だけサポートしたカーネルを構築するといったこともできる。ルーティングテーブルを複数保持することもできるVimageとこれら機能を組み合わせると、1台のFreeBSDサーバでかなり高度なルータとしての機能を実現できる。

仮想ペアネットワークインタフェース"epair(4)"

Vimageの導入に合わせてepair(4)というネットワークインタフェースが導入された。これはL2でループバックするネットワークインタフェースのようなもので、生成すると対になった2つのネットワークインタフェースが作られる。Vimage Jail間やVimage JailとホストOSをepair(4)で接続することでネットワークを構築するというのが、Vimage Jailの基本的な使い方となる。

プロンプト2

mycom# ifconfig epair create
epair0a: Ethernet address: 02:c0:a4:00:03:0a
epair0b: Ethernet address: 02:c0:a4:00:04:0b
epair0a
mycom# ifconfig epair create
epair1a: Ethernet address: 02:c0:a4:00:05:0a
epair1b: Ethernet address: 02:c0:a4:00:06:0b
epair1a
mycom# ifconfig epair create
epair2a: Ethernet address: 02:c0:a4:00:07:0a
epair2b: Ethernet address: 02:c0:a4:00:08:0b
epair2a
mycom#

プロンプト3

mycom# jexec 1 ifconfig -a
lo0: flags=8008<LOOPBACK,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
mycom# ifconfig epair0a vnet 1
mycom# jexec 1 ifconfig -a
lo0: flags=8008<LOOPBACK,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
epair0a: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 02:c0:a4:00:03:0a
mycom#

epair(4)が提供するのは1対1の接続だ。複数の接続、たとえばホストがハブで接続されているような状況はepair(4)だけでは実現できない。そうした場合はif_bridge(4)ネットワークインタフェースでブリッジの役目をこなすインタフェースを作成し、そのインタフェースにepair(4)の片方を追加していけばいい。

Vimage Jailスケーラビリティとメリット

Vimage Jailはかなり軽量な仮想化機能だ。最小の構成で作った場合、数百キロバイトほどのカーネルメモリの消費で構築が可能。i386版でデフォルトのカーネル設定のままでも、1GBのメモリを搭載した環境で700くらいまでは問題なく作れる。搭載するメモリの量を増やしたり、設定を調整すれば数千ホストくらいは作成できる。

これはフル仮想化システムやハイパーバイザを利用するエンタープライズ向けの仮想化プラットフォームを使うのと比べて大きなメリットとなる。特に仮想システム間のネットワーク接続を利用して仮想的なネットワークを構築するような用途では、Viamge Jailの軽量さはそのままハードウェアへの投資を抑えつつ、必要になる環境を構築できるという点で興味深い。

Vimage Jailユースケース

もともとネットワークプロトコルの研究開発用に開発された機能なだけに、そうした研究用途にはVimage Jailは適している。それ以外にも独立したネットワークや、独立した複数のホストが必要なケースで活用できる。たとえばネットワークを構築する場合、想定しているネットワークをVimage Jailで構築して動作検証をするというのは簡単で効果的な方法だ。実際にDNSの動作を検証したりアカウント管理システム、ファイルサーバやWebアプリケーションのデプロイなど、想定するネットワークと同じネットワークを構築することで実際にデプロイしなければ分かりにくい問題を先に発見できる。

Jailはファイルシステム、メモリ空間、プロセス空間を分離する。今回ここにネットワークスタックも分離対象として加わることになる。ファイルシステムまで分離すれば堅牢な仮想ホストを作れるものの、メンテナンスが面倒という側面もある。ある程度割り切って、ファイルシステムは既存のものを使いつつ、メモリ空間、プロセス空間、ネットワークスタックを分離するためだけにVimage Jailを使うというのも効果的な方法だ。ホストのネットワークに影響を与えることなく、新しいサーバアプリケーションを検証してみたいという用途にも使える。