Runit
関連記事
Runit はプロセススーパーバイザーです。pid1 として sysv の init を置き換えることができる runit-init
が含まれており、inittab から起動することができます。他の init システムを使うこともできます。Runit はシンプルなツールの集合であり、柔軟性のある依存関係や分散された環境を構築することができます。また、ランレベルの変更を極めて高速に行うことが可能です。
例については ユーザーレベルサービス を参照してください。
目次
インストール
systemd と一緒に runit を使用する
BusyBox の実装を使用する
BusyBox は、単純な処理監視のニーズに使用できる runit の最小限の実装を提供します。まず、必要となるツールの BusyBox バイナリへのシンボリックリンクを作成します。
# busybox --list | awk '/^runsv|^chpst$|^sv/' | xargs -I{} ln -sv /usr/bin/busybox /usr/local/bin/{}
その後、必要に応じて BusyBox の runit を実行するために systemd ユニットファイルを作成できます。
/etc/systemd/system/busybox-runit.service
[Unit] Description=Runit service supervision - BusyBox implementation Documentation=man:busybox(1) http://smarden.org/runit/ [Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" ExecStart=/usr/local/bin/runsvdir -P /var/service KillSignal=SIGHUP KillMode=process Restart=always SuccessExitStatus=111 [Install] WantedBy=multi-user.target
${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/busybox-runit.service
[Unit] Description=Runit service supervision - BusyBox implementation Documentation=man:busybox(1) http://smarden.org/runit/ [Service] Environment="HOME=%h" "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" ExecStart=/usr/local/bin/runsvdir -P %h/service KillSignal=SIGHUP KillMode=process Restart=always SuccessExitStatus=111 [Install] WantedBy=default.target
作成した systemd ユニットファイルに従って、runsvdir が監視するディレクトリを必ず作成してください。runit サービスを保存できるディレクトリ (通常は /etc/sv
) を作成し、監視対象のディレクトリから runit サービスへのシンボリックリンクを作成して、必要な場合にのみ有効にすることもお勧めします。詳細については、 一般的な使用方法 を参照してください。
すべてが正しく設定されている場合、busybox-runit.service
は 有効化され、開始されます
標準 Runit の使用
runit を、デフォルトの Arch Linux の init システム (systemd) と一緒に単純なプロセススーパーバイザーとして使用することができます。この目的のために、ステージスクリプトを必要としないベアボーン Runit インストールを提供する runit-systemdAUR をインストールします (/etc/runit/{1..3}
) またはランレベル (/etc/runit/runsvdir/*
) これらは通常、runit を init システムとして使用する場合にのみ役立ちます。 このパッケージは、目的の runit サービスを配置できるディレクトリ (/var/service
) と、そのディレクトリの runit 監視を開始する systemd ユニットを提供します。/var/service
で設定されたサービスのみが runit によって監視されます。runit.service
を 有効にして開始 するだけです。
使い方
ツール
sv
- サービスの制御、サービスの状態の取得、依存関係のチェックなどに使います。chpst
- メモリ制限、コア制御、データセグメント、ユーザー・グループの権限などプロセスの環境を制御します。runsv
- プロセスを監視してログを保存します。svlogd
- シンプルで強力なロガー。時間や容量などによる自動ローテート、ポストプロセス、パターンマッチ、ソケット (リモートログ) などが使えます。logrotate でログをローテートする必要はもうありません。runsvchdir
- サービスレベル (ランレベル) を変更します。runsvdir
- 監視ツリーを起動します。runit-init
- dietlibc が静的にコンパイルされた PID 1 です。PID 1 として必要なことしかしません。
使用方法については man ページを読んでください。
ランレベルとサービスディレクトリ
Runit は、シンボリックリンクのディレクトリを使用して、/etc/runit/1、2、および 3 で定義されている 3 つの主要なランレベル以外のランレベルを指定します。
1 はシステムをブートストラップし、2 は /service 上で runvdir を開始し、3 はシステムを停止します。
ランレベル 2 では、好きな数だけサービスレベルを使うことができます。/etc/runit/runsvdir/
に作成した (サービスディレクトリのシンボリックリンクが含まれた) ディレクトリを指定して runschdir を実行できます。runsvchdir <theservicedir>
を実行するだけで他のマシンのサービスを引き継ぐことができるため、HA (フェイルオーバー) 構成で非常に便利です。
ユーザーレベルの監視ディレクトリを用意することで、依存するサービス レベルのツリーを実行することもできます。以下のユーザーレベルのサービスを参照してください。
デフォルトでは、runit-run パッケージは、/etc/runit/runsvdir/archlinux-default で定義され、/etc/runit/runsvdir/default にシンボリックリンクされている非常に最小限のサービスセットを使用します。
getty は tty2 と tty3 にのみ提供されるため、起動するとコンソールのスクロールと整然とした 'runsvchdir:default:current' だけが表示されます。これは、X を起動すると tty4 上にあることを意味します。
標準の Arch コンソールに戻るには、/service/ngetty リンクを削除し、/service 内で必要な数の /etc/sv/*getty* サービスをリンクするか、/etc/sv/ngetty/run ファイルを編集してさらに多くのサービスを取得します。 さらに良いのは、/etc/runit/runsvdir に独自のディレクトリを作成し、必要なサービスだけに必要なシンボリックリンクを追加することです。runit で起動するサービスは、忘れずに /etc/rc.conf の DAEMON から取り出すか、systemctl で無効にしてください。サービスはそこで起動する必要はなく、runit はバックグラウンドなしで並列起動できるようになります。
一般的な使用方法
この説明では、/var/service
は runsvdir によって管理される選択されたサービスディレクトリであり、/etc/sv
は有効にできるサービスを含むために選択されたディレクトリです。
- 実行中のサービスのリスト:
# sv status /var/service/* run: /var/service/agetty-2: (pid 4120) 7998s run: /var/service/agetty-3: (pid 4119) 7998s run: /var/service/bougyman: (pid 4465) 7972s run: /var/service/bougyx: (pid 4135) 7998s; run: log: (pid 4127) 7998s run: /var/service/cron: (pid 4137) 7998s; run: log: (pid 4122) 7998s run: /var/service/dialer: (pid 4121) 7998s run: /var/service/qmail: (pid 4138) 7998s; run: log: (pid 4126) 7998s run: /var/service/smtpd: (pid 4136) 7998s; run: log: (pid 4125) 7998s run: /var/service/socklog-klog: (pid 4139) 7998s; run: log: (pid 4132) 7998s run: /var/service/socklog-unix: (pid 4133) 7998s; run: log: (pid 4124) 7998s run: /var/service/ssh: (pid 4134) 7998s; run: log: (pid 4123) 7998s
- サービスを作成して開始します。
# ln -s /etc/sv/ssh /var/service/ssh
- サービスをすぐに停止します (次回の起動時に開始されます)
# sv down /var/service/ssh
- 以前に停止されたサービス、または自動的に開始されないように設定されているサービスを開始します。
# sv up /var/service/ssh
- サービスを再起動します
# sv restart /var/service/ssh
- サービスをリロードします
# sv reload /var/service/ssh
- サービスとそのログサービスのステータスを示します。
# sv status /var/service/ssh
- サービスを停止し、無効にします (次回の起動時に開始されません)
# rm /var/service/ssh
ユーザーサービス
ユーザー監視ツリーを作成するには、Systemd/ユーザー サービスを使用する方法と runit 自体を使用する方法の 2 つがあります。例については、BusyBox の実装の使用 を参照してください。
サービス例
サービスを保存するディレクトリを作成します。
$ mkdir -p ~/.config/sv
サービスのディレクトリを作成します。
$ mkdir ~/.config/sv/mpd
サービスディレクトリに run
ファイルを 作成 します。実行ファイルの例は runit のサイト にあります。
$HOME/.config/sv/mpd/run
#!/bin/sh MPDCONF=${XDG_CONFIG_HOME:-$HOME/.config}/mpd/mpd.conf exec mpd --no-daemon $MPDCONF
実行可能属性を付与 します。
サービスを有効にするには、サービスディレクトリへのシンボリックリンクを作成します。これにより、runit の開始時にサービスが自動的に開始されます。サービスはすぐに開始されるはずです。
$ ln -s ~/.config/sv/mpd ~/service/mpd
サービスを停止するには:
$ SVDIR=~/service sv down mpd # or $ sv down ~/service/mpd
サービスを再度開始するには:
$ SVDIR=~/service sv up mpd # or $ sv up ~/service/mpd
ヒントとテクニック
メモリ上で PostgreSQL の読み取り専用スレーブデータベースを実行
以下のレシピは非常に高速な読み取り速度を必要とするデータベースのためのものです。PostgreSQL のストリーミングレプリケーションとホットスタンバイモードを使っています。
要件
- PostgreSQL 9.0 以上
- arch-runit-servicesAUR[リンク切れ: パッケージが存在しません]
- Rsync
手順
1. /etc/sv/pg_mem/log
ディレクトリを作成:
# mkdir -p /etc/sv/pg_mem/log
2. 以下の3つのファイルを作成
/etc/sv/pg_shm/run
#!/bin/sh -e sleep 3 # Give postgresql a chance to start and replay any transactions . /etc/conf.d/pg_shm # Read any conf vars PG_DISK_ROOT=/var/lib/postgres # Where the 'master' data directory lives [ -d "$PGROOT" ] || mkdir -p "$PGROOT" # Create the new $PGROOT if it does not exist sv -w7 c postgresql 2>&1 # Stop the main postgres from making changes by enttering backup mode psql -U postgres -c "SELECT pg_start_backup('seed',true)" 2>&1 # Sync the main postgres data dir to our new $PGROOT rsync --progress --delete -a "$PG_DISK_ROOT/data" "$PGROOT/" --exclude=postmaster.pid 2>&1 # Allow changes on the primary server again psql -U postgres -c "SELECT pg_stop_backup()" 2>&1 # Set up the hot standby mode on the slave server echo "hot_standby = 'on'" >> "$PGROOT/data/postgresql.conf" echo "port = $PGPORT" >> "$PGROOT/data/postgresql.conf" echo "standby_mode = 'on'" >> "$PGROOT/data/recovery.conf" echo "primary_conninfo = 'host=localhost port=5432 user=postgres'" >> "$PGROOT/data/recovery.conf" echo "trigger_file = '/tmp/stop_replication'" >> "$PGROOT/data/recovery.conf" echo "restore_command = 'cp /var/lib/postgres/archive/%f \"%p\"'" >> "$PGROOT/data/recovery.conf" exec chpst -u postgres /usr/bin/postgres -D "$PGROOT/data" -c config_file="$PGROOT/data/postgresql.conf" 2>&1
/etc/conf.d/pg_shm
PGROOT=/dev/shm/pg_mem PGPORT=5434 PGLOG="/var/log/pg_mem.log"
/etc/sv/postgresql/finish
#/bin/sh sv -v i pg_shm
3. run と finish に実行可能属性を付与:
# chmod 700 /etc/sv/pg_mem/run
# chmod 700 /etc/sv/postgresql/finish
4. ログサービスを作成:
# ln -s /usr/bin/rsvlog /etc/sv/pg_shm/log/run
5. /var/lib/postgres/data/postmaster.conf
を編集して WAL アーカイブを有効にしてください。詳しくは こちら のステップ3と4を見てください。
6. postgresql を再起動:
# sv i postgresql
7. pg_shm を起動:
# ln -s /etc/sv/pg_shm /service
8. 動作していることを確認:
# sv s postgresql pg_mem
PostgreSQL のオンディスクデータベースのレプリカがポート 5434 から読み取り専用モードで使うことができるはずです。
参照
- Runit's Homepage. G Pape's runit ホームページ
- Voidlinux Handbook - Services and Daemons - runit. Void linux ハンドブックの runit に関するセクション。