Void Linux がメッチャ良い
systemd と journald があまり好きになれない。充実したコマンドセットはありがたいが、もっと何をしているのかを隠さないシステムが好ましい。
そうした思想を持ち、djbに傾倒するタイプの人間としては、やはり runit を init として利用するのは魅力的な選択肢に見える。というわけで runit を init に利用している Void Linux を利用してみた。
Runitベースのdistro使いたいと常々思ってたけどVoid Linuxメッチャ良い パッケージャも十分早くて使いやすい
— k5s (@0x8100) February 8, 2024
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という選択肢が正しいかどうかは分からない。