FreeBSD jail 小ネタ

# bastille について

FreeBSD/jail コンテナを分かりやすく使いやすくする "BastilleBSD" 
皆さんお使いでしょうか？　qjail/ezjail/pot/IOCage 色々見てましたが、
むつかしいのが苦手なので ''bastilleBSD'' に行き着いてかなり経ちます。
bhyveVM,virtualbox系を統合できるという''CBSD'' も触ったのですが、
CBSD は 装置がでかすぎて、私には荷が重いようです。

# bastille + ZFS 環境
FreeBSDを使うサーバというと、今では保守的な管理要請に従って、古いもので固めがちです。ともすればZFSは結構長いこと入っているのに、資源の小さなサーバの時代の倣いからかいまだに gmirror を使っているものが時折あります。　さすがに登場から20年たつ、2024年に　'''gmirror'''　はさすがに古いのですが、手堅い研究の成果ともあればほぼトラブル知らずなので使わざる得ないところもあるかと思います。
とはいっても gmirror では bastillebsd の強力な機能を使うことができません。 ZFS に乗せた jail では、online exportsが可能 ("Hot exporting" ) で、IO 処理時間を相当消費しながらも稼働しながら snapshotが取れてしまうこの機能、JAILの根幹ホストを変えるような作業に大活躍します。

<pre>
Hot exporting 'dns' to a compressed .xz image...
Creating temporary ZFS snapshot for export...
Sending ZFS data stream...
  --- %       176.2 MiB / 520.4 MiB = 0.339    14 MiB/s       0:37
</pre>

# 後から zfs jail にする

UFS環境で bastillebsd を建ててしまったり、ZFSを使いながらも poolに bastille用のfsを作らないでいれば、zfs jail の機能は使わない利用法もあるようです。 zfs はとにかくメモリを食うし、FreeBSD10以前で、ブートトラブルを抱えて肝心のデータ保護の機能は、それなりに動いているのでそこだけは、ありがたく使うとしても、長期の運用をしていくといきなり胃の腑を抉られるトラブルに出くわしたりして、ZFSを最小限にしか使ってないケースもあります。そういうサーバで jail を作ると zfs の設定をしなかったり、以下のコマンドを通さずにいきなり jail をつくってしまったりすると動くには動くが zfs 機能を使ってないものが出来上がったりします。
<pre>
# bastille setup
</pre>

筆者も bastille をテキトーに使い始めた結果、"bastille setup" なしで作ったものが過去にいくつかあって、jailの機能は使えているのに zfs 由来のFileSsytem分離の恩恵を受けられていませんでした。　標準的な ZFS/Jailでの bastilleの構成は以下の通りになるようです。

<pre>
zroot/bastille                              207G  3.30T   128K  /usr/local/bastille
zroot/bastille/backups                     84.9G  3.30T  84.9G  /usr/local/bastille/backups
zroot/bastille/cache                        199M  3.30T    96K  /usr/local/bastille/cache
zroot/bastille/cache/14.1-RELEASE           199M  3.30T   199M  /usr/local/bastille/cache/14.1-RELEASE
zroot/bastille/jails                        122G  3.30T   136K  /usr/local/bastille/jails
zroot/bastille/jails/dns                   11.4G  3.30T   120K  /usr/local/bastille/jails/dns
zroot/bastille/jails/dns/root              11.4G  3.30T  8.33G  /usr/local/bastille/jails/dns/root
zroot/bastille/jails/pgsql                 9.39G  3.30T   108K  /usr/local/bastille/jails/pgsql
zroot/bastille/jails/pgsql/root            9.39G  3.30T  4.77G  /usr/local/bastille/jails/pgsql/root
zroot/bastille/logs                         208K  3.30T   208K  /var/log/bastille
zroot/bastille/releases                     451M  3.30T    96K  /usr/local/bastille/releases
zroot/bastille/releases/14.1-RELEASE        451M  3.30T   451M  /usr/local/bastille/releases/14.1-RELEASE
zroot/bastille/templates                     96K  3.30T    96K  /usr/local/bastille/templates
</pre>

この構造が作られてなくても、UFSを基本とする FreeBSD/jail はそれなりに機能します。　ただ、ZFS の send/receive機能を援用したexport/importの機能は使えないため、zfs に移し替えてしまうのがお勧めです。　特段変わったコマンドは不要ですが、 net/rsync を使って 新しい zfs filesystem tree に入れてしまえば手軽でいいと思います。 UFSで通常インストールされれば /usr/local/bastille　に生えているものを、分割されたFSに植え替えるという感じでよいです（観葉植物？）

# bastille rcorder について

bastillebsd　を新しいサーバに移し替えていくと、いろいろなことがわかります。 ホストはあまり止めたりしないものなので、再起動を繰り返していくと JAILの起動順序によってはデッドロックしてしまうことがあります。特に powerdns-postgresql など別のコンテナに入れてあるものを手動で立ち上げていたものなど、インフラに近ければ近いほど再起動テストなどを通さずに来て、本番サーバの移行などのテストが繰り返される場でようやく「順序問題」に気が付くなどですね。
rc.conf にも *rcorder* という機構があって、依存関係が組み込めるようになっています。これを jail.confに拡張したのが "basitille rcorder" で、これは rc.d/bastille のオプションとして機能します。
rc.conf上では
<pre>
bastille_rcorder="YES" 
</pre>

とするだけですが、個別の jail.conf にも

<pre>
# REQUIRE: pgsql
dns {
  devfs_ruleset = 4;
  enforce_statfs = 2;
  exec.clean;
  exec.consolelog = /var/log/bastille/dns_console.log;
  exec.start = '/bin/sh /etc/rc';
  exec.stop = '/bin/sh /etc/rc.shutdown';
...

</pre>

<pre>
# PROVIDE: pgsql
pgsql {
  devfs_ruleset = 4;
  enforce_statfs = 2;
  exec.clean;
  exec.consolelog = /var/log/bastille/pgsql_console.log;
  exec.start = '/bin/sh /etc/rc';
....
</pre>

などの rcorderで使われるアノテーションを加えておきます。

KEYWORDはおそらく rcorder で使えるものがすべて使えると思いますが、
私の場合は powerdnsのバックエンドが pgsqlであって、これがデッドロックしてしまうとFreeBSDホストがブート時にrc.confを完了しないという罠に落ちてssh頼みのリモートでは救えなくなってしまう現象がありました。
rcorderはともかく、jail でも有用ですので、起動順序にはまったら rcorder をお忘れなく。