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.


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.


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.



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.


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 postgresql@9.5-main.serviceservice.
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.