概要
Nitro は、軽量なプロセス監督ツールで、Linuxの initプロセス (pid 1)としても利用可能。 組み込み機器 や サーバー、 コンテナ など多様な用途に対応。 RAM上で全状態管理 し、効率的なイベント駆動型動作を実現。 シンプルな ディレクトリ構成 によるサービス設定。 nitroctl によるリモート制御や、柔軟なログ管理機能を搭載。
Nitro の特徴と用途
- Nitro は、極小サイズの プロセススーパーバイザー
- Linuxの initプロセス(pid 1) としても動作
- 組み込み機器、 デスクトップ、 サーバー 用途
- Linux initramfs 用init
- Docker/Podman/LXC/Kubernetes などのLinuxコンテナinit
- POSIXシステム上の 非特権監督デーモン
要件
- Unixソケット 対応カーネル
- tmpfs または書き込み可能な /run ディレクトリ
他システムとの比較優位性
- 全状態をRAM管理、読み取り専用ルートfsでも動作
- イベント駆動型、ポーリング不要
- 実行時の動的メモリ割当ゼロ
- ファイルディスクリプタ数の無制限使用なし
- 自己完結型バイナリ (musl libc利用時は極小静的バイナリ)
- 設定ファイルのコンパイル不要、サービスはスクリプトディレクトリのみ
- 信頼性の高いサービス再起動
- サービスごとのログ機能、ログチェーン構成も可能
- システムクロック非依存
- FreeBSD 上でも動作(/etc/ttys利用)
サービスディレクトリ構成
- /etc/nitro (または指定ディレクトリ)内の各ディレクトリがサービス
- setup: サービス開始前に実行、0で継続
- run: サービス本体、プロセスが生存中はサービス稼働
- finish: run終了後に実行、runの終了ステータスとシグナルを引数で受け取る
- log: 他サービスディレクトリへのシンボリックリンク、ログパイプ処理
- down: 存在時はデフォルトで起動しない
- @で終わるディレクトリ: パラメータ化サービス用、nitroは無視
- サービス名制限: 64文字未満、/・カンマ・改行禁止
特殊サービス
- LOG: logシンボリックリンクがない全サービスのデフォルトログサービス
- SYS:
- SYS/setup: 他サービス起動前に実行
- SYS/finish: シャットダウン時に実行
- SYS/final: 全プロセス終了後に実行
- SYS/fatal: 致命的エラー時に実行
- SYS/reincarnate: シャットダウン時に実行、initramfs実装などに利用
パラメータ化サービス
- @で終わるディレクトリ は直接起動せず、シンボリックリンクやnitroctlで起動
- 例:
agetty@/run+agetty@tty1 -> agetty@シンボリックリンク - nitroctl up agetty@tty2 で
agetty@/run tty2実行
- 例:
動作モード・ライフサイクル
- 起動: gSYS/setup→全サービス起動(down指定除く)
- サービス再起動: 異常終了時は最大2秒間隔で再起動
- シャットダウン/再起動: nitroctl Reboot/Shutdown
- SYS/finish→SIGTERM→最大7秒→SIGKILL→SYS/final→再起動/シャットダウン/終了
nitroctlによる制御
- nitroctl [COMMAND] [SERVICE] 形式でリモート制御
- 主なコマンド
- list: サービス一覧・状態・pid・稼働時間・終了ステータス
- up/down/start/restart/stop: サービス起動・停止・再起動
- p/c/h/a/i/q/1/2/t/k: 各種シグナル送信
- pidof: サービスのpid出力
- rescan: /etc/nitro再読込
- Shutdown/Reboot: システムシャットダウン/再起動
シグナルによる制御
- SIGHUP: rescan
- SIGINT: reboot
- SIGTERM: shutdown(pid 1以外)
Linux initとしての利用
- 自己完結型バイナリ、pid 1で直接起動可能
- 必要に応じて /dev ・ /run マウント
- Ctrl-Alt-Delete で秩序立った再起動
Dockerコンテナinitとしての利用
- 静的バイナリ なので容易にコンテナへコピー可能
- 例:
COPY ./nitro /bin/COPY ./nitroctl /bin/CMD ["/bin/nitro"]
- 例:
- /run ディレクトリ必須
- NITRO_SOCK で外部からnitroctl制御も可能
FreeBSDでの利用
- /etc/ttys に以下を追加し、FreeBSD initで監督起動
/etc/nitro "/usr/local/sbin/nitro" "" on
ライセンス・著者
- 著者: Leah Neukirchen(leah@vuxu.org)
- ライセンス: 0BSD
- 参考: daemontools, freedt, runit, perp, s6 など先行システムからの知見