Runit

提供: ArchWiki
2023年8月28日 (月) 22:54時点におけるKgx (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

警告: Arch Linux は systemd のみを公式にサポートしています。runit を init システムとして使用する場合は、サポートリクエストにその旨を明記してください

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
ノート:
  • このユニットファイルの例では、有効なサービスを含むディレクトリがシステムインスタンスの場合は /var/service、ユーザーインスタンスは $HOME/service であることを前提としています。このパスは、それぞれの特定の使用例に応じて変更できます。
  • SIGHUP kill シグナルは、デフォルトの SIGTERM の代わりに、メインの runsvdir プロセスでのみ使用されます (KillMode=process のおかげで) これにより、BusyBox の runit 実装によって制御されているプロセスは、スーパーバイザーを終了する前に runsvdir によって制御可能に停止されます。runsvdirSIGHUP シグナルを受信した後に監視されているプロセスを終了すると、ステータスコード 111 で終了します。これは成功として解釈する必要があります。

作成した 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, /etc/runit/2, /etc/runit/3 に定義されるランレベルは別です。

1 はシステムをブートストラップし、2 は /service の runsvdir を起動し、3 はシステムを停止します。

ランレベル 2 では、好きな数だけサービスレベルを使うことができます。/etc/runit/runsvdir/ に作成した (サービスディレクトリのシンボリックリンクが含まれた) ディレクトリを指定して runschdir を実行できます。runsvchdir <theservicedir> を実行するだけで他のマシンのサービスを引き継ぐことができるため、HA (フェイルオーバー) 構成で非常に便利です。

ユーザーレベルの監視ディレクトリを作成して依存関係のサービスレベルのツリーを実行することもできます。下のユーザーレベルサービスを見てください。

一般的な使用方法

実行中のサービスを確認:

# sv s /service/*
run: /service/agetty-2: (pid 4120) 7998s
run: /service/agetty-3: (pid 4119) 7998s
run: /service/bougyman: (pid 4465) 7972s
run: /service/bougyx: (pid 4135) 7998s; run: log: (pid 4127) 7998s
un: /service/cron: (pid 4137) 7998s; run: log: (pid 4122) 7998s
run: /service/dialer: (pid 4121) 7998s
run: /service/qmail: (pid 4138) 7998s; run: log: (pid 4126) 7998s
run: /service/smtpd: (pid 4136) 7998s; run: log: (pid 4125) 7998s
run: /service/socklog-klog: (pid 4139) 7998s; run: log: (pid 4132) 7998s
run: /service/socklog-unix: (pid 4133) 7998s; run: log: (pid 4124) 7998s
run: /service/ssh: (pid 4134) 7998s; run: log: (pid 4123) 7998s

サービスは /etc/sv に存在している必要があります。

サービスを作成して起動:

# ln -s /etc/sv/ssh /service/ssh

サービスをすぐに停止:

# sv d ssh

サービスを再起動:

# sv t ssh

サービスをリロード:

# sv h ssh

サービスやログサービスの状態を表示:

# sv s ssh

サービスを停止して無効化:

# rm /service/ssh

詳しくは sv の man ページを見てください。

システムをシャットダウン:

# runit-init 0

システムを再起動:

# runit-init 6

ユーザーレベルサービス

特定のユーザーで runsvdir を実行することで監視ツリーを拡張してユーザーに制御を渡すことができます。

ユーザーレベルサービスツリーを追加

# mkdir -p /etc/sv/homes/joeuser

以下の内容で /etc/sv/homes/joeuser/run を作成してください:

#!/bin/sh
export PATH=/home/joeuser/bin:$PATH # optional, if your services rely on binaries in ~/bin
exec 2>&1 \
sudo -H -u joeuser runsvdir -P /home/joeuser/service 'log:...................................................................................................................................' # Requires sudo, of course
# chmod 700 /etc/sv/homes/joeuser/run

それから /etc/sv/homes/joeuser から /service にシンボリックリンクを作成すると、~/service に配置されたサービスがユーザーの環境で起動するようになります。

ユーザーの X セッションサービスを作成

# mkdir -p /etc/sv/joeuserX

以下の内容で /etc/sv/joeuserX/run スクリプトを作成:

#!/bin/sh
exec 2>&1 \
su -c xinit - joeuser
# chmod 700 /etc/sv/joeuserX/run

/etc/sv/joeuserX から /service にシンボリックリンクを作成してください。joe の X セッションは常には動作しなくなります。joe の ssh のパスフレーズを使って防護するには、.xinitrc に以下を記述してください:

#!/bin/sh
...
SNIP
...
xscreensaver&
eval $(keychain --eval)
exec sh -c \
'SSH_ASKPASS=/usr/lib/openssh/ssh-askpass-fullscreen ssh-add < /dev/null \
&& exec stumpwm'

stumpwm は使用したいウィンドウマネージャやデスクトップ環境のコマンドに置き換えてください。

keychainssh-askpass-fullscreenAUR パッケージが必要です。

ヒントとテクニック

メモリ上で PostgreSQL の読み取り専用スレーブデータベースを実行

以下のレシピは非常に高速な読み取り速度を必要とするデータベースのためのものです。PostgreSQL のストリーミングレプリケーションとホットスタンバイモードを使っています。

要件

手順

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 から読み取り専用モードで使うことができるはずです。