GNU/Linux >> Linux Esercitazione >  >> Linux

Mettere il file dell'unità Systemd?

Ho letto che ci sono due cartelle per i file unit (non in modalità utente).

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

In conflitto con questa comprensione è la risposta a questa domanda:come scrivere uno script di avvio per Systemd. Qualcuno può inserire le informazioni mancanti in modo da capire cosa sta succedendo? (AGGIORNAMENTO:la risposta è stata aggiornata e la mia comprensione non è più in conflitto con essa. )

Inoltre, sembra che gli script siano organizzati in sottocartelle all'interno di /etc/systemd/system/ cartella:

getty.target.wants
multi-user.target.wants

In un'altra posizione ho letto che ci sono altre posizioni. Sembra che questi siano per servizi specifici dell'utente.

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

Aggiornamento 31-08-2015:

Per il bene degli altri, ecco un collegamento a una domanda correlata che ho posto di recente:dove metto gli script eseguiti dalle unità di sistema?

Risposta accettata:

Il posto migliore per mettere il sistema file di unità: /etc/systemd/system Assicurati solo di aggiungere un target nella sezione [Installa], leggi "Come fa a saperlo?" per dettagli. AGGIORNAMENTO :/usr/local/lib/systemd/system è un'altra opzione, leggi "Area grigia" per i dettagli."

Il posto migliore dove mettere utente file di unità: /etc/systemd/user o $HOME/.config/systemd/user ma dipende dai permessi e dalla situazione.

La verità è che le unità systemd (o, come le chiama la frase introduttiva, "configurazioni di unità") possono andare ovunque —a condizione che tu sia disposto a creare collegamenti simbolici manuali e che tu sia a conoscenza degli avvertimenti. Rende la vita più facile mettere l'unità dove systemctl daemon-reload può trovarlo per alcuni buoni motivi:

  • L'utilizzo di una posizione standard significa che i generatori di systemd li troveranno e ne renderanno facile l'abilitazione all'avvio con systemctl enable . Questo perché la tua unità verrà automaticamente aggiunta a un albero delle dipendenze delle unità (una cache di unità).
  • Non è necessario pensare alle autorizzazioni, perché solo gli utenti privilegiati giusti possono scrivere nelle aree designate.

Come fa a saperlo?

E come si abilita esattamente systemctl enable sai dove creare il collegamento simbolico? Puoi codificarlo in modo rigido all'interno dell'unità
stessa sotto il [install] sezione. Di solito c'è una linea come

[Install]
WantedBy = multi-user.target

che corrisponde a una posizione predefinita nel filesystem.
In questo modo, systemctl enable sa che questa unità dipende da un gruppo di file di unità chiamato multi-user.target ("target" è il termine usato per designare i gruppi di unità dipendenti. Puoi elencare tutti i gruppi con systemctl list-units --type target ). Il gruppo di file unit da caricare con un target viene inserito in un targetname.target.wants directory. Questa è solo una directory piena di collegamenti simbolici (o la cosa reale). Se il tuo [Install] la sezione dice che è WantedBy il multi-user.target , ma se non esiste un collegamento simbolico in multi-user.target.wants directory, quindi non verrà caricato. Quando i generatori di unità systemd aggiungono il file dell'unità alla cache dell'albero delle dipendenze all'avvio (puoi attivare manualmente i generatori con systemctl daemon-reload ), sa automaticamente dove inserire il collegamento simbolico, in questo caso nella directory /etc/systemd/system/multi-user.target.wants/ dovresti abilitarlo.

Punti chiave nel manuale:

Unità aggiuntive potrebbero essere caricate in systemd ("collegate") da
directory non presenti nel percorso di caricamento dell'unità. Vedere il comando di collegamento per
systemctl(1).

Sotto systemctl, cerca Comandi file unità

Percorso di caricamento del file dell'unità

Si prega di leggere e comprendere la prima frase della citazione seguente da man systemd.unit (perché implica che tutti i percorsi che menziono qui potrebbero non essere applicabili a te se il tuo systemd è stato compilato con percorsi diversi):

I file unit vengono caricati da un insieme di percorsi determinati durante la compilazione, descritti nelle due tabelle seguenti. I file unit trovati nelle directory elencate in precedenza sovrascrivono i file con lo stesso nome nelle directory inferiori nell'elenco.

