Pourquoi les gestionnaires de packages ont-ils besoin de fichiers de verrouillage?

10

dpkgutilise un fichier de verrouillage ( /var/lib/dpkg/lock), lorsqu'il est utilisé.

  • Pourquoi ces fichiers de verrouillage sont-ils nécessaires?
  • Pourquoi plusieurs instances ne sont-elles pas possibles?
acisoal
la source
Dpkg fait des installations. Il s'agit d'un mode de sécurité pour éviter les conflits. Une seule installation à la fois.
albfan

Réponses:

15

Ce n'est pas un dpkgproblème spécifique (comme le titre de mon montage l'a suggéré). C'est plutôt quelque chose que fait tout gestionnaire de paquets (dont je suis au courant); et pour une bonne raison. Cependant, je comprends pourquoi cela pourrait prêter à confusion.

Les gestionnaires de packages s'appuient sur des bases de données pour suivre les informations des packages installés. Si plusieurs utilisateurs tentent d'écrire dans une base de données en même temps, il y a de fortes chances de corrompre les données (ce qui serait vraiment un problème avec le système).

Par conséquent, de nombreux (tous?) Gestionnaires de packages s'appuient sur un fichier de verrouillage pour signaler que la base de données est en cours d'écriture, de sorte qu'un autre client ne devrait pas être autorisé à le faire.


Notez que les gestionnaires de packages intelligents peuvent déterminer quand une demande est en lecture seule et peuvent ne pas avoir besoin de verrouiller la base de données. Par conséquent; il est possible que certaines actions puissent être exécutées simultanément alors que d'autres ne le seront pas.

HalosGhost
la source
2
Je pense que portage et paludis (les gestionnaires de paquets de Gentoo) peuvent fonctionner en parallèle, s'il utilise des verrous, il ne le fait que brièvement lors de l'ajout de paquets à la liste installée.
Vality
Je vais jeter un œil aux gestionnaires de paquets de Gentoo et mettre à jour ma réponse sous peu.
HalosGhost
Je ne trouve pas d'informations à jour à ce sujet; mais au moins, pendant un certain temps, paludis et portage ont utilisé des fichiers de verrouillage. Remarque, il s'agit d'une telle stratégie courante car c'est l'un des seuls moyens sûrs d'empêcher la corruption des données; Je serais surpris si le portage ou les paludis n'utilisaient toujours pas une telle méthode.
HalosGhost
1
Ah, il semble que vous ayez raison, mais la portée de ces verrous est différente, ils ne sont utilisés que lors de la mise à jour de l'index du package (la perte de packages disponibles), l'installation des packages est en fait une opération en lecture seule et n'invoque donc pas le verrou. Cependant, oui, je vois ce que vous voulez dire, il est logique que la stratégie soit si courante.
Vality
9

Le fichier de verrouillage est utilisé pour empêcher l'exécution parallèle de plusieurs instances.

Pourquoi est-ce important pour un gestionnaire de package?

Un gestionnaire de paquets - à partir d'une vue de haut niveau - est un programme qui applique des modifications complexes au disque dur.

Les modifications ne peuvent pas être effectuées en une seule étape («atomique»), il y a donc plusieurs étapes; de nombreuses étapes dépendent du résultat des étapes précédentes.

Ainsi, le gestionnaire de packages doit soit analyser le disque dur avant d'exécuter chaque étape, soit simplement l'analyser une fois et suivre les modifications qu'il applique lui-même. La première option est extrêmement lente. La seconde nécessite qu'aucune autre instance n'apporte de modifications.

De nombreux autres problèmes pourraient apparaître.

Il n'est pas impossible d'implémenter un gestionnaire de packages pouvant fonctionner en parallèle, mais c'est trop compliqué pour en valoir la peine . Comme dans, Vous ne pouvez pas imaginer à quel point compliqué. Vraiment.

Volker Siegel
la source
2

dkpg(et la rpmplupart des autres gestionnaires de packages traditionnels) fonctionnent en installant des packages dans un espace global, ce qui signifie que les packages peuvent entrer en conflit les uns avec les autres (par exemple Aet Bne peuvent pas être installés en même temps, car ils s'installent tous les deux /usr/lib/libfoo.so). Les gestionnaires de packages doivent détecter ces conflits et rejeter ces demandes d'installation afin de maintenir le système dans un état cohérent. Avoir plusieurs instances du gestionnaire de paquets en même temps serait très compliqué et sujet aux erreurs.

Les gestionnaires de paquets sans conflit (par exemple http://0install.net ) peuvent autoriser et permettent d'installer plusieurs packages en parallèle¹, et n'ont pas besoin de fichiers de verrouillage ( A/libfoo.soet B/libfoo.soiront dans différents répertoires).


1 Parallèle à la fois dans le sens d'être présent et disponible sur le système en même temps, et dans le sens d'être téléchargé et ajouté au système simultanément.

Thomas Leonard
la source