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 :