「Runit」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「Tips and tricks」を「ヒントとテクニック」に置換)
(英語版に追従して項目を整理)
 
(3人の利用者による、間の10版が非表示)
1行目: 1行目:
[[Category:ブートプロセス]]
+
[[Category:Init]]
[[Category:デーモンとシステムサービス]]
 
 
[[en:Runit]]
 
[[en:Runit]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|init}}
 
{{Related|init}}
 
{{Related articles end}}
 
{{Related articles end}}
  +
{{Warning|Arch Linux は [[systemd]] のみを公式にサポートしています。runit を init システムとして使用する場合は、サポートリクエストにその旨を明記してください}}
Runit はプロセススーパーバイザーです。pid1 として sysv の init を置き換えることができる {{ic|runit-init}} が含まれており、inittab から起動することができます。他の init システムを使うこともできます。Runit はシンプルなツールの集合であり、柔軟性のある依存関係や分散された環境を構築することができます。また、ランレベルの変更を極めて高速に行うことが可能です。
 
   
  +
Runit はプロセススーパーバイザーです。pid1 として sysv の init を置き換えることができる {{ic|runit-init}} が含まれており、inittab から起動することができます。他の init システムを使うこともできます。Runit はシンプルなツールの集合であり、柔軟性のある依存関係や分散された環境を構築することができます。また、ランレベルの変更を極めて高速に行うことが可能です。
詳しくは [http://smarden.org/runit/ G. Pape の Runit のページ] を見てください。以下では Arch に Runit をインストールする方法を説明します。
 
  +
例については [[Runit#ユーザーレベルサービス|ユーザーレベルサービス]] を参照してください。
   
 
== インストール ==
 
== インストール ==
   
  +
=== systemd と一緒に runit を使用する ===
init を runit-init で置き換える場合:
 
   
  +
==== BusyBox の実装を使用する ====
* {{AUR|sysvinit}} パッケージをインストール ({{Pkg|systemd-sysvcompat}} を置き換えるかという質問に Yes と答えてください)。
 
* {{AUR|arch-runit}}{{Broken package link|パッケージが存在しません}} パッケージをインストール。
 
* デフォルトランレベルを選択・作成 ([[#ランレベルとサービスディレクトリ]]を参照)。
 
* ブートローダーのカーネルコマンドラインに {{ic|1=init=/sbin/runit-init}} を追加。
 
* 再起動。
 
   
  +
[[BusyBox]] は、単純な処理監視のニーズに使用できる runit の最小限の実装を提供します。まず、必要となるツールの BusyBox バイナリへのシンボリックリンクを作成します。
試すだけを init を置き換えるところまでしたくない場合、Arch 標準の systemd と共存するようにインストールして、{{ic|/var/service}} に配置したサービスのプロセスを監視することもできます。
 
   
  +
# busybox --list | awk '/^runsv|^chpst$|^sv/' | xargs -I{} ln -sv /usr/bin/busybox /usr/local/bin/{}
* {{AUR|arch-runsvdir-init}}{{Broken package link|パッケージが存在しません}} パッケージをインストール。
 
* 既存の init ({{ic|inittab}}, {{ic|rc.local}}, systemd など) を使って {{ic|runsvdir /var/service}} を起動。
 
   
  +
その後、必要に応じて BusyBox の runit を実行するために [[systemd]] ユニットファイルを作成できます。
{{AUR|arch-runit-services}} パッケージは {{ic|/etc/sv}} にサービスを保存して {{ic|/usr/bin/rsvlog}} をロガーとして使います。
 
   
  +
{{hc|1=/etc/systemd/system/busybox-runit.service|2=[Unit]
{{AUR|arch-runsvdir-init}}{{Broken package link|パッケージが存在しません}} に新しいランレベルを作成して {{ic|/etc/runit/runsvdir/all}} に作成したサービスディレクトリにシンボリックリンクを張ります。そして {{ic|/usr/bin/nsvlog}} スクリプトを使ってログを記録します。
 
  +
Description=Runit service supervision - BusyBox implementation
  +
Documentation=man:busybox(1) http://smarden.org/runit/
   
  +
[Service]
== runit を使う ==
 
  +
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}}
   
  +
{{hc|1=${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/busybox-runit.service|2=[Unit]
* {{ic|sv}} - サービスの制御、サービスの状態の取得、依存関係のチェックなどに使います。
 
  +
Description=Runit service supervision - BusyBox implementation
* {{ic|chpst}} - メモリ制限、コア制御、データセグメント、ユーザー・グループの権限などプロセスの環境を制御します。
 
  +
Documentation=man:busybox(1) http://smarden.org/runit/
* {{ic|runsv}} - プロセスを監視してログを保存します。
 
* {{ic|svlogd}} - シンプルで強力なロガー。時間や容量などによる自動ローテート、ポストプロセス、パターンマッチ、ソケット (リモートログ) などが使えます。logrotate でログをローテートする必要はもうありません。
 
* {{ic|runsvchdir}} - サービスレベル (ランレベル) を変更します。
 
* {{ic|runsvdir}} - 監視ツリーを起動します。
 
* {{ic|runit-init}} - dietlibc が静的にコンパイルされた PID 1 です。PID 1 として必要なことしかしません。
 
   
  +
[Service]
使用方法については man ページを読んでください。
 
  +
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]
Runit はシンボリックリンクのディレクトリを使ってランレベルを指定します。ただし {{ic|/etc/runit/1}}, {{ic|/etc/runit/2}}, {{ic|/etc/runit/3}} に定義されるランレベルは別です。
 
  +
WantedBy=default.target}}
   
  +
{{Note|
1 はシステムをブートストラップし、2 は {{ic|/service}} の runsvdir を起動し、3 はシステムを停止します。
 
  +
* このユニットファイルの例では、有効なサービスを含むディレクトリがシステムインスタンスの場合は {{ic|/var/service}}、ユーザーインスタンスは {{ic|$HOME/service}} であることを前提としています。このパスは、それぞれの特定の使用例に応じて変更できます。
  +
* {{ic|SIGHUP}} kill シグナルは、デフォルトの {{ic|SIGTERM}} の代わりに、メインの ''runsvdir'' プロセスでのみ使用されます ({{ic|1=KillMode=process}} のおかげで) これにより、BusyBox の runit 実装によって制御されているプロセスは、スーパーバイザーを終了する前に ''runsvdir'' によって制御可能に停止されます。''runsvdir'' が {{ic|SIGHUP}} シグナルを受信した後に監視されているプロセスを終了すると、ステータスコード 111 で終了します。これは成功として解釈する必要があります。}}
   
  +
作成した systemd ユニットファイルに従って、''runsvdir'' が監視するディレクトリを必ず作成してください。runit サービスを保存できるディレクトリ (通常は {{ic|/etc/sv}}) を作成し、監視対象のディレクトリから runit サービスへのシンボリックリンクを作成して、必要な場合にのみ有効にすることもお勧めします。詳細については、[[Runit#一般的な使用| 一般的な使用方法]] を参照してください。
ランレベル 2 では、好きな数だけサービスレベルを使うことができます。{{ic|/etc/runit/runsvdir/}} に作成した (サービスディレクトリのシンボリックリンクが含まれた) ディレクトリを指定して runschdir を実行できます。{{ic|runsvchdir <theservicedir>}} を実行するだけで他のマシンのサービスを引き継ぐことができるため、HA (フェイルオーバー) 構成で非常に便利です。
 
   
  +
すべてが正しく設定されている場合、{{ic|busybox-runit.service}} は [[systemd#ユニットを使う|有効化され、開始されます]]
ユーザーレベルの監視ディレクトリを作成して依存関係のサービスレベルのツリーを実行することもできます。下の[[#ユーザーレベルサービス|ユーザーレベルサービス]]を見てください。
 
   
=== 一般的な使用方法 ===
+
==== 標準 Runit の使用 ====
   
  +
runit を、デフォルトの Arch Linux の init システム ([[systemd]]) と一緒に単純なプロセススーパーバイザーとして使用することができます。この目的のために、ステージスクリプトを必要としないベアボーン Runit インストールを提供する {{aur|runit-systemd}} をインストールします ({{ic|<nowiki>/etc/runit/{1..3}</nowiki>}}) またはランレベル ({{ic|/etc/runit/runsvdir/*}}) これらは通常、runit を init システムとして使用する場合にのみ役立ちます。 このパッケージは、目的の runit サービスを配置できるディレクトリ ({{ic|/var/service}}) と、そのディレクトリの runit 監視を開始する systemd ユニットを提供します。{{ic|/var/service}} で設定されたサービスのみが runit によって監視されます。{{ic|runit.service}} を [[systemd#ユニットを使う|有効にして開始]] するだけです。
実行中のサービスを確認:
 
   
  +
== 使い方 ==
{{hc|# 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}}
 
   
  +
=== ツール ===
サービスは {{ic|/etc/sv}} に存在している必要があります。
 
   
  +
* {{ic|sv}} - サービスの制御、サービスの状態の取得、依存関係のチェックなどに使います。
サービスを作成して起動:
 
  +
* {{ic|chpst}} - メモリ制限、コア制御、データセグメント、ユーザー・グループの権限などプロセスの環境を制御します。
  +
* {{ic|runsv}} - プロセスを監視してログを保存します。
  +
* {{ic|svlogd}} - シンプルで強力なロガー。時間や容量などによる自動ローテート、ポストプロセス、パターンマッチ、ソケット (リモートログ) などが使えます。logrotate でログをローテートする必要はもうありません。
  +
* {{ic|runsvchdir}} - サービスレベル (ランレベル) を変更します。
  +
* {{ic|runsvdir}} - 監視ツリーを起動します。
   
  +
使用方法については man ページを読んでください。
{{bc|# ln -s /etc/sv/ssh /service/ssh}}
 
   
サービスをすぐに停止:
+
=== ランレベルとサービスディレクトリ ===
   
  +
Runit は、シンボリックリンクのディレクトリを使用して、/etc/runit/1、2、および 3 で定義されている 3 つの主要なランレベル以外のランレベルを指定します。
{{bc|# sv d ssh}}
 
   
  +
1 はシステムをブートストラップし、2 は /service 上で runvdir を開始し、3 はシステムを停止します。
サービスを再起動:
 
   
  +
ランレベル 2 では、好きな数だけサービスレベルを使うことができます。{{ic|/etc/runit/runsvdir/}} に作成した (サービスディレクトリのシンボリックリンクが含まれた) ディレクトリを指定して runschdir を実行できます。{{ic|runsvchdir <theservicedir>}} を実行するだけで他のマシンのサービスを引き継ぐことができるため、HA (フェイルオーバー) 構成で非常に便利です。
{{bc|# sv t ssh}}
 
   
  +
ユーザーレベルの監視ディレクトリを用意することで、依存するサービス レベルのツリーを実行することもできます。以下のユーザーレベルのサービスを参照してください。
サービスをリロード:
 
   
  +
デフォルトでは、runit-run パッケージは、/etc/runit/runsvdir/archlinux-default で定義され、/etc/runit/runsvdir/default にシンボリックリンクされている非常に最小限のサービスセットを使用します。
{{bc|# sv h ssh}}
 
   
  +
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 はバックグラウンドなしで並列起動できるようになります。
{{bc|# sv s ssh}}
 
   
  +
=== 一般的な使用方法 ===
サービスを停止して無効化:
 
 
{{bc|# rm /service/ssh}}
 
 
詳しくは {{ic|sv}} の man ページを見てください。
 
 
システムをシャットダウン:
 
 
{{bc|# runit-init 0}}
 
 
システムを再起動:
 
 
{{bc|# runit-init 6}}
 
 
== ユーザーレベルサービス ==
 
 
特定のユーザーで runsvdir を実行することで監視ツリーを拡張してユーザーに制御を渡すことができます。
 
 
=== ユーザーレベルサービスツリーを追加 ===
 
   
  +
この説明では、{{ic|/var/service}} は ''runsvdir'' によって管理される選択されたサービスディレクトリであり、{{ic|/etc/sv}} は有効にできるサービスを含むために選択されたディレクトリです。
{{bc|# mkdir -p /etc/sv/homes/joeuser}}
 
   
  +
{{Tip|サービスディレクトリへの完全なパスの指定は、[[環境変数]] {{ic|SVDIR}} を設定してサービスディレクトリのパスを示すように設定することで回避できます。たとえば、{{ic|1=SVDIR=/var/service}} の場合、{{ic|sv status /var/service/''servicename''}} は {{ic|sv status ''servicename''}} になります。}}
以下の内容で {{ic|/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
 
   
  +
# sv status /var/service/*
{{bc|# chmod 700 /etc/sv/homes/joeuser/run}}
 
  +
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
   
  +
* サービスを作成して開始します。
それから {{ic|/etc/sv/homes/joeuser}} から {{ic|/service}} にシンボリックリンクを作成すると、{{ic|~/service}} に配置されたサービスがユーザーの環境で起動するようになります。
 
   
  +
# ln -s /etc/sv/ssh /var/service/ssh
=== ユーザーの X セッションサービスを作成 ===
 
   
  +
* サービスをすぐに停止します (次回の起動時に開始されます)
{{bc|# mkdir -p /etc/sv/joeuserX}}
 
   
  +
# sv down /var/service/ssh
以下の内容で {{ic|/etc/sv/joeuserX/run}} スクリプトを作成:
 
   
  +
* 以前に停止されたサービス、または自動的に開始されないように設定されているサービスを開始します。
#!/bin/sh
 
exec 2>&1 \
 
su -c xinit - joeuser
 
   
  +
# sv up /var/service/ssh
{{bc|# chmod 700 /etc/sv/joeuserX/run}}
 
   
  +
* サービスを再起動します
{{ic|/etc/sv/joeuserX}} から {{ic|/service}} にシンボリックリンクを作成してください。joe の X セッションは常には動作しなくなります。joe の ssh のパスフレーズを使って防護するには、{{ic|.xinitrc}} に以下を記述してください:
 
   
  +
# sv restart /var/service/ssh
#!/bin/sh
 
...
 
SNIP
 
...
 
xscreensaver&
 
eval $(keychain --eval)
 
exec sh -c \
 
'SSH_ASKPASS=/usr/lib/openssh/ssh-askpass-fullscreen ssh-add < /dev/null \
 
&& exec stumpwm'
 
   
  +
* サービスをリロードします
{{ic|stumpwm}} は使用したいウィンドウマネージャやデスクトップ環境のコマンドに置き換えてください。
 
   
  +
# sv reload /var/service/ssh
{{Pkg|keychain}} と {{AUR|ssh-askpass-fullscreen}} パッケージが必要です。
 
   
  +
* サービスとそのログサービスのステータスを示します。
== ヒントとテクニック ==
 
   
  +
# sv status /var/service/ssh
=== メモリ上で PostgreSQL の読み取り専用スレーブデータベースを実行 ===
 
   
  +
* サービスを停止し、無効にします (次回の起動時に開始されません)
以下のレシピは非常に高速な読み取り速度を必要とするデータベースのためのものです。PostgreSQL のストリーミングレプリケーションとホットスタンバイモードを使っています。
 
   
  +
# rm /var/service/ssh
==== 要件 ====
 
   
  +
== ユーザーサービス ==
* [[PostgreSQL]] 9.0 以上
 
* {{AUR|arch-runit-services}}
 
* [[Rsync]]
 
   
  +
ユーザー監視ツリーを作成するには、[[Systemd/ユーザー]] サービスを使用する方法と runit 自体を使用する方法の 2 つがあります。例については、[[Runit#BusyBox の実装の使用|BusyBox の実装の使用]] を参照してください。
==== 手順 ====
 
   
  +
=== サービス例 ===
1. {{ic|/etc/sv/pg_mem/log}} ディレクトリを作成:
 
{{bc|# mkdir -p /etc/sv/pg_mem/log}}
 
   
  +
{{Note|この例では、サービスが {{ic|~/.config/sv}} に保存されており、runsvdir が {{ic|~/service}} であると想定しています。設定に合わせて変更する必要があります。}}
2. 以下の3つのファイルを作成
 
   
  +
サービスを保存するディレクトリを作成します。
{{hc|/etc/sv/pg_shm/run|<nowiki>
 
#!/bin/sh -e
 
sleep 3 # Give postgresql a chance to start and replay any transactions
 
   
  +
$ mkdir -p ~/.config/sv
. /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
 
   
  +
$ mkdir ~/.config/sv/mpd
sv -w7 c postgresql 2>&1
 
   
  +
サービスディレクトリに {{ic|run}} ファイルを [[作成]] します。実行ファイルの例は [http://smarden.org/runit/runscripts.html runit のサイト] にあります。
# 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
 
   
  +
{{hc|1=$HOME/.config/sv/mpd/run|2=
# Set up the hot standby mode on the slave server
 
  +
#!/bin/sh
echo "hot_standby = 'on'" >> "$PGROOT/data/postgresql.conf"
 
  +
MPDCONF=${XDG_CONFIG_HOME:-$HOME/.config}/mpd/mpd.conf
echo "port = $PGPORT" >> "$PGROOT/data/postgresql.conf"
 
  +
exec mpd --no-daemon $MPDCONF
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</nowiki>}}
 
   
  +
サービスを有効にするには、サービスディレクトリへのシンボリックリンクを作成します。これにより、runit の開始時にサービスが自動的に開始されます。サービスはすぐに開始されるはずです。
{{hc|/etc/conf.d/pg_shm|<nowiki>
 
PGROOT=/dev/shm/pg_mem
 
PGPORT=5434
 
PGLOG="/var/log/pg_mem.log"</nowiki>}}
 
   
  +
$ ln -s ~/.config/sv/mpd ~/service/mpd
{{hc|/etc/sv/postgresql/finish|
 
#/bin/sh
 
sv -v i pg_shm}}
 
   
  +
サービスを停止するには:
3. run と finish に実行可能属性を付与:
 
{{bc|# chmod 700 /etc/sv/pg_mem/run}}
 
{{bc|# chmod 700 /etc/sv/postgresql/finish}}
 
   
  +
$ SVDIR=~/service sv down mpd # or
4. ログサービスを作成:
 
  +
$ sv down ~/service/mpd
{{bc|# ln -s /usr/bin/rsvlog /etc/sv/pg_shm/log/run}}
 
   
  +
サービスを再度開始するには:
5. {{ic|/var/lib/postgres/data/postmaster.conf}} を編集して WAL アーカイブを有効にしてください。詳しくは [http://wiki.postgresql.org/wiki/Streaming_Replication#How_to_Use こちら] のステップ3と4を見てください。
 
   
  +
$ SVDIR=~/service sv up mpd # or
6. postgresql を再起動:
 
  +
$ sv up ~/service/mpd
{{bc|# sv i postgresql}}
 
   
  +
== 参照 ==
7. pg_shm を起動:
 
{{bc|# ln -s /etc/sv/pg_shm /service}}
 
   
  +
* [http://smarden.org/runit/ Runit's Homepage]. G Pape's runit ホームページ
8. 動作していることを確認:
 
{{bc|# sv s postgresql pg_mem}}
 
   
  +
* [https://docs.voidlinux.org/config/services/index.html Voidlinux Handbook - Services and Daemons - runit]. Void linux ハンドブックの runit に関するセクション。
PostgreSQL のオンディスクデータベースのレプリカがポート 5434 から読み取り専用モードで使うことができるはずです。
 

2023年8月28日 (月) 23:15時点における最新版

関連記事

警告: 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 - 監視ツリーを起動します。

使用方法については 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/servicerunsvdir によって管理される選択されたサービスディレクトリであり、/etc/sv は有効にできるサービスを含むために選択されたディレクトリです。

ヒント: サービスディレクトリへの完全なパスの指定は、環境変数 SVDIR を設定してサービスディレクトリのパスを示すように設定することで回避できます。たとえば、SVDIR=/var/service の場合、sv status /var/service/servicenamesv status servicename になります。
  • 実行中のサービスのリスト:
# 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 の実装の使用 を参照してください。

サービス例

ノート: この例では、サービスが ~/.config/sv に保存されており、runsvdir が ~/service であると想定しています。設定に合わせて変更する必要があります。

サービスを保存するディレクトリを作成します。

$ 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

参照