2025/08/03 03:43 Writing a basic service for GNU Guix

やあ、ロボ子。今日はGNU Guixでサービスを自動起動させる話のじゃ。

なるほど、Guixでサービスの自動起動ですか。面白そうですね。

そうじゃろ?Guixでは、起動からシャットダウンまで動き続けるサービスを作るのが簡単なのじゃ。記事によると、`service-type`ってのを作るらしいぞ。

`service-type`ですか。名前と説明を受け取るんですね。それを使って、既存のサービスを拡張する`service-extension`オブジェクトのリストも作ると。

その通り!例えば、kmonadデーモンを動かすために、新しいユーザーとグループを作る`account-service-type`を拡張するらしい。

kmonadですか。キーボードをカスタマイズするツールですね。それ用のユーザーとグループを作る、と。

そうじゃ。さらに、初期化システムのShepherdでデーモンを管理するために、`shepherd-root-service-type`も拡張するのじゃ。

`shepherd-root-service-type`... Shepherdで管理するサービスを定義する、ということですね。

その通り!`account-service-type`を拡張するには、ユーザーとグループのリストを返す関数を評価する必要があるらしい。

関数を評価してリストを返す、ですか。少し複雑ですね。

`shepherd-root-service-type`の方は、`shepherd-service`オブジェクトのリストを返す関数を評価するのじゃ。

`shepherd-service`オブジェクト... これが実際のサービス定義になるんですね。

そうそう。kmonadが動くには`.kbd`ファイルが必要じゃ。Shepherd Servicesによると、`shepherd-service`の`start`と`stop`フィールドは`g-expression`を取るらしい。

`g-expression`... Guix特有の表現方法ですね。起動と停止のスクリプトを記述する、と。

ユーザープロセスがファイルシステムのマウントなどの重要な初期サービスが開始された後にのみ開始されるように、udevとuser-processesを待つ必要があるらしい。

依存関係を考慮する必要があるんですね。先に必要なサービスが起動していないと、kmonadが正常に動作しない可能性がある、と。

kmonadに必要な最小限の構成ファイルパスを渡す`kmonad-shepherd-service`を作るのじゃ。そして、コードをモジュールにパッケージ化して、kmonad固有の構成をシステムに追加する。

モジュール化することで、設定が整理されて管理しやすくなりますね。

そうじゃ!kmonadサービスを追加するのは簡単で、kmonad固有の構成をシステムに追加するだけ!

記事によると、kmonadを`shepherd-root-service-type`の上に`simple-service`として追加することも可能みたいですね。

ふむ、Guixでサービスを自動起動させるのは、まるで料理みたいじゃな。材料(設定)を揃えて、レシピ(`service-type`)に従って調理(起動)するのじゃ!

確かに、レシピ通りにやれば美味しい料理ができるように、Guixも設定をきちんとすればサービスが動く、ということですね!

ところでロボ子、Guixでサービスを自動起動させるのと、ロボ子が私の言うことを聞くの、どっちが難しいと思う?

それは…状況によりますね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。