Quelle est la différence entre «systemctl mask» et «systemctl disable»?

35

Je veux améliorer le temps de démarrage de mon Ubuntu GNOME 16.04 en désactivant les services plymouth lors du démarrage. J'ai trouvé deux réponses sur la façon de le faire sur divers sites Web, à savoir:

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

Je ne peux exécuter aucune des opérations ci-dessus à moins de savoir ce qu'elles font.

pearlstar
la source

Réponses:

52

Si un service existe enabled, il y a un lien symbolique quelque part dans

/etc/systemd/system

à un fichier d'unité, le plus souvent quelque part dans

/lib/systemd/system

Utilement, lorsque vous êtes enableun service, les chemins complets du lien et de la cible créés seront imprimés sur stdout.

La désactivation du service supprime le lien symbolique, le fichier de l' unité elle - même est pas affectée, mais le service est pas chargé au prochain démarrage, lorsque systemd lectures /etc/systemd/system.

Cependant, un service désactivé peut être chargé et sera démarré si un service qui en dépend est démarré ; enableet disableuniquement configurer le comportement de démarrage automatique pour les unités, et l'état est facilement remplacé.

Un service masqué est un service dont le fichier d'unité est un lien symbolique vers /dev/null. Cela rend «impossible» le chargement du service, même s'il est requis par un autre service activé.

Lorsque vous êtes maskun service, un lien symbolique est créé de /etc/systemd/systemà /dev/null, laissant le fichier d'unité d'origine ailleurs intact. Lorsque vous unmaskun service, le lien symbolique est supprimé.

Cependant, j'ai remarqué que ces commandes ne sont pas toujours honorées.

Lorsque j'essaie de masquer la plupart des services, cela échoue:

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

Bien sûr, j'ai d'abord arrêté le service. @Anwar suggère que le masquage n'est possible que pour les services non critiques.

Démasquer un service masqué, à moins que je ne le masque moi-même, échoue également (en silence). Je pense que c'est parce qu'il n'y a aucun fichier d'unité pour le service, sauf sous la forme d'un lien symbolique vers /dev/null, cette fois dans /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)

Je ne suis pas le seul à avoir ce problème

Pour démasquer le service masqué x11-common, j'ai dû supprimer le lien symbolique vers /dev/nullet sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload. Maintenant, lorsque je l'interroge avec, systemctl status x11-commonje vois que le service a un joli cercle vert et est chargé et actif (quitté) bien qu'il n'ait pas de fichier d'unité.

Pour plus d'informations, cet article sur la façon d'utiliser Systemctl peut être utile.

Zanna
la source
1
Hmm, je comprends systemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead). Est-ce mauvais? Mais je suis sur Debian, pas sur Ubuntu. Bref, belle explication. Merci.
Faheem Mitha
@FaheemMitha Je ne suis pas sûr que le service soit nécessaire - mon système semble fonctionner sans lui. Aucune expérience avec Debian cependant, désolé!
Zanna
17

C'est assez simple.

  • systemctl start, systemctl stop: démarre (arrête) immédiatement l'unité en question ;
  • systemctl enable, systemctl disable: marque (décocher) l'unité pour le démarrage automatique au démarrage (d'une manière spécifique à l'unité, décrite dans sa [Install]section);
  • systemctl mask, systemctl unmask: interdit (autorise) toutes les tentatives de démarrage de l'unité en question (manuellement ou en tant que dépendance de toute autre unité, y compris les dépendances de la cible de démarrage par défaut). Notez que le marquage pour le démarrage automatique dans systemd est implémenté en ajoutant une dépendance artificielle de la cible de démarrage par défaut à l'unité en question, donc "mask" interdit également le démarrage automatique.

Réf .: systemctl (1) .

Pour en savoir plus: Lennart Poettering (2011-03-02). "Les Trois Niveaux d'Off" . systemd pour les administrateurs . 0pointer.de.

intelfx
la source
Excellent aperçu! Voir aussi Comment utiliser Systemctl pour gérer les services et unités Systemd .
Peter Mortensen
6

En bref,

  • disablerend l'unité désactivée pendant le démarrage. Mais cette unité peut être démarrée à tout moment après le démarrage.

  • maskdésactive complètement l'unité. Il ne peut pas être démarré sans démasquer. Cela implique automatiquement qu'il échouera au démarrage.

Anwar
la source
Je suis curieux - fais masket unmasktravaille pour toi? (Je comprends parfaitement si vous ne voulez pas tester!)
Zanna
1
@Zanna oui. Ça marche. J'ai testé avant de tester à nouveau tout à l'heure. avec [email protected]service.
Anwar
Hmm je dois comprendre pourquoi ça ne marche pas pour moi. Je sais que je ne suis pas le seul
Zanna
Peut-être que cela fonctionne pour les services non critiques. C'est encore nouveau je pense. btw, votre réponse était plus informative. C'était utile
Anwar