私は、systemd によって制御される多数のデーモンを持つ Linux サーバーの設定に取り組んでいます。デーモンはターゲットにグループ化されているため、グループ単位で起動および停止できますが、システム管理者は個々のサービスを手動で制御できます。再起動しても状態 (どのサービスがアクティブ化されているか) を保持する方法を探しています。そのアイデアは、サーバー上でデバッグ、テスト、および開発を行う人が必要に応じてサーバーを再起動し、再起動前と同じ構成でシステムを起動できるようにすることです。
systemd のsnapshot
機能はこれには理想的に思えますが、私の知る限り、後で使用するためにスナップショットをディスクに書き込むことはできません。
multi-user.target.wants/
当初の計画では、 からというサービスへのシンボリックリンクを作成することになっていましたbootingup.service
。システム管理者がアクティブ化するすべてのターゲットは、アクティブ化されたばかりのターゲットを起動するように書き換えられますbootingup.service.d/bootingup.conf
。つまり、起動時にシステムは最後に起動されたターゲットをアクティブ化しますが、個別にアクティブ化/非アクティブ化されたサービスは記憶しません。
再起動後も systemd にすべてのサービスの状態を記憶させる方法はありますか?
答え1
この答えは次のように始めたいと思います。
実行中のものをダンプして復元するのではなく、開発者に、、、などをサービス内で適切にenable
使用disable
するafter
ようwants
に強制することをお勧めします。systemd
これでもう気持ちが晴れた...
systemctl snapshot
あなたが探しているものを実現するのに役立ちます。
を実行すると、systemctl snapshot ${SNAPSHOT_NAME}
systemd
というユニットが作成されます${SNAPSHOT_NAME}.snapshot
。このユニットはメモリ内にのみ存在するようです。ただし、 を使用してクエリすることは可能ですsystemctl
。
を使用すると、スナップショット用に収集されたsystemctl show ${SNAPSHOT_NAME}.snapshot
すべての情報が一覧表示されます。systemd
特に注目すべきは、スナップショットの時点でアクティブだったすべてのユニットを一覧表示するWants=
/After=
セクション (どちらも同じように見えます) です。そのリストを解析してカスタム ターゲットに投入すると、 を使用して目的の結果を実現できますsystemctl isolate ${CUSTOM_TARGET}
。
コマンドラインで指定されたユニットとその依存関係を起動し、その他すべてを停止します。拡張子のないユニット名が指定された場合は、「.target」という拡張子が想定されます。
これは、従来の init システムでランレベルを変更するのと似ています。isolate コマンドは、新しいユニットで有効になっていないプロセスを直ちに停止します。これには、現在使用しているグラフィカル環境やターミナルが含まれる可能性があります。
これは、AllowIsolate= が有効になっているユニットでのみ許可されることに注意してください。詳細については、systemd.unit(5) を参照してください。
${CUSTOM_TARGET}
Wants
シャットダウン時に/セクションを更新するサービスを作成することもできますAfter
。
答え2
これを実行するには、Puppet や Ansible などの構成マネージャーを使用する必要があると思います。構成マネージャーは、システムを希望どおりに保つための最良の方法です。Systemd スナップショットは、再起動すると保持されません。