나는 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"으로 간주됩니다.
이는 기존 초기화 시스템에서 실행 수준을 변경하는 것과 유사합니다. isolate 명령은 현재 사용 중인 그래픽 환경이나 터미널을 포함하여 새 장치에서 활성화되지 않은 프로세스를 즉시 중지합니다.
이는 AllowIsolate=가 활성화된 장치에서만 허용됩니다. 자세한 내용은 systemd.unit(5)을 참조하세요.
종료 시 ${CUSTOM_TARGET}
Wants
/ 섹션을 업데이트하는 서비스를 작성할 수도 있습니다 .After
답변2
이를 위해서는 Puppet이나 Ansible과 같은 구성 관리자를 사용해야 한다고 생각합니다. 구성 관리자는 시스템을 원하는 방식으로 유지하는 가장 좋은 방법입니다. Systemd 스냅샷은 재부팅 후에도 유지되지 않습니다.