Qual è la differenza tra “systemctl mask” e “systemctl disable”?


35

Voglio migliorare il tempo di avvio del mio Ubuntu GNOME 16.04 disabilitando i servizi di plymouth all'avvio. Ho trovato due risposte su come farlo su vari siti Web e precisamente:

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

Non posso eseguire nessuna delle operazioni precedenti a meno che non sappia cosa fanno.


Risposte:


52

Se un servizio è enabled, allora c'è un link simbolico da qualche parte in

/etc/systemd/system

in un file di unità, molto spesso da qualche parte in

/lib/systemd/system

Utilmente, quando si è enableun servizio, i percorsi completi del collegamento e della destinazione creati verranno stampati su stdout.

La disabilitazione del servizio elimina il collegamento simbolico, quindi il file unitario stesso non è interessato, ma il servizio non viene caricato all'avvio successivo, quando systemd legge /etc/systemd/system.

Tuttavia, è possibile caricare un servizio disabilitato e verrà avviato se viene avviato un servizio che dipende da esso ; enablee disableconfigura solo il comportamento di avvio automatico per le unità e lo stato viene facilmente ignorato.

Un servizio mascherato è un servizio il cui file di unità è un collegamento simbolico a /dev/null. Ciò rende "impossibile" il caricamento del servizio, anche se richiesto da un altro servizio abilitato.

Quando si è maskun servizio, viene creato un collegamento simbolico da /etc/systemd/systema /dev/null, lasciando intatto il file di unità originale altrove. Quando si unmaskesegue un servizio, il collegamento simbolico viene eliminato.

Tuttavia, ho notato che questi comandi non sono sempre rispettati.

Quando provo a mascherare la maggior parte dei servizi, non riesce:

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

Naturalmente, ho interrotto prima il servizio. @Anwar suggerisce che il mascheramento è possibile solo per servizi non critici.

Smascherare un servizio mascherato, a meno che non lo mascherassi da solo, fallisce (in silenzio). Credo che ciò sia dovuto al fatto che non esiste un file unitario per il servizio ovunque, tranne che sotto forma di un collegamento simbolico a /dev/null, questa volta in /lib/systemd/system:

$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

Non sono l'unico ad avere questo problema

Per smascherare effettivamente il servizio mascherato x11-common, ho dovuto eliminare il link simbolico a /dev/nulle sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload. Ora quando lo interrogo systemctl status x11-commonvedo che il servizio ha un bel cerchio verde ed è caricato e attivo (uscito) sebbene non abbia un file unitario.

Per ulteriori riferimenti questo articolo su Come utilizzare Systemctl potrebbe essere di qualche utilità.


1
Hmm, ho capito systemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead). È male? Ma sono su Debian, non su Ubuntu. Comunque, bella spiegazione. Grazie.
Faheem Mitha,

@FaheemMitha Non sono sicuro che il servizio sia necessario - il mio sistema sembra funzionare senza di esso. Nessuna esperienza con Debian però, scusa!
Zanna,

17

È abbastanza semplice

  • systemctl start, systemctl stop: avvia (arresta) l'unità in questione immediatamente ;
  • systemctl enable, systemctl disable: contrassegna (deseleziona) l'unità per l' avvio automatico al momento dell'avvio (in un modo specifico dell'unità, descritto nella sua [Install]sezione);
  • systemctl mask, systemctl unmask: non consente (consente) tutti i tentativi di avviare l'unità in questione (manualmente o come dipendenza di qualsiasi altra unità, comprese le dipendenze della destinazione di avvio predefinita). Si noti che la marcatura per l'avvio automatico in systemd viene implementata aggiungendo una dipendenza artificiale dalla destinazione di avvio predefinita all'unità in questione, quindi anche "maschera" non consente l'avvio automatico.

Rif .: systemctl (1) .

Altro: Lennart Poettering (2011-03-02). "I tre livelli di Off" . systemd per amministratori . 0pointer.de.



6

In breve,

  • disablerende l'unità disabilitata durante l'avvio. Ma quell'unità può essere avviata in qualsiasi momento dopo l'avvio.

  • maskdisabilita completamente l'unità. Non può essere avviato senza smascherare. Ciò implica automaticamente che fallirà durante l'avvio.


Sono curioso: fai maske unmasklavori per te? (Capisco perfettamente se non vuoi provare!)
Zanna,

1
@Zanna sì. Questo funziona. Ho provato prima ancora testato ora. con postgresql@9.5-main.serviceservizio.
Anwar,

Hmm, devo capire perché non funziona per me. So di non essere il solo
Zanna,

Può essere che funzioni per servizi non critici. È ancora nuovo, penso. tra l'altro, la tua risposta è stata più istruttiva. È stato utile
Anwar,
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.