Une compilation de documentations   { en , fr }

Détournement de fichier sous Debian

Étiquettes:
Créé en:
Dernière modification:
Auteur:
Xavier Béguin
Version en anglais : File diversions on Debian

Le problème

Lorsqu'on est obligé de modifier un fichier fourni par un paquet Debian, notre version du fichier est par défaut écrasée lors de la mise à jour de ce paquet (du moins si ce fichier n'est pas considéré comme un fichier de configuration modifiable par l'administrateur).

Pour éviter cet écrasement, il est possible de mettre en place un détournement de fichier qui forcera la nouvelle version du paquet à écrire le fichier sous un autre nom, préservant ainsi les modifications que nous y avons apportées.

Cas concret

Par exemple, dans une version antérieure de Debian testing, sur les systèmes utilisant systemd, le paquet bind9 possédait un bug (référencé comme le bug #767798) empêchant le daemon named de prendre en compte les options fournies par l'administrateur via des variables renseignées dans un fichier de configuration.

Un simple contournement de ce problème en attendant la correction du bug dans le paquet était suggérée par la personne ayant ouvert le bug : il suffisait de modifier le fichier /lib/systemd/system/bind9.service qui contrôle le lancement de named par systemd pour y ajouter une directive permettant la prise en compte des variables déclarées dans le fichier de configuration jusque là ignoré.

Mais ces changements au fichier bind9.service seraient écrasés à chaque mise à jour du paquet bind9, ce qui peut, dans certains cas, empêcher le redémarrage de named et rendait donc cette solution de contournement du bug risquée.

La solution

Mise en place d'un détournement

La solution la plus simple pour éviter ce risque d'écrasement de ce fichier était donc de mettre en place un détournement pour le fichier modifié en attendant la correction du bug, à l'aide de la commande suivante :

~# dpkg-divert --divert /lib/systemd/system/bind9.service.orig --rename /lib/systemd/system/bind9.service
Ajout de « détournement local de /lib/systemd/system/bind9.service en /lib/systemd/system/bind9.service.orig »

Grâce à ce détournement, le paquet écrit sa version du fichier dans /lib/systemd/system/bind9.service.orig, au lieu d'écraser le fichier /lib/systemd/system/bind9.service. (Dans cet exemple, l'administrateur effectuant une mise à jour du paquet a alors la charge de vérifier si la nouvelle version du fichier fournie possède des modifications à appliquer à notre propre version du fichier.)

Lister les détournements actifs

Pour voir si un détournement est bien pris en compte, on peut lister les détournements en place pour ce fichier (ou un ensemble de fichiers) grâce à l'option --list en lui passant en argument soit le nom du fichier détourné, soit celui du fichier d'origine (qui peuvent être sour forme de motif global). Par exemple :

~# dpkg-divert --list /lib/systemd/system/bind9.service.orig
détournement local de /lib/systemd/system/bind9.service en /lib/systemd/system/bind9.service.orig

~# dpkg-divert --list /lib/systemd/system/bind9.service
détournement local de /lib/systemd/system/bind9.service en /lib/systemd/system/bind9.service.orig

~# dpkg-divert --list *bind9.service
détournement local de /lib/systemd/system/bind9.service en /lib/systemd/system/bind9.service.orig

Supprimer un détournement

Dans notre exemple du paquet bind9, une fois le bug corrigé dans le paquet, on pouvait supprimer ce détournement et utiliser à nouveau la version du fichier qu'il fournit.

La suppression du détournement s'effectue grâce à l'option --remove avec comme argument à la commande le nom d'origine du fichier.

Il faut en outre passer explicitement l'option --rename si on veut que le fichier détourné soit renommé avec le nom du fichier d'origine (qui ne doit alors pas exister, sinon la supprression du détournement échoue), ou l'option --no-rename pour ne pas effectuer ce renommage.

Dans notre exemple, on pourra utiliser la commande :

dpkg-divert --remove --no-rename /lib/systemd/system/bind9.service