Como o systemd usa scripts /etc/init.d?

120

Acabei de mudar para o debian jessie, e a maioria das coisas corre bem, incluindo meu gerente de exibição gráfica wdm.

O problema é que eu simplesmente não entendo como isso funciona. Obviamente, meu /etc/init.d/wdmscript é chamado, porque quando eu coloco um início exitlá, o wdm não é iniciado. Mas quando eu renomeio o diretório /etc/rc3.d (meu nível de execução padrão costumava ser 3), o wdm ainda é iniciado.

Não consegui descobrir como o systemd encontra esse script e não entendo o que ele faz com todos os outros scripts init.d.

  • Quando e como o systemd executa scripts init.d?
  • A longo prazo, devo me livrar de todos os scripts init.d?
Martin Drautzburg
fonte

Respostas:

166

A resposta do caos é o que diz alguma documentação. Mas não é o que o systemd realmente faz. (Também não foi o que van Smoorenburg rcfez. A van Smoorenburgrc definitivamente não ignorou os cabeçalhos LSB, que insservcostumavam calcular pedidos estáticos para iniciantes.) A documentação do Freedesktop, como a página "Incompatibilidades", está de fato errada, na verdade. esses e outros pontos. (A HOMEvariável de ambiente, na verdade, é frequentemente definida, por exemplo. Isso ficou totalmente sem documentação em qualquer lugar por um longo tempo. Agora está documentada no manual, pelo menos, mas essa página do Freedesktop WWW ainda não foi corrigida.)

O formato de serviço nativo para systemd é a unidade de serviço . o gerenciamento de serviços do systemd propriamente dito opera apenas em termos daqueles, que são lidos em um dos nove diretórios em que os .servicearquivos (em todo o sistema) podem viver. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, E /usr/lib/systemd/systemsão quatro desses diretórios.

A compatibilidade com os rcscripts de van Smoorenburg é alcançada com um programa de conversão chamado systemd-sysv-generator. Este programa está listado no /usr/lib/systemd/system-generators/diretório e, portanto, é executado automaticamente pelo systemd no início do processo de autoinicialização a cada inicialização e novamente sempre que o systemd é instruído a recarregar sua configuração posteriormente.

Este programa é um gerador , um tipo de utilitário auxiliar cuja tarefa é criar arquivos de unidades de serviço em tempo real, em um tmpfs onde estão localizados mais três desses nove diretórios (que devem ser usados ​​apenas por geradores). systemd-sysv-generatorgera as unidades de serviço que executam os rcscripts de van Smoorenburg /etc/init.d, se não encontrar uma unidade de serviço systemd nativa com esse nome já existente nos outros seis locais.

O gerenciamento de serviços systemd conhece apenas unidades de serviço. Essas unidades de serviço (re) geradas automaticamente são gravadas para chamar os rcscripts de van Smoorenburg . Eles têm, entre outras coisas:

[Unidade]
SourcePath = / etc / init.d / wibble
[Serviço]
ExecStart = / etc / init.d / wibble start
ExecStop = / etc / init.d / wibble stop

A sabedoria recebida é que os rcscripts de van Smoorenburg devem ter um cabeçalho LSB e são executados em paralelo sem respeitar as prioridades impostas pelo /etc/rc?.d/sistema. Isso está incorreto em todos os pontos.

Na verdade, eles não precisam de ter um LSB cabeçalho, e não se o fizerem systemd-sysv-generatorpodem reconhecer os mais limitados old comment RedHat cabeçalhos ( description:, pidfile:e assim por diante). Além disso, na ausência de um cabeçalho LSB, ele retornará ao conteúdo dos /etc/rc?.dfarms de links simbólicos, lendo as prioridades codificadas nos nomes dos links e construindo um pedido antes / depois deles, serializando os serviços. Os cabeçalhos LSB não são apenas um requisito, e eles próprios não apenas codificam pedidos antes / depois que serializam as coisas até certo ponto, como também o comportamento de fallback em sua ausência completa é uma operação significativamente não paralela.

O motivo que /etc/rc3.dnão pareceu importar é que você provavelmente teve esse script ativado por outro /etc/rc?.d/diretório. systemd-sysv-generatortraduz a ser incluída em qualquer das /etc/rc2.d/, /etc/rc3.d/e /etc/rc4.d/em um nativa Wanted-Byrelação ao Systemd de multi-user.target. Os níveis de execução são "obsoletos" no mundo do sistema e você pode esquecê-los.

Leitura adicional

JdeBP
fonte
2
Em Debian O diretório do sistema-geradores não vive em / usr / lib, mas / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam
5
Esta é uma resposta incrível e direta. Muito bem, senhor.
peelman
1
Obrigado, obrigado, obrigado por isso! Lidar com uma mistura de sistemas Debian 8 e RH / CentOS 7 fez com que o gerenciamento do serviço SysVInit vs Systemd dependesse um pouco da dor de cabeça, mas essa explicação do que o systemd está fazendo ajudou muito meu entendimento.
Toby
Este gerador funciona. Eu também mencionaria, para os seguidores, que se você tiver uma versão mais antiga systemde um script /etc/init.d não estiver definido como "boot on start", ele ainda funcionará conforme o esperado, mas não aparecerá no diretório listas show-units: unix.stackexchange.com/a/518894/8337
rogerdpack
Este gerador funciona. Eu também mencionaria, para os seguidores, que se você tiver uma versão mais antiga do systemd e um script /etc/init.d que não esteja definido como "boot on start", ele ainda será iniciado / interrompido conforme o esperado, usando systemctl, mas ganhou não aparece nas listas show-units: unix.stackexchange.com/questions/517872/… e também que você basicamente "não pode" controlar esse serviço executando o /etc/init.d/xx diretamente ou o systemd obtém ... confuso quanto ao que está sendo executado e o que não é: |
rogerdpack
17

O Systemd é compatível com os scripts de inicialização do SysV. De acordo com o LSB 3.1, o script init deve ter Convenções de Comentários informativas , definindo quando o script deve iniciar / parar e o que é necessário para o script iniciar / parar. Isto é um exemplo:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Esta é uma seção comentada que é ignorada pelo SysV. Por outro lado, o systemd lê essas informações de dependência e executa esses scripts, dependendo disso.

Mas há um ponto em que systemd e SysV diferem em termos de scripts init. O SysV executa os scripts em ordem seqüencial com base no número no nome do arquivo. Systemd não. Se as dependências forem atendidas, o systemd executará os scripts imediatamente, sem respeitar a numeração dos nomes dos scripts. Alguns deles provavelmente falharão devido à encomenda. Existem muitas outras incompatibilidades que devem ser consideradas.


Se houver scripts init e arquivos .service para o mesmo serviço, o systemd executará ambos, assim que as dependências forem atendidas (no caso do script init, aquelas definidas no cabeçalho LSB).

caos
fonte
Ok, mas também tenho um monte de arquivos .service em / lib / systemd / system /. O que o systemd realmente executa? O que está especificado nos arquivos de serviço (em ordem de dependência), nos scripts init.d ou em ambos?
Martin Drautzburg
@MartinDrautzburg Adicionei isso à resposta
caos
1
Como nota de rodapé, o Debian acaba de anunciar o despejo de compatibilidade com LSB: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Jan
systemd é qualquer coisa, mas compatível com scripts SysV. Essa declaração não é apenas incorreta, mas o link referenciado deixa claro que é apenas "principalmente compatível" e a quantidade de esforço necessária para produzir os mesmos resultados é escandalosamente enorme.
Julie em Austin