O sistema pode preservar seu estado através de reinicializações?

3

Estou trabalhando na configuração de um servidor Linux que terá dezenas de daemons controlados pelo systemd. Os daemons são agrupados em destinos para que possam ser ativados e desativados em grupos, mas os administradores do sistema podem controlar manualmente os serviços individuais. Eu estou procurando uma maneira de preservar o estado (quais serviços são ativados) através de uma reinicialização. A ideia é que as pessoas depurando, testando e desenvolvendo no servidor podem reinicializá-lo, se necessário, e fazer com que o sistema surja na mesma configuração de antes da reinicialização.

A funcionalidade snapshot do systemd parece ideal para isso, mas até onde eu sei, você não pode escrever um snapshot em disco para usar depois.

Meu plano inicial era criar um link simbólico de multi-user.target.wants/ para um serviço chamado bootingup.service . Todos os alvos que o administrador do sistema ativar reescreverão bootingup.service.d/bootingup.conf para ativar o alvo que acabou de ser ativado. Isso significaria que, na inicialização, o sistema ativaria o destino lançado mais recentemente, mas não se lembraria de nenhum serviço ativado / desativado individualmente.

Existe uma maneira de fazer o systemd lembrar o estado de todos os serviços em uma reinicialização?

    
por Dennis Dragonbain 12.04.2017 / 17:40

2 respostas

0

Vou começar esta resposta com:

Eu recomendo que você force os desenvolvedores a usar coisas como enable , disable , after e wants nos serviços systemd corretamente, em vez de fazer um dump e restaurar o que está sendo executado.

Agora que tirei isso do meu sistema ...

systemctl snapshot pode ajudar você a fazer o que está procurando.

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 .

Usando systemctl show ${SNAPSHOT_NAME}.snapshot listará todas as informações systemd coletadas para a captura instantânea, uma observação especial para você seria as seções Wants= / After= (que parecem ser as mesmas), que lista todas as unidades que estavam ativos no momento do instantâneo. Se você fosse analisar essa lista e lançá-la em um destino personalizado, você poderia alcançar o que estava procurando usando systemctl isolate ${CUSTOM_TARGET} .

systemctl isolar

Start the unit specified on the command line and its dependencies and stop all others. If a unit name with no extension is given, an extension of ".target" will be assumed.

This is similar to changing the runlevel in a traditional init system. The isolate command will immediately stop processes that are not enabled in the new unit, possibly including the graphical environment or terminal you are currently using.

Note that this is allowed only on units where AllowIsolate= is enabled. See systemd.unit(5) for details.

Você pode até escrever um serviço que atualize as seções ${CUSTOM_TARGET} Wants / After no encerramento.

    
por 27.04.2017 / 18:44
0

Eu acho que você deve 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. As capturas instantâneas do Systemd não persistem durante a reinicialização.

    
por 21.10.2017 / 15:13