第5回ICTトラブルシューティングコンテストでFreeBSDを用いた問題を出題してみた話


こんにちは、kyontan です。
ツチノコブログは公開当初から読んでいたのですが、まさか自分もツチノコになる日がくるとは予想だにしていませんでした。ありがとうございます。

この記事では、私が初めての参加で初めての運営委員として努めさせていただいた、「第5回ICTトラブルシューティングコンテスト」(以下ICTSC5と表記します) について、昨日に公式 tech blog にて全問題の解説が公開されたことに合わせて、少し出題側の裏話的なものを書いていこうかと思います。

ICTSC5 問題解説公開について | ICTSC tech-blog
http://icttoracon.net/tech-blog/2016/03/31/ictsc5-question-public/

ICTSC5 にて、私はFreeBSD と、その上で動く仮想環境である jail を用いた問題を1題出題しました。
(その他にも 監視系の構築をしたり、問題出題やサーバーのアラートに連動させてパトランプを光らせたりということを行いました。)

問題についての概要と、その解説については公式 tech blog にて公開された以下の記事をお読み頂ければと思います。

問題解説: 弊社の変わった環境 (FreeBSD問題) | ICTSC tech-blog
http://icttoracon.net/tech-blog/2016/03/31/question06/

この記事では、FreeBSDの魅力や jail について、少しでも興味を持って頂ければと思い書いて行きます。

なぜ FreeBSD なのか?

たまたま自分が FreeBSD を使っていたから、というだけです。
なぜ初めて自宅サーバーを立てようとしたときに Linux ではなく FreeBSD を選んだのか? 今は自分でも覚えていません。
しかし察するに、名前の格好良さとかそういったものに惹かれた、みんな Linux 使ってるから辟易した、とかそんな感じだったのではないかと思います。
出題時の意図としては、大会の参加者の方々は普段 Linux を中心に触っておられると思うので、少しの驚きとともに、新鮮な気持ちで問題に挑んでもらいたいという気持ちや、古くからコンテナ技術としての jail を知ってもらいたい、という気持ちがありました。

FreeBSD、大会の懇親会でも「ひさびさに聞いた」「珍しい」「使ってる人、実在したんだ……」という声が多く聞かれた FreeBSD、以前でこそ 某社で使われているとか、某クラウドでサポートしているという話もありましたが、確かに最近どこそこで使われている、◯◯がアツいという話は中々耳にすることがありません…… と思っていたところ、なんと最新の PlayStation 4 の OS のベースとして、FreeBSD 9.0-RELEASE が採用されるという出来事が起こりました。また、 Mac OS X のカーネルである Darwin も FreeBSD がベースとなっています。

#FreeBSDとは

FreeBSD とは、簡単にいえば BSD の系譜を次ぐ OS であり、Linux とはカーネルも異なる全く別の OS です。最新の安定版リリースとしては 2015/8 に 10.2-RELEASE が公開され、現在は 11.0-CURRENT の開発が進んでいます。

Ports Collection というパッケージ管理システムが有名で、毎回ソースコードからビルドするといったスタイルが長らく主流でしたが、 10.0-RELEASE にて、 pkg といった新しいパッケージ管理システムが導入され、リポジトリからビルド済みパッケージを直接インストールするスタイルが主流になりつつあります。

既存の Ports との統合も行われており、ビルド済みパッケージとは異なるオプションでビルドしたパッケージをインストールしたいといった場合には、該当するパッケージのみを Ports でビルドし、依存パッケージを pkg からインストールするといったことも可能です。(他にも package というパッケージ管理システムもありますが、あまり使われているところを聞いたことがありません…… もしお使いの方がいたら申し訳ないです。)

他にも、Linux のバイナリ互換のカーネルモジュールや、ZFS のネイティブ対応, BHyVe というスーパバイザモード などの特徴があり、最近は clang でカーネル, ユーザランドのビルドが可能になるなど、コードのポータビリティの向上といった動きも盛んに行われています。

jail とは

そして、FreeBSD の特徴の一つが、ICTSC5 で出題した問題の題材とした Jail といわれる仮想化機構です。
時はコンテナ大航海時代、LXC や Docker といった単語を耳にしない日はないほどにコンテナ仮想化が流行っていますが、みなさん FreeBSD jail をお忘れでしょうか?
jail は、ユーザランドをホスト環境と分離する仮想化機構で、独自のファイルシステム, プロセス空間を持ちます。デフォルトではネットワークスタックはホストと共有しますが、VIMAGE というカーネルモジュールをホストのカーネルに組み込むことで、ネットワークスタックも独立にすることができます。

jail の構築手順

