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の根幹ホストを変えるような作業に大活躍します。
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
後から zfs jail にする
UFS環境で bastillebsd を建ててしまったり、ZFSを使いながらも poolに bastille用のfsを作らないでいれば、zfs jail の機能は使わない利用法もあるようです。 zfs はとにかくメモリを食うし、FreeBSD10以前で、ブートトラブルを抱えて肝心のデータ保護の機能は、それなりに動いているのでそこだけは、ありがたく使うとしても、長期の運用をしていくといきなり胃の腑を抉られるトラブルに出くわしたりして、ZFSを最小限にしか使ってないケースもあります。そういうサーバで jail を作ると zfs の設定をしなかったり、以下のコマンドを通さずにいきなり jail をつくってしまったりすると動くには動くが zfs 機能を使ってないものが出来上がったりします。
# bastille setup
筆者も bastille をテキトーに使い始めた結果、"bastille setup" なしで作ったものが過去にいくつかあって、jailの機能は使えているのに zfs 由来のFileSsytem分離の恩恵を受けられていませんでした。 標準的な ZFS/Jailでの bastilleの構成は以下の通りになるようです。
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
この構造が作られてなくても、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上では
bastille_rcorder="YES"
とするだけですが、個別の jail.conf にも
# 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';
...
# 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';
....
などの rcorderで使われるアノテーションを加えておきます。
KEYWORDはおそらく rcorder で使えるものがすべて使えると思いますが、
私の場合は powerdnsのバックエンドが pgsqlであって、これがデッドロックしてしまうとFreeBSDホストがブート時にrc.confを完了しないという罠に落ちてssh頼みのリモートでは救えなくなってしまう現象がありました。
rcorderはともかく、jail でも有用ですので、起動順序にはまったら rcorder をお忘れなく。