BSD界隈四方山話

第11回設定ファイルの次世代フォーマットUCL

プラットフォームへ、大きく変わる/etc/たち

FreeBSDではシステムの設定ファイルは/etc/へ、サードパーティ製ソフトウェアの設定ファイルは/usr/local/etc/にインストールされる仕組みになっています。/etc/以下を調べればそのシステムがどういった動きをするかわかります。設定ファイルはソフトウェアごとに用意されていて、そのフォーマットもソフトウェアごとにさまざまです。

この状況は少しずつですが変わり始めています。早ければ11系のリリース時から、大きな阻害要因がない限りは12系や13系では/etc/以下の設定ファイルは大きく異なるものになっているかもしれません。

この動きの動機は、FreeBSDがサーバオペレーティングシステムから、さまざまなシステムの「プラットフォーム」としてのソフトウェアとして性格を変えてきていることにあります。FreeBSDが登場した20年以上前、FreeBSDの主な用途はエッジサーバやルータでした。20年以上の時を経て、今FreeBSDはサーバのみならずアプライアンスや組み込み機器、ストレージシステムなど、大規模システムから小さな組み込みデバイスまで、異なる多種多様なハードウェアで動作するようになっています。

こうした多種多様なハードウェアに対応し、さらに管理を簡単にしていくためには、たとえば設定ファイルを統一したフォーマットのもと、人間にも扱いやすく、アップグレード時にも手間がかからないものにする必要も出てきます。こうした取り組みのひとつが、Allan Jude氏の取り組んでいる「Universal Config Language(UCL⁠⁠」です。

統一されたフォーマットへ

事の発端は2014年にブルガリアの首都、ソフィアで開催されたEuroBSDConにあります。基調講演で登壇した、当時はApple勤めのJordan Hubbard氏は、先ほど挙げたようなFreeBSDの変遷を説明したあと、我々はこうした状況に応える必要があるとして、その一つの例として統一された設定ファイルへの移行などを指摘しました。

Jordan Hubbard氏はその候補としてMac OS Xのlaunchd(8)で使われているバイナリ形式のXML plistを引き合いに出します。この講演を受けてAllan Jude氏は、XMLがそうした用途に適切とはどうもに考えにくいとし、さまざまな用途に使用できるフォーマットの検討をはじめます。基本的なアイディアは次のようなものです。

  • 読みやすいこと
  • 構造化されていること
  • アップグレードが簡単に実施できること
  • 複数のファイルをオーバーレイできること
  • デフォルト設定と個別設定を分離できること

Allan Jude氏はこうした点を踏まえてUniversal Config Language(UCL)を開発します。UCLはNginxの設定ファイルによく似ています。JSONのようなフォーマットですが、JSONでは許可されていないもっと緩い表記ができるようになっています。厳密なJSONは人間が手動で書くには制限がきつすぎる傾向があります。UCLではそうしたことがないようになっています。

UCLの操作は手動で編集することもできますし、コマンドを経由して動作することもできます。厳密なJSONやYAMLに変換して出力することもできます。

図1 UCL for FreeBSD - A universal config language for (almost) everything in FreeBSDより抜粋
図1 UCL for FreeBSD - A universal config language for (almost) everything in FreeBSDより抜粋

UCLは上記のようなフォーマットになっています。ほかのファイルをインクルードしたりオーバーレイしたり、設定を入れ子構造にして記述することもできます。

UCLのアイディアとライブラリ、ツールの実装はEuroBSDConのあとに開催されたMeetBSDをへて大きく進みます。AsiaBSDCon 2015でもUCLに関する発表があり、先月開催されたBSDCan 2015およびFreeBSD DevSummitでもUCLに関する発表や議論が行われました。

レガシーファイルからUCLへの移行

具体的にどのように/etc/の変更を考えているというと、Allan Jude氏は次のようなアイディアを出しています。

  • すべての設定ファイルを/etc/defaults/にまとめる
  • 設定変更は/etc/defaults/のファイルを書き換えるのではなく、UCLで設定を書いて上書きするようにする(/etc/defaults/rc.confと/etc/rc.confの関係のように)

移行をスムーズに実施するためシェルのシバンのようなセンチネルを設定ファイルの先頭に置くようにして、そこにUCLファイルであることを示すバージョン番号が記載されていればUCLとしてパース、そうでない場合には従来のパーサでパースするようにします。

そして実はすでにいくつかのソフトウェアの設定ファイルはUCLで記述されています。たとえばJailの設定ファイル/etc/jai.confはUCLで記述するようになっています。

リスト1 /etc/jail.conf
j1 {
        jid = 1;
        name = j1;
        path =/Users/daichi/j1;
        ip4.addr = 192.168.1.251;
        host.hostname = jail1.ongs.co.jp;
        allow.raw_sockets;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
        interface = bge0;
        mount.devfs;
}

j9 {
        jid = 9;
        name = j9;
        path =/Users/daichi/j9;
        ip4.addr = 192.168.1.252;
        host.hostname = jail9.ongs.co.jp;
        allow.raw_sockets;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
        interface = bge0;
        mount.devfs;
}

UCLを操作するコマンドとしてはuclcmdというコマンドの開発が進められています。コマンドで操作できるようになればシェルスクリプトから操作の全自動化が簡単にできるようになります。

システムの主要な設定ファイルがすべてUCLになると、手動でのシステム管理ではなく、シェルスクリプトや、またはWebインターフェース系の管理ツールを使った管理が簡単に実施できるようになります。検討すべきことはまだいくつもありますが、試行錯誤を続けながら徐々に/etc/以下がUCLに変わっていくものとみられます。

ツールたち

uclcmdのソースコードはallanjude/uclcmd - GitHubで公開されています。ライセンスは2条項のBSDライセンスです。11-CURRENTではUCLを操作するためのライブラリlibuclが/usr/lib/libpricateucl.soとしてインストールされるようになっています。

おすすめ記事

記事・ニュース一覧