Quando la variabile $SYSTEMD_UNIT_PATH è impostato, il contenuto di questa variabile sovrascrive il percorso di caricamento dell'unità. Se $SYSTEMD_UNIT_PATH termina con un componente vuoto (":"), il consueto percorso di caricamento dell'unità verrà aggiunto al contenuto della variabile.

Tabella 1 e Tabella 2 da man systemd.unit sono buoni.

Correlati:l'eco nel descrittore di file sovrascrive il file?

Carica percorsi durante l'esecuzione in modalità sistema (--system ).

  • /etc/systemd/system Configurazione locale
  • /run/systemd/system Unità di runtime
  • /usr/lib/systemd/system Unità di pacchetti installati (o /lib/systemd/system in alcuni casi, leggi man systemd.unit )

Carica il percorso durante l'esecuzione in modalità utente (--user )

C'è una differenza tra per utente unità e tutti/globali unità di utenti.

Dipendente dall'utente

  • $XDG_CONFIG_HOME/systemd/user Configurazione utente (usata solo quando $XDG_CONFIG_HOME è impostato)

  • $HOME/.config/systemd/user Configurazione utente (usata solo quando $XDG_CONFIG_HOME non è impostato)

  • $XDG_RUNTIME_DIR/systemd/user Unità di runtime (usate solo quando $XDG_RUNTIME_DIR è impostato)

  • $XDG_DATA_HOME/systemd/user Unità di pacchetti che sono stati installati nella home directory (usata solo quando $XDG_DATA_HOME è impostato)

  • $HOME/.local/share/systemd/user Unità di pacchetti che sono stati installati nella home directory (usata solo quando $XDG_DATA_HOME non è impostato)

--global (tutti gli utenti)

Unità che si applicano a tutti gli utenti, vale a dire anche di proprietà di ciascun utente. Quindi ogni utente può interrompere questi servizi anche se un amministratore li abilita all'avvio.

  • /etc/systemd/user Configurazione locale per tutti gli utenti (systemctl --global enable userunit.service )
  • /usr/lib/systemd/user Unità di pacchetti che sono state installate a livello di sistema per tutti gli utenti (o /lib/systemd/system in alcuni casi, leggi man systemd.unit)
  • /run/systemd/user Unità di runtime

Area grigia

Da un lato, il File Hierarchy Standard specifica che /etc è per le configurazioni locali che non eseguono binari. D'altra parte
specifica che /usr/local/ "è per l'uso da parte dell'amministratore di sistema durante l'installazione del software in locale". Potresti anche sostenere (se non solo ai fini dell'organizzazione) che tutti i file delle unità di sistema dovrebbero andare sotto /usr/local/lib/systemd/system , ma questo è inteso per file di unità che fanno parte di "software" non da un gestore di pacchetti.
Le unità utente di sistema corrispondenti che sono a livello di sistema potrebbero andare in /usr/local/lib/systemd/user .

Unità transitoria

Un altro posto dimenticato non è affatto da nessuna parte! Forse un programma meno conosciuto è systemd-run . Puoi usarlo per eseguire unità transitorie al volo. vedi man systemd-run .

Ad esempio, per programmare un riavvio domani mattina alle 4:00 (potrebbe essere necessario --force per assicurarsi che avvenga un riavvio):

systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot

Questo produrrà un file unitario transitorio restart.service e un timer corrispondente (a causa del --on-calendar , indicato da transient=yes .

/run/systemd/transient/restart.service

# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine

[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"

Nota che esiste anche la più pericolosa opzione di doppia forza --force --force , che dice al kernel di fermarsi immediatamente (e, se non sai cosa stai facendo, in modo non sicuro, perché equivale quasi a tagliare la corrente).

Correlati:dispositivo a bassa potenza in unità sigillata:aiuto per la progettazione?
Linux
  1. Il Bash '?

  2. Mv Atomic è sulle F?

  3. Modifica le autorizzazioni di un file

  4. Errore di compilazione Openssl

  5. File unità Systemd - WantedBy e After

Introduzione al file system Linux

Utilizzo del file di configurazione SSH

Come controllare il runlevel in Linux

Il file host su Linux

Linux:dove mettere il file di scambio

C'è un modo per vedere l'albero di esecuzione di systemd?