Rafraîchir le cache winbind automatiquement avec un service et un timer systemd
Les changements Active Directory mettent des heures à apparaître sur un serveur Linux joint par winbind. La purge automatisée par un service et un timer systemd, ses limites, et pourquoi c'est un contournement.
Sur un serveur Linux joint au domaine par winbind, vous créez un compte dans Active Directory, vous l’ajoutez à un
groupe, et côté Linux… rien. id ne voit pas le nouveau groupe, un partage refuse un accès pourtant accordé, et
l’utilisateur vous appelle. Une heure plus tard, ça marche tout seul. Le coupable est le cache de winbind, qui
fait très bien son travail : il évite de matraquer les contrôleurs de domaine à chaque résolution d’identité. Le
revers, c’est qu’il vous fait vivre dans le passé.
En mars 2026, j’ai arrêté de purger ce cache à la main. Cette fiche décrit l’automatisation que j’ai mise en
place : un service oneshot et un timer systemd qui remettent les compteurs à zéro chaque soir.
Comprendre ce que vous purgez
Section intitulée « Comprendre ce que vous purgez »winbind conserve localement le résultat des résolutions d’identité : correspondances nom ↔ SID, appartenances aux groupes, informations d’énumération. C’est un cache classique, avec une durée de vie propre. Tant qu’une entrée n’a pas expiré, winbind répond de mémoire, sans interroger le domaine — même si le domaine a changé d’avis entre temps.
Deux gestes suffisent à repartir sur des bases propres :
net cache flushsystemctl restart winbindLe premier vide le cache général de Samba. Le second relance le démon, ce qui écarte les entrées qu’il gardait en mémoire vive. Faits à la main, ces deux gestes règlent l’incident en dix secondes ; faits trois fois par semaine à la demande d’un utilisateur, ils deviennent une corvée. D’où le timer.
Prérequis
Section intitulée « Prérequis »-
Un accès root sur le serveur.
-
Le chemin réel de la commande
net, qui varie selon la distribution :Fenêtre de terminal which net# /usr/bin/net sur la plupart des distributions RHEL-likeNotez-le, il ira tel quel dans l’unité systemd. Une unité systemd n’utilise pas votre
PATH: un chemin relatif échoue silencieusement au premier déclenchement, à une heure où personne ne regarde. -
Un créneau horaire creux. Le redémarrage de winbind coupe brièvement la résolution d’identité.
Écrire le service
Section intitulée « Écrire le service »Le service ne tourne pas en continu : il exécute deux commandes puis se termine. C’est exactement ce que décrit
Type=oneshot, qui autorise plusieurs ExecStart= exécutés dans l’ordre.
[Unit]Description=Purge du cache winbind et redemarrage du serviceAfter=network-online.target
[Service]Type=oneshotExecStart=/usr/bin/net cache flushExecStart=/bin/systemctl restart winbindTrois remarques sur ce fichier :
- pas de section
[Install], et c’est volontaire : ce service n’a pas à être activé au démarrage, c’est le timer qui le déclenchera ; After=network-online.targetévite un déclenchement pendant que la pile réseau se monte, notamment si le serveur redémarre juste avant l’heure prévue ;- adaptez le chemin de
netà ce que vous a réponduwhich net.
Écrire le timer
Section intitulée « Écrire le timer »Le timer porte le même nom que le service, avec l’extension .timer. C’est cette convention de nommage qui les
relie : pas besoin de Unit= tant que les deux fichiers s’appellent pareil.
[Unit]Description=Declenche le rafraichissement winbind chaque jour
[Timer]OnCalendar=*-*-* 19:00:00Persistent=true
[Install]WantedBy=timers.targetOnCalendar=*-*-* 19:00:00 signifie « tous les jours à 19 h », dans le fuseau du serveur. Persistent=true est la
ligne qui distingue un timer systemd d’une ligne de cron : si la machine était éteinte à 19 h, le déclenchement a
lieu au démarrage suivant, au lieu d’être simplement sauté.
Activer et vérifier
Section intitulée « Activer et vérifier »systemctl daemon-reloadsystemctl enable --now winbind-refresh.timersystemctl list-timers | grep winbindlist-timers affiche la prochaine échéance, le temps restant, la dernière exécution et l’unité déclenchée. Si la
colonne NEXT est vide, le timer n’est pas armé : dans la quasi-totalité des cas, c’est un daemon-reload
oublié ou une faute de frappe dans OnCalendar.
Testez ensuite le service sans attendre 19 h :
systemctl start winbind-refresh.servicesystemctl status winbind-refresh.servicejournalctl -u winbind-refresh.service -n 30 --no-pagerUn oneshot qui a bien tourné apparaît en inactive (dead) avec un code de sortie 0. C’est normal : il n’a pas
vocation à rester actif.
Enfin, vérifiez l’effet réel, pas seulement l’exécution :
wbinfo -u | headgetent group "DOMAINE\\nom-du-groupe"id utilisateur.testCréez un compte de test dans l’annuaire, lancez le service, et regardez si le compte apparaît. Un timer qui s’exécute sans rien corriger est un timer inutile qu’on gardera dix ans.
Les pièges à connaître
Section intitulée « Les pièges à connaître »| Piège | Conséquence | Parade |
|---|---|---|
Chemin de net erroné |
Le service échoue chaque soir, sans que personne ne le voie | which net, et relire journalctl après le premier déclenchement |
| Horaire mal choisi | Coupure de résolution pendant une sauvegarde ou un batch | Un créneau réellement creux, vérifié avec l’exploitation |
| Plusieurs serveurs à la même heure | Rafale de requêtes simultanées sur les contrôleurs de domaine | RandomizedDelaySec=300 dans la section [Timer] |
| Purge trop fréquente | Charge inutile sur l’annuaire, gain nul | Quotidien suffit dans presque tous les cas |
| Aucune surveillance | L’échec du service passe inaperçu | Vérifier systemctl list-timers dans votre tour de contrôle mensuel |
Le redémarrage de winbind mérite une mention à part : pendant une poignée de secondes, les résolutions d’identité échouent. Sur un serveur de fichiers, cela peut se traduire par un accès refusé pour un utilisateur qui tombait pile au mauvais moment. C’est supportable à 19 h, beaucoup moins à 10 h.
Assumer que c’est un contournement
Section intitulée « Assumer que c’est un contournement »Purger un cache tous les soirs ne corrige rien : cela masque un délai de propagation qu’on n’a pas voulu, ou pas pu, traiter à la source. La question de fond reste ouverte, et elle est côté configuration : quelles durées de vie de cache sont réellement paramétrées, sont-elles adaptées à la fréquence des changements d’annuaire, et l’énumération des utilisateurs et des groupes est-elle activée alors qu’elle ne sert à rien sur ce serveur ?
Ma règle, quand je pose un contournement : je l’écris dans la fiche du serveur, avec la date, la raison, et la phrase « à revoir si le comportement change ». Un contournement documenté est une dette technique. Un contournement silencieux est un piège pour celui qui reprendra le serveur — c’est-à-dire, souvent, moi dans deux ans.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Joindre une machine Linux à Active Directory avec authselect et winbind : la mise en place complète, en amont de cette fiche.
- Réinitialiser winbind sur un serveur Linux joint à Active Directory : quand ce n’est plus le cache mais la jonction elle-même.
- systemd : forcer un service à démarrer après sa base de données : l’autre moitié du sujet systemd, l’ordonnancement.