In che modo systemd usa gli script /etc/init.d?


120

Sono appena passato a debian jessie e la maggior parte delle cose vanno bene, incluso il mio display manager grafico wdm.

Il fatto è che non capisco come funzioni. Ovviamente la mia /etc/init.d/wdmsceneggiatura si chiama, perché quando ci ho messo presto exit, wdm non è stato avviato. Ma quando in alternativa rinominare la directory /etc/rc3.d (il mio runlevel predefinito era 3), allora wdm è ancora avviato.

Non sono riuscito a scoprire come systemd trova questo script e non capisco cosa faccia a tutti gli altri script init.d.

  • Quando e in che modo systemd esegue gli script init.d?
  • A lungo termine, dovrei sbarazzarmi di tutti gli script init.d?

Risposte:


166

la risposta del caos è ciò che dicono alcuni documenti. Ma non è quello che fa effettivamente systemd. (Non è nemmeno quello che ha fatto van Smoorenburg rc. Il van Smoorenburgrc sicuramente non ha ignorato le intestazioni LSB, che insservper calcolare gli ordini statici, per cominciare.) La documentazione di Freedesktop, come quella pagina "Incompatibilità", è in realtà errata, su questi e altri punti. (La HOMEvariabile d'ambiente infatti è spesso impostata, ad esempio. È rimasta completamente priva di documenti ovunque per lungo tempo. Ora è almeno documentata nel manuale, ma la pagina WWW di Freedesktop non è ancora stata corretta.)

Il formato di servizio nativo per systemd è l' unità di servizio . La corretta gestione dei servizi di systemd opera esclusivamente in termini di quelli, che legge da una delle nove directory in cui i file (a livello di sistema) .servicepossono vivere. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, E /usr/lib/systemd/systemsono quattro di queste directory.

La compatibilità con gli rcscript di van Smoorenburg è ottenuta con un programma di conversione, denominato systemd-sysv-generator. Questo programma è elencato nella /usr/lib/systemd/system-generators/directory e viene quindi eseguito automaticamente da systemd all'inizio del processo bootstrap ad ogni avvio, e di nuovo ogni volta che viene richiesto a systemd di ricaricare la sua configurazione in un secondo momento.

Questo programma è un generatore , un tipo di utilità ausiliaria il cui compito è quello di creare file di unità di servizio al volo, in un tmpfs in cui si trovano altre tre di quelle nove directory (che sono destinate ad essere utilizzate solo dai generatori). systemd-sysv-generatorgenera le unità di servizio che eseguono gli rcscript di van Smoorenburg /etc/init.d, se non trova un'unità di servizio nativa con quel nome già esistente nelle altre sei posizioni.

la gestione dei servizi di systemd conosce solo le unità di servizio. Queste unità di servizio (ri) generate automaticamente sono scritte per invocare gli rcscript di van Smoorenburg . Hanno, tra le altre cose:

[Unità]
SourcePath = / etc / init.d / Wibble
[Servizio]
ExecStart = / etc / init.d / inizio wibble
ExecStop = / etc / init.d / wibble stop

La saggezza ricevuta è che gli rcscript di Van Smoorenburg devono avere un'intestazione LSB e sono eseguiti in parallelo senza onorare le priorità imposte dal /etc/rc?.d/sistema. Questo non è corretto su tutti i punti.

In realtà, essi non hanno bisogno di avere un LSB intestazione, e non se lo fanno systemd-sysv-generatorin grado di riconoscere i più limitati vecchi RedHat intestazioni di commento ( description:, pidfile:, e così via). Inoltre, in assenza di un'intestazione LSB, tornerà al contenuto delle /etc/rc?.dfarm di link simbolici, leggendo le priorità codificate nei nomi dei link e costruendo un precedente / successivo da essi, serializzando i servizi. Non solo le intestazioni LSB non sono un requisito, e non solo codificano essi stessi prima / dopo gli ordini che serializzano le cose in una certa misura, il comportamento di fallback in loro completa assenza è in realtà un'operazione significativamente non parallelizzata.

La ragione per cui /etc/rc3.dnon sembra importare è che probabilmente lo script è stato abilitato tramite un'altra /etc/rc?.d/directory. systemd-sysv-generatorsi traduce in un elenco di /etc/rc2.d/, /etc/rc3.d/e /etc/rc4.d/in una Wanted-Byrelazione nativa con systemd multi-user.target. I livelli di esecuzione sono "obsoleti" nel mondo dei sistemi e puoi dimenticartene.

Ulteriori letture


2
In Debian la directory dei generatori di sistema non vive su / usr / lib, ma / lib pacchetti.debian.org/sid/amd64/systemd/filelist
Braiam

5
Questa è una risposta straordinaria. Ben fatto signore.
peelman,

1
Grazie, grazie, grazie per questo! Trattare con un mix di sistemi Debian 8 e RH / CentOS 7 ha reso la gestione della gestione delle dipendenze dei servizi SysVInit vs Systemd un po 'un mal di testa, ma questa spiegazione di ciò che systemd sta facendo ha aiutato molto la mia comprensione.
Toby,

Questo generatore funziona. Vorrei anche menzionare, per i follower, che se hai una versione precedente di systemde uno script /etc/init.d non è impostato su "avvio all'avvio" funzionerà comunque come previsto ma non verrà visualizzato nella elenchi show-units: unix.stackexchange.com/a/518894/8337
rogerdpack

Questo generatore funziona. Vorrei anche menzionare, per i follower, che se hai una versione precedente di systemd e uno script /etc/init.d che non è impostato su "boot on start", continuerà / si fermerà come previsto usando systemctl ma ha vinto si presenta negli elenchi delle unità di visualizzazione: unix.stackexchange.com/questions/517872/… anche NB che in pratica non si può "controllare" questo servizio eseguendo /etc/init.d/xx più direttamente o systemd ottiene ... confuso su ciò che è in esecuzione e ciò che non lo è: |
rogerdpack,

17

Systemd è retrocompatibile con gli script di inizializzazione SysV. Secondo LSB 3.1, lo script init deve avere Convenzioni di commento informativo , che definiscono quando lo script deve essere avviato / arrestato e ciò che è necessario per l'avvio / arresto dello script. Questo è un esempio:

### 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

Questa è una sezione commentata che viene ignorata da SysV. D'altra parte, systemd legge le informazioni sulla dipendenza ed esegue quegli script in base a ciò.

Ma c'è un punto in cui systemd e SysV differiscono in termini di script init. SysV esegue gli script in ordine sequenziale in base al loro numero nel nome file. Systemd no. Se vengono soddisfatte le dipendenze, systemd esegue immediatamente gli script, senza onorare la numerazione dei nomi degli script. Alcuni di loro probabilmente falliranno a causa dell'ordinamento. Ci sono molte altre incompatibilità che dovrebbero essere considerate.


Se ci sono script init e file .service per lo stesso servizio, systemd eseguirà entrambi, non appena vengono soddisfatte le dipendenze (nel caso dello script init, quelle definite nell'intestazione LSB).


Va bene, ma ho anche un sacco di file .service in / lib / systemd / system /. Cosa esegue effettivamente systemd? Qualunque cosa sia specificata nei file di servizio (in ordine di dipendenza), negli script init.d o in entrambi?
Martin Drautzburg,

@MartinDrautzburg L'ho aggiunto alla risposta
caos,

1
Come sidenote, Debian ha appena annunciato di scaricare LSB compatibilità: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Gen

systemd è qualcosa MA compatibile con gli script SysV. Non solo questa affermazione è errata, ma il link a cui viene fatto riferimento chiarisce che è solo "per lo più compatibile" e che la quantità di sforzo necessaria per produrre gli stessi risultati è esageratamente enorme.
Julie ad Austin, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.