Void Linux がメッチャ良い

systemd と journald があまり好きになれない。充実したコマンドセットはありがたいが、もっと何をしているのかを隠さないシステムが好ましい。

そうした思想を持ち、djbに傾倒するタイプの人間としては、やはり runit を init として利用するのは魅力的な選択肢に見える。というわけで runit を init に利用している Void Linux を利用してみた。

runit

素晴らしい体験。簡潔なコマンドとスクリプトで全てをdaemonizeでき、ログはタイムスタンプを付与されて然るべき場所へ整然と保存される。logrotateの設定を忘れることもない。全てが明瞭で軽量だ。

rootプロセスをdaemonizeするのと同様に、ユーザ権限で動作するプロセスをdaemonizeするのも簡単だ。プロセスのsuperviseを司る runsvdir プロセスは通常 /var/service を監視しているが、この中に「ユーザの ~/service を監視する runsvdir サービス」を定義することで、システム サービスと全く同じようにユーザごとのサービスを管理することができる。

これを利用して rclone をユーザ権限でdaemonizeさせたい場合、必要なのは以下の 非常に自明な 作業だけだ。

# create sv dir
mkdir -p ~/service/rclone/log

# create logger
cat << EOF > ~/service/rclone/log/run
#!/bin/sh
exec svlogd -ttt .
EOF

# create runner 
cat << EOF > ~/service/rclone/run
#!/bin/sh
exec 2>&1
[ ! -e ~/.config/rclone/rclone.conf ] && exit 1
exec rclone mount --dir-cache-time 5s hoge:/root/repo ~/remote
EOF

# create cleaner
cat << EOF > ~/service/rclone/finish
#!/bin/sh
# umount when process finished abnormally
umount ~/remote
EOF

# run 
cd ~/service/rclone; sv up .

その他にvsv という強化版サービス管理コマンド や、service ディレクトリではなく特定のディレクトリにログを置きたい人のための svlogger というツール も存在しており、これもメッチャクチャ便利。ツールの作者が自身を illumos 出身と称しているのも親近感が湧く。

xbps

私はパッケージマネージャのユーザビリティと動作速度を非常に重要視しているが、Void Linuxのxbpsパッケージマネージャには両方の点で満足している。簡潔な感想だが、不満は全くない。

Void Linuxは勧められるか?

自分が何を選ぼうとしているのか理解している人にとっては、期待を裏切らない良い選択肢 であり、勧められる。今のところ、汎用的に広く勧めようとは思っていない。

runitは簡潔で高速だが、注意深くはないようだ。というよりも物事を注意深く扱うことで生じる複雑さを排除して、簡潔さを提供しているように見える。

例えば service ディレクトリをいじり回していると、時々 sv start が上手くいかなくなったり、コンソールに fatal: unable to lock supervise/lock: temporary failure というログが溢れたりする。その場合、大抵はlockが取得できないサービスのプロセスがいないことを確認し、lockファイルを削除し、また sv start することで復帰する。runitが何をしているか、朧気にでも分かっていれば特に怖くはない話ではある。しかし複雑さと引き換えにしてでも安全なインターフェイスを必要とする場面では、Void Linuxという選択肢が正しいかどうかは分からない。