私は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」と見なされます。
これは、既存の初期化システムで実行レベルを変更するのと似ています。検疫コマンドは、現在使用中のグラフィック環境または端末を含む可能性のある新しいデバイスでアクティブでないプロセスをただちに停止します。
これはAllowIsolate =が有効になっているデバイスでのみ許可されます。詳細については、systemd.unit(5)を参照してください。
${CUSTOM_TARGET}
Wants
終了時に更新/部分的にサービスを作成することもできますAfter
。
答え2
これを行うには、PuppetやAnsibleなどの設定マネージャを使用する必要があると思います。構成マネージャーは、システムを希望の方法で維持する最良の方法です。システムスナップショットは、再起動後も維持されません。