「Runit」の版間の差分
(翻訳) |
Kusakata.bot (トーク | 投稿記録) (Pkg/AUR テンプレートの更新) |
||
14行目: | 14行目: | ||
* {{AUR|sysvinit}} パッケージをインストール ({{Pkg|systemd-sysvcompat}} を置き換えるかという質問に Yes と答えてください)。 |
* {{AUR|sysvinit}} パッケージをインストール ({{Pkg|systemd-sysvcompat}} を置き換えるかという質問に Yes と答えてください)。 |
||
− | * {{AUR|arch-runit}} パッケージをインストール。 |
+ | * {{AUR|arch-runit}}{{Broken package link|パッケージが存在しません}} パッケージをインストール。 |
* デフォルトランレベルを選択・作成 ([[#ランレベルとサービスディレクトリ]]を参照)。 |
* デフォルトランレベルを選択・作成 ([[#ランレベルとサービスディレクトリ]]を参照)。 |
||
* ブートローダーのカーネルコマンドラインに {{ic|1=init=/sbin/runit-init}} を追加。 |
* ブートローダーのカーネルコマンドラインに {{ic|1=init=/sbin/runit-init}} を追加。 |
||
21行目: | 21行目: | ||
試すだけを init を置き換えるところまでしたくない場合、Arch 標準の systemd と共存するようにインストールして、{{ic|/var/service}} に配置したサービスのプロセスを監視することもできます。 |
試すだけを init を置き換えるところまでしたくない場合、Arch 標準の systemd と共存するようにインストールして、{{ic|/var/service}} に配置したサービスのプロセスを監視することもできます。 |
||
− | * {{AUR|arch-runsvdir-init}} パッケージをインストール。 |
+ | * {{AUR|arch-runsvdir-init}}{{Broken package link|パッケージが存在しません}} パッケージをインストール。 |
* 既存の init ({{ic|inittab}}, {{ic|rc.local}}, systemd など) を使って {{ic|runsvdir /var/service}} を起動。 |
* 既存の init ({{ic|inittab}}, {{ic|rc.local}}, systemd など) を使って {{ic|runsvdir /var/service}} を起動。 |
||
{{AUR|arch-runit-services}} パッケージは {{ic|/etc/sv}} にサービスを保存して {{ic|/usr/bin/rsvlog}} をロガーとして使います。 |
{{AUR|arch-runit-services}} パッケージは {{ic|/etc/sv}} にサービスを保存して {{ic|/usr/bin/rsvlog}} をロガーとして使います。 |
||
− | {{AUR|arch-runsvdir-init}} に新しいランレベルを作成して {{ic|/etc/runit/runsvdir/all}} に作成したサービスディレクトリにシンボリックリンクを張ります。そして {{ic|/usr/bin/nsvlog}} スクリプトを使ってログを記録します。 |
+ | {{AUR|arch-runsvdir-init}}{{Broken package link|パッケージが存在しません}} に新しいランレベルを作成して {{ic|/etc/runit/runsvdir/all}} に作成したサービスディレクトリにシンボリックリンクを張ります。そして {{ic|/usr/bin/nsvlog}} スクリプトを使ってログを記録します。 |
== runit を使う == |
== runit を使う == |
2017年10月7日 (土) 22:45時点における版
関連記事
Runit はプロセススーパーバイザーです。pid1 として sysv の init を置き換えることができる runit-init
が含まれており、inittab から起動することができます。他の init システムを使うこともできます。Runit はシンプルなツールの集合であり、柔軟性のある依存関係や分散された環境を構築することができます。また、ランレベルの変更を極めて高速に行うことが可能です。
詳しくは G. Pape の Runit のページ を見てください。以下では Arch に Runit をインストールする方法を説明します。
目次
インストール
init を runit-init で置き換える場合:
- sysvinitAUR パッケージをインストール (systemd-sysvcompat を置き換えるかという質問に Yes と答えてください)。
- arch-runitAUR[リンク切れ: パッケージが存在しません] パッケージをインストール。
- デフォルトランレベルを選択・作成 (#ランレベルとサービスディレクトリを参照)。
- ブートローダーのカーネルコマンドラインに
init=/sbin/runit-init
を追加。 - 再起動。
試すだけを init を置き換えるところまでしたくない場合、Arch 標準の systemd と共存するようにインストールして、/var/service
に配置したサービスのプロセスを監視することもできます。
- arch-runsvdir-initAUR[リンク切れ: パッケージが存在しません] パッケージをインストール。
- 既存の init (
inittab
,rc.local
, systemd など) を使ってrunsvdir /var/service
を起動。
arch-runit-servicesAUR パッケージは /etc/sv
にサービスを保存して /usr/bin/rsvlog
をロガーとして使います。
arch-runsvdir-initAUR[リンク切れ: パッケージが存在しません] に新しいランレベルを作成して /etc/runit/runsvdir/all
に作成したサービスディレクトリにシンボリックリンクを張ります。そして /usr/bin/nsvlog
スクリプトを使ってログを記録します。
runit を使う
ツール
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
は使用したいウィンドウマネージャやデスクトップ環境のコマンドに置き換えてください。
keychain と ssh-askpass-fullscreenAUR パッケージが必要です。
Tips and tricks
メモリ上で 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 から読み取り専用モードで使うことができるはずです。