大会では、VIMAGE を用いたネットワークの構築問題を出題しました。この機会に jail + VIMAGE の世界に触れていただければと思い、以下に実際の大会で用いた導入手順を記載します。
ちなみに、VIMAGE を有効にせず jail のみを使う場合は、カーネルのリビルド / インストールは必要ありません。

  1. FreeBSD の入った環境を用意します。(大会当時の最新は 10.2-RELEASE でしたが当記事の編集時は 10.3-RELEASE が公開されています)
  2. ftp://ftp.freebsd.org/pub/FreeBSD/releases/ からホストのアーキテクチャに合った base.txz, src.txz をダウンロードする。
    ( ちなみに日本のミラーサーバのリストはこちらにあります http://www.jp.freebsd.org/mirror.html )
  3. src.txz を “/” へ展開します。(/usr/src 以下に展開されます)
  4. カーネルのビルドコンフィグを記載します。amd64 の場合は /usr/src/sys/amd64/conf/VNET に新規ファイルを作成します。(“VNET” は自分が分かりやすい識別子であればなんでも大丈夫です。)
    include GENERIC
    ident VNEToptions VIMAGEoptions IPFIREWALL
    options IPFIREWALL_VERBOSE
    options IPFIREWALL_DEFAULT_TO_ACCEPT
    options IPFIREWALL_NAT
    options IPDIVERT
    options LIBALIAS
  5. カーネルをビルドし、インストールします。自分の環境では20分前後掛かりました。
    $ cd /usr/src/
    $ make buildkernel KERNCONF=VNET
    $ make installkernel KERNCONF=VNET
    $ reboot
  6. base.txz をお好みの場所に展開します。(展開先が jail のルートとなりますが、複数 jail を構築することが想定されるので、雛形として /usr/jail/base などに展開することをおすすめします。)
  7. /usr/jail/base を /usr/jail/jail01 などにコピーし、/etc/jail.conf を編集します。
    <code>exec.start = "/bin/sh /etc/rc";
    exec.stop = "/bin/sh /etc/rc.shutdown";
    exec.clean;
    mount.devfs;
    path = "/usr/jail/$name";
    host.hostname = "$name.local";
    allow.raw_sockets;
    vnet;
    persist;

    jail01 { jid = 1; }
    ちなみに、jail を増やすことは、先ほど展開した base を jail02 などにコピーし、”jail01 { jid = 1; }” の行を追記するだけで可能です。
    この行における jail01 が “$name” となり、”/usr/jail/$name” を jail のルートとしてマウントされるため、jid と共に重複しないよう変更する必要があります。

  8. /etc/rc.conf を編集し、jail や bridge といった必要なサービス/モジュールを有効化します。
    if_epair_load="YES"
    if_bridge_load="YES"
    jail_enable="YES"
  9. カーネルモジュールを読み込むため、再起動をする or `$ kldload if_epair if_bridge` を行い if_epair と if_bridge を有効化します。
  10. jail service をスタートします。
    $ service jail start
  11. jail を起動します。
    service jail start jail01
  12. jls コマンドで現在立ち上がってる jail の一覧が取得できます。
    $ jls
    JID IP Address   Hostname Path
    1 jail01.local          /usr/jail/jail01
  13. jail 内でコマンドを実行するには jexec を用います。
    $ jexec jail01 sh
    #

以上、長々と書いてしまいましたが FreeBSD 環境でVIMAGE を有効にした  jail を立ち上げるところまでの手順説明になります。ここまで引っ張っておいて恐縮ではありますが、この後の実際に VIMAGE を用いた仮想ネットワークを設定するところの解説等は、以下を参照頂ければ幸いです。

問題解説: 弊社の変わった環境 (FreeBSD問題) | ICTSC tech-blog
http://icttoracon.net/tech-blog/2016/03/31/question06/

余談

長々と FreeBSD について語ってしまいましたが、要するに FreeBSD が好きな人が FreeBSD で問題を出した。ということにほかなりません。
ここまでは微妙な紆余曲折があり、この問題を出すがために募集要項に「※ディストリビューションについてはサーバ系OSを予定しています。」といった一文を追記するという小細工もしております(笑)。

更に、FreeBSD の次期バージョンとなる FreeBSD 11.0 では、なんと Docker が動作するようになる見込みです。(パッケージとして提供される予定のようです。)

Docker – FreeBSD Wiki
https://wiki.freebsd.org/Docker

まだ完全には動作しませんが、スナップショット機能は zfs と統合されており、高速に動作する上、FreeBSD 上の Docker で CentOS や Ubuntu といった Linux の Docker コンテナを走らせることもできます。とはいえまだまだ不安定な段階なので、今後の動向が気になるところです。

更に、ICTSC では 前回大会(第4回)より各チームへの大量展開には Ansible を使用していますが、Ansible の FreeBSD サポートが不完全なことや、最新バージョンで対応が壊れたなどの事件が多発し、モンキーパッチを当てつつの運用となりました。このあたりのマルチプラットフォーム対応は難しい所がありますね。今後も検討を進めていきたいところです。

他にも、本流にマージはまだ行われていませんが、FreeBSD VPS (Virtual Private Systems) という、jail 上でのライブマイグレーションを実現する機能も存在しています。

最後に

運営委員の反省会にて、「次回大会では FreeBSD をサーバ基盤にしよう」という旨の話をしたところ、誰からも肯定的な意見が出ませんでした。悔しいです。次回大会へ携わる機会があれば、より一層の BSD の普及へ画策して参りたいところです。
BSD が好きな学生の方も、好きでない学生の方も、もしこういった大会の運営に興味がありましたら一緒に次回 ICTSC6、大阪夏の陣にてご一緒しましょう!

改めまして、cloudpack杯 第5回ICTトラブルシューティングコンテストを支えて下さった企業様、参加いただいた皆様、そして実行委員の方々に感謝の意を伝えさせていただくとともに、こういった情報公開の場を提供下さったツチノコのみなさまにも感謝申し上げます。ありがとうございました。

«
»

Comments

  • FreeBSDは現役で使っています。

    DarwinのカーネルはMachですよ(^-^)
    その上でBSDサービスが動作しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Optionally add an image (JPEG only)