Étude Formelle Des Distributions De Logiciel Libre
Total Page:16
File Type:pdf, Size:1020Kb
Université Paris Diderot — Paris 7 École doctorale de Sciences Mathématiques de Paris Centre THÈSE pour obtenir le grade de DOCTEUR DE L’UNIVERSITÉ PARIS DIDEROT Spécialité : Informatique présentée par Jacob Pieter BOENDER Directeur : Roberto DI COSMO Étude formelle des distributions de logiciel libre A formal study of Free Software Distributions soutenue le 24 mars 2011 devant le jury composé de : M. Roberto DI COSMO directeur M. Jesús M. GONZÁLEZ-BARAHONA examinateur M. Carsten SINZ rapporteur M. Diomidis SPINELLIS examinateur M. Jean-Bernard STEFANI examinateur M. Ralf TREINEN examinateur M. Peter VAN ROY rapporteur 2 Contents C Résumé5 La théorie des paquets.............................6 Algorithmes et outils..............................8 Formalisation..................................9 Validation et analyse..............................9 Conclusions et perspectives.......................... 10 1 Introduction 11 1.1 F/OSS Software Distributions...................... 11 1.2 Contributions............................... 12 1.3 Structure.................................. 14 2 Definitions 17 2.1 Existing package formats......................... 17 2.2 Definitions................................. 28 2.3 Installability................................ 30 2.4 Dependencies............................... 32 3 Strong dependencies and conflicts 37 3.1 Strong dependencies........................... 37 3.2 Dominators................................ 39 3.3 Dominators in strong dependency graphs and control flow graphs 41 3.4 Strong conflicts.............................. 46 4 Algorithms 53 4.1 Installability................................ 53 4.2 Strong dependencies........................... 54 4.3 Dominators................................ 59 4.4 Strong conflicts.............................. 60 5 Tools 63 5.1 distcheck.................................. 63 5.2 dose..................................... 63 5.3 Ceve.................................... 65 5.4 Pkglab................................... 66 6 Formalisation 71 6.1 Repository................................. 71 6.2 Dependencies............................... 72 6.3 The dependency cone........................... 76 6.4 Repository properties........................... 78 6.5 Installability................................ 80 6.6 Strong dependencies and conflicts................... 82 3 6.7 Triangle conflicts............................. 84 7 Experimentation and validation 91 7.1 Repositories................................ 91 7.2 Run time of the installability algorithm................ 93 7.3 Run time of the strong dependency algorithm............ 95 7.4 The dominator graph........................... 96 7.5 Run time of the strong conflict algorithm............... 98 8 Graph properties of distributions 109 8.1 Small world properties.......................... 109 8.2 Distributions as small world networks................. 111 9 Conclusion 125 9.1 Summary.................................. 125 9.2 Practical usage............................... 126 9.3 Related works............................... 127 9.4 Future work................................ 130 Acknowledgements 131 4 Résumé R De quoi s’agit-il ? —FERDINAND FOCH Comme l’indique le titre, dans cette thèse, il sera beaucoup question des distributions du logiciel libre (aussi connu sous l’abréviation F/OSS, free and open source software). Ces distributions sont extrêmement hétérogènes. Elles contiennent des lo- giciels de différentes provenances ; écrits dans des langages différents, avec des calendriers de publication différents et avec des procédures différentes. Pour gérer cette hétérogénéité, et pour avoir une façon simple et unique d’installer des logiciels, les systèmes de paquetage ont été développés. Ceux-ci consistent en l’emballage d’un logiciel dans un paquet, qui contient des don- nées supplémentaires utilisées par un logiciel approprié, un gestionnaire de pa- quets. Le gestionnaire sert à installer les paquets et le logiciel qu’il contient de façon presque automatique. Les systèmes de paquetage diffèrent selon les distributions, mais les prin- cipes sont communs : une distribution a plusieurs dépôts, dont chacun contient plusieurs paquets, reliés entre eux par des relations spécifiques, notamment les dépendances et les conflits. Une dépendance d’un paquet a un autre indique que le premier paquet ne peut pas être installé sans que l’autre soit installé aussi ; un conflit entre deux paquets indique que ces deux paquets ne pourront jamais être installés en même temps. Les dépendances peuvent être disjonctives, c’est à dire qu’un paquet peut spécifier une dépendance sur plusieurs paquets, dont au moins un doit être installé pour satisfaire à la dépendance. Tout ceci fait que le problème de l’installabilité d’un paquet est d’une com- plexité comparable au problème SAT. Quand on y ajoute le fait que les distri- butions d’aujourd’hui ont une taille importante (la version la plus récente de Debian contient 22 000 paquets), il devient clair qu’il est très important d’avoir des algorithmes rapides et efficaces. Les quatre sujets principaux abordés dans cette thèse se résument comme suit : • D’abord, nous présentons un modèle formel qui réunit les propriétés principales des systèmes de paquetage les plus courantes, et nous iden- tifions des relations sémantiques entre paquets qui peuvent être utilisées pour trouver des erreurs et assurer la qualité des distributions de logiciel libre ; • Ensuite, nous présentons des algorithmes efficaces pour manipuler des dépôts de paquets et calculer les relations mentionnées ci-dessus ; tous ces algorithmes ont été implémentés dans la langage de programmation OCaml, et incorporés dans une librairie de manipulation et analyse de paquets qui s’appelle dose3 ; 5 • Nous avons encodé notre modèle dans l’assistant de preuves Coq, et uti- lisé cet encodage pour vérifier quelques-uns des théorèmes les plus im- portants qui correspondent aux étapes les plus compliquées des algo- rithmes déjà présentés ; • Finalement, nous avons validé nos algorithmes sur des distributions de logiciel libre existantes, et nous présentons une analyse extensive de la structure générale de ces distributions, notamment les caractéristiques dites «petit monde» de la structure du graphe sous-jacent. La théorie des paquets Dans cette partie de la thèse, qui correspond aux chapitres2 et3, nous com- mençons par expliquer les concepts communs entre les différents systèmes de paquetage. Systèmes de paquetage alpha echo bravo charlie delta # foxtrot (a) Dépendances et conflits (b) Paquet virtuel FIGURE 1 – Dépôts d’exemple Considérons la figure 1a. Ici, le paquet alpha a une dépendance simple sur le paquet bravo, ce qui exprime la nécessité d’installer bravo dès lors qu’on veut installer alpha. En revanche, l’autre dépendance d’alpha est disjonctive sur charlie et delta. Alors pour installer alpha il faudrait aussi installer soit charlie, soit delta, soit les deux. La situation est semblable pour echo : pour installer echo, on a besoin de delta ou foxtrot. Cependant, il n’est pas possible ici d’installer les deux en même temps, parce que delta et foxtrot sont en conflit (indiqué par le dièse). Dans la plupart des systèmes de paquetage, il existe la notion de paquets virtuels. Comme leur nom l’indique, ce sont des paquets qui n’existent pas vraiment, mais qui peuvent être fournis par des autres paquets. Considérons la figure 1b : ici, le paquet zulu est un paquet virtuel, qui est fourni par bravo, charlie et delta. Dans ce cas, alpha a une dépendance sur zulu ; une dépendance sur un paquet virtuel peut être satisfaite par n’importe quel fournisseur du paquet virtuel, et la situation revient donc à une dépendance disjonctive d’alpha sur bravo, charlie ou delta. 6 alpha echo delta charlie # zulu bravo Quant à echo, il y a un conflit entre ce paquet et zulu. Un conflit avec un paquet virtuel se traduit par un conflit avec chaque fournisseur de ce paquet virtuel : autrement dit, echo est en conflit avec à la fois bravo, charlie et delta. Il y a des différences de détail entre les systèmes de paquetage (dont les plus utilisés sont le système de Debian et RPM), mais ils sont tous conformes au schéma expliqué ci-dessus. Relations sémantiques entre paquets Les relations entre paquets qu’on a détaillées dans la section précédente ne nous donnent pas toute l’histoire. Par exemple, le simple fait qu’il y a une dé- pendance entre deux paquets ne signifie pas forcément que l’un doit être ins- tallé pour installer l’autre (la dépendance pourrait être disjonctive). Il pourrait aussi y avoir des paquets qui, sans être en conflit direct, ne sont néanmoins pas installable en même temps1. Pour pallier à ce problème, nous installons des relations sémantiques qui nous aident à voir plus clairement la structure d’un dépôt. Commençons par les dépendances. Nous définissons qu’il existe une dépen- dance forte entre un paquet p et un autre paquet q (tous les deux contenu dans un dépôt R) si et seulement si : • p est installable2 dans R ; • chaque installation de p dans R contient q. Avec cette relation de dépendance forte, on résume l’essentiel de la dépen- dance : un paquet a des dépendances fortes sur tous les paquets qui lui sont absolument indispensables. Notons aussi que la relation de dépendance forte, contrairement aux dépendances normales, est transitive. Il est également intéressant de considérer les dépendances fortes en sens inverse : un paquet dont beaucoup d’autres paquets dépendent fortement est nécessairement un paquet important dans la distribution : si ce paquet