Estou trabalhando na configuração de um servidor Linux que terá dezenas de daemons controlados pelo systemd. Os daemons são agrupados em alvos para que possam ser ativados e desativados em grupos, mas os administradores do sistema podem controlar manualmente serviços individuais. Estou procurando uma maneira de preservar o estado (quais serviços estão ativados) por meio de uma reinicialização. A ideia é que as pessoas que depuram, testam e desenvolvem no servidor possam reinicializá-lo, se necessário, e fazer com que o sistema volte à mesma configuração que estava antes da reinicialização.
A funcionalidade do systemd snapshot
parece ideal para isso, mas até onde sei, você não pode gravar um instantâneo no disco para uso posterior.
Meu plano inicial era criar um link simbólico multi-user.target.wants/
para um serviço chamado bootingup.service
. Cada alvo que o administrador do sistema ativa seria então reescrito bootingup.service.d/bootingup.conf
para lançar o alvo que acabou de ser ativado. Isso significaria que na inicialização o sistema ativaria o alvo lançado mais recentemente, mas não se lembraria de nenhum serviço que tenha sido ativado/desativado individualmente.
Existe uma maneira de fazer o systemd lembrar o estado de todos os serviços durante uma reinicialização?
Responder1
Vou começar esta resposta com:
Eu recomendo que você force os desenvolvedores a usar coisas como enable
, e nos serviços corretamente disable
, em vez de fazer um dump e restaurar o que está em execução.after
wants
systemd
Agora que tirei isso do meu sistema...
systemctl snapshot
pode ajudá-lo a fazer o que procura.
Ao executar systemctl snapshot ${SNAPSHOT_NAME}
systemd
cria uma unidade chamada ${SNAPSHOT_NAME}.snapshot
. Esta unidade parece existir apenas na memória. No entanto, você ainda pode consultá-lo usando systemctl
.
O uso systemctl show ${SNAPSHOT_NAME}.snapshot
listará todas as informações systemd
coletadas para o instantâneo, em particular as seções Wants=
/ After=
(que parecem iguais) que listam todas as unidades que estavam ativas no momento do instantâneo. Se você analisar essa lista e colocá-la em um destino personalizado, poderá alcançar o que procura usando o systemctl isolate ${CUSTOM_TARGET}
.
Inicie a unidade especificada na linha de comando e suas dependências e pare todas as outras. Se for fornecido um nome de unidade sem extensão, será assumida uma extensão ".target".
Isso é semelhante a alterar o nível de execução em um sistema init tradicional. O comando isolar interromperá imediatamente os processos que não estão habilitados na nova unidade, possivelmente incluindo o ambiente gráfico ou terminal que você está usando atualmente.
Observe que isso é permitido apenas em unidades onde AllowIsolate= está habilitado. Consulte systemd.unit(5) para obter detalhes.
Você pode até escrever um serviço que atualize as seções ${CUSTOM_TARGET}
Wants
/ After
no desligamento.
Responder2
Eu acho que você deveria usar algum gerenciador de configuração como Puppet ou Ansible para fazer isso, o gerenciador de configurações é a melhor maneira de manter seu sistema do jeito que você deseja. Os instantâneos do Systemd não persistem durante uma reinicialização.