Bonnes pratiques pour désactiver les services et minuteries systemd inutiles

Identifier, arrêter, désactiver et masquer en toute sécurité les services, sockets et minuteries systemd superflus sans compromettre votre hôte Linux.

Bonnes pratiques pour désactiver les services et minuteries systemd inutiles

Les services et minuteries systemd superflus peuvent ralentir le démarrage, consommer de la mémoire et exposer des écouteurs que vous n'utilisez pas. L'objectif n'est pas de réduire un hôte Linux à l'os, mais d'identifier les unités qui ne correspondent pas au rôle de la machine et de les désactiver en toute sécurité.

Ce guide propose un processus de révision pratique pour les services, sockets et minuteries, avec des commandes à exécuter avant et après chaque modification.

Comprendre les types d'unités systemd

Avant de désactiver quoi que ce soit, il est essentiel de comprendre les différents types d'unités gérées par systemd, car leur impact et leurs méthodes de gestion diffèrent :

  • Services (.service) : Le type d'unité le plus courant, responsable de l'exécution de démons ou d'applications (par exemple, sshd.service, nginx.service).
  • Minuteries (.timer) : Utilisées pour planifier l'exécution d'autres unités (souvent des services) en fonction de spécifications temporelles, remplaçant les tâches cron traditionnelles (par exemple, apt-daily.timer).
  • Sockets (.socket) : Gèrent les sockets réseau ou IPC, souvent utilisés pour l'activation par socket, où un service ne démarre que lorsqu'il reçoit du trafic sur son socket associé (par exemple, ssh.socket).

Phase 1 : Identifier les unités en cours d'exécution et activées

La première étape consiste à obtenir une visibilité sur ce qui est actuellement actif et ce qui est configuré pour démarrer automatiquement.

Lister toutes les unités actives

Pour voir ce qui fonctionne actuellement sur votre système, utilisez systemctl list-units :

systemctl list-units --type=service --state=running

systemctl list-units --type=timer --state=active

Lister toutes les unités activées (unités configurées pour démarrer au démarrage)

Les unités marquées comme enabled persisteront après les redémarrages. Leur examen est crucial pour l'optimisation du démarrage :

systemctl list-unit-files --type=service | grep enabled

systemctl list-unit-files --type=timer | grep enabled

Vérifier les dépendances

Si une unité que vous souhaitez désactiver est une dépendance pour des fonctions système critiques, sa désactivation pourrait casser des services essentiels. Vous pouvez vérifier ce qu'une unité spécifique nécessite ou ce qui en dépend :

systemctl list-dependencies <nom_unité.service>

Phase 2 : Désactiver et masquer les unités en toute sécurité

Une fois que vous avez identifié une unité que vous jugez inutile (par exemple, un service Bluetooth sur un serveur, un service d'impression spécifique), vous devez choisir la méthode correcte pour l'empêcher de s'exécuter.

1. Arrêter un service (temporairement)

Si vous souhaitez uniquement arrêter un service immédiatement sans affecter son comportement de démarrage au prochain redémarrage, utilisez stop :

sudo systemctl stop <nom_unité.service>

2. Désactiver un service (empêcher le démarrage futur)

Désactiver une unité l'empêche de démarrer automatiquement à l'avenir. Cela n'arrête pas un service en cours d'exécution, sauf si vous passez également --now ou exécutez stop séparément.

sudo systemctl disable <nom_unité.service>
sudo systemctl disable --now <nom_unité.service>

3. Masquer un service (la méthode la plus forte)

Le masquage est la manière la plus agressive d'empêcher une unité de démarrer. Lorsqu'elle est masquée, systemd crée un lien symbolique du fichier d'unité vers /dev/null. Cela empêche tout processus, y compris les chaînes de dépendances, de démarrer l'unité, même si un autre service activé l'exige explicitement.

Utilisez le masquage avec prudence, généralement uniquement pour les unités dont vous êtes absolument certain qu'elles ne devraient jamais s'exécuter.

sudo systemctl mask <nom_unité.service>

# Pour inverser le masquage :
sudo systemctl unmask <nom_unité.service>

Gérer les minuteries et les sockets

Les minuteries doivent généralement être désactivées si le service qu'elles déclenchent est inutile. Les sockets peuvent souvent être laissés tels quels s'ils utilisent l'activation par socket, car le service associé ne consommera pas de ressources tant qu'il n'est pas sollicité. Cependant, si le service lié au socket est inutile, désactiver le service suffit souvent.

# Désactiver une minuterie spécifique
sudo systemctl disable <nom_unité.timer>

# Arrêter et désactiver une unité de socket spécifique
sudo systemctl stop <nom_unité.socket>
sudo systemctl disable <nom_unité.socket>

Phase 3 : Exemples pratiques et bonnes pratiques

L'application de ces concepts nécessite une réflexion approfondie sur le rôle du système (par exemple, bureau vs serveur).

Exemple 1 : Désactiver CUPS (système d'impression) sur un serveur

Si votre machine Linux est un serveur sans tête sans matériel d'impression, le service CUPS est souvent une surcharge inutile. Nous devrions désactiver à la fois le service et sa minuterie associée.

# Vérifier d'abord le statut
systemctl status cups.service

# Désactiver et arrêter le service
sudo systemctl disable --now cups.service

# Désactiver le service de découverte associé s'il est présent
sudo systemctl disable --now cups-browsed.service

Exemple 2 : Gérer les services Snapd indésirables (si vous utilisez DNF/APT nativement)

Certaines distributions installent snapd. Si vous n'utilisez pas les snaps, vous voudrez peut-être arrêter et désactiver ses principaux composants de service :

sudo systemctl stop snapd.service
sudo systemctl disable snapd.service snapd.socket

⚠️ Avertissement sur les services spécifiques à la distribution : Soyez extrêmement prudent lorsque vous désactivez des services fournis directement par le gestionnaire de paquets principal de votre distribution (par exemple, les composants systemd-networkd ou NetworkManager). Recherchez minutieusement la fonction de l'unité avant de la désactiver, car un échec peut entraîner une perte de connectivité réseau ou une instabilité du système.

Résumé des bonnes pratiques

  1. Toujours rechercher d'abord : Avant d'exécuter disable ou mask, recherchez en ligne ce que fait l'unité .service ou .timer spécifique sur votre distribution (par exemple, "Qu'est-ce que ModemManager.service ?").
  2. Privilégier disable à mask : Utilisez disable pour une suppression standard de la séquence de démarrage. Réservez mask pour les unités qui sont constamment problématiques ou les risques de sécurité que vous souhaitez éliminer complètement.
  3. Vérifier les dépendances : Si la désactivation de l'unité A casse l'unité B (dont vous avez besoin), vous devez soit réactiver A, soit trouver un mécanisme de remplacement pour B.
  4. Test de redémarrage : Après avoir effectué des modifications importantes, redémarrez votre système (sudo reboot) pour vous assurer que le système démarre proprement et que les services essentiels restent opérationnels.

Vérifier les modifications

Après avoir exécuté vos commandes, vérifiez toujours que l'unité n'est plus activée ou en cours d'exécution comme prévu :

# Vérifier le statut après désactivation
systemctl status <nom_unité.service>
# La sortie doit afficher 'Loaded: loaded (...; disabled; vendor preset: disabled)'

Traitez le nettoyage systemd comme tout autre changement de production : recherchez l'unité, arrêtez-la temporairement si vous n'êtes pas sûr, désactivez-la seulement après test, et réservez mask pour les unités qui ne doivent démarrer sous aucun chemin. Cela vous donne un hôte plus léger sans transformer la maintenance de routine en exercice de récupération.