URL: https://linuxfr.org/users/steckdenis/journaux/sortie-de-setup-01-alpha0 Title: Sortie de Setup 0.1-alpha0 Authors: steckdenis Date: 2009年11月27日T20:26:20+01:00 Tags: debian, ubuntu et selinux Score: 39 Bonjour, Aujourd'hui, j'ai le plaisir de vous annoncer que des mois de travail portent enfin leurs fruits. Après [un début purement théorique](https://linuxfr.org/~steckdenis/28793.html), le gestionnaire de paquets que je développe pour le moment sort enfin à la lumière du soleil. Cette version n'est pas du tout stable, et n'est là que pour montrer que le travail avance, mais peut déjà être testée, et appréciée. Certaines fonctionnalités critiques sont encore absentes (désinstallation, mise à jour), mais l'installation marche déjà correctement. **Qu'est-ce que Setup ?** Setup est le gestionnaire de paquets développé par le [Projet Logram](http://logram-project.org/), dans le but de prouver qu'un gestionnaire de paquet peut être léger, puissant et rapide. Il sera en outre utilisé par notre future distribution. Le but de Setup n'est pas d'être hyper puissant comme le sont APT ou Yum, mais bien de convenir à un usage de tous les jours sur des ordinateurs de bureau. La sécurité n'est pas en reste, mais certaines fonctionnalités lourdes ne sont pas prévues. En outre, un accent est mis sur la rapidité, voir _«l'instantanéibilité»_ des actions possibles (bench en fin de journal) **Pourquoi ne pas reprendre RPM/Deb/Pacman/etc ?** La question a déjà été posée maintes et maintes fois. Le principal avantage de la création d'un nouveau gestionnaire de paquets est de pouvoir apprendre des erreurs des autres, sans devoir maintenir une compatibilité avec l'existant. Setup est une base solide sur laquelle on peut construire plein de choses, et est amené à devenir pas mal du tout. Des «monstres» comme RPM ou DPKG/APT sont difficilement maintenables de par le fait qu'ils sont découpés en plein d'outils. Il existe plusieurs forks de RPM, et DPKG peut s'utiliser avec apt-get, aptitude ou dselect. Tout ceci fait qu'un bug trouvé dans un des outils doit être corrigé dans les autres. Créer un paquet RPM ou Deb est également complexe, alors qu'en créer un pour Setup [est un jeu d'enfant](http://logram-project.org/wiki-setup-package.html). De plus, un très mauvais point pour ces outils est que la partie «résolution des dépendances» est séparée de la partie «gestion des paquets». RPM peut être utilisé avec URPMI, yum, Zypper, voire apt-rpm. DPKG est utilisé par aptitude, apt-get ou dselect. Ceci empêche certaines goodies, très utilisées par Setup, comme le téléchargement et l'installation en parallèle, ainsi qu'un contrôle poussé de l'installation des paquets. Quand aux gestionnaires de paquets comme Pacman et autres, ils sont très biens, et Setup s'en inspire. Ils ne semblent pas avoir les mêmes problèmes que les gestionnaires de paquets comme RPM, mais manquent parfois de quelques fonctionnalités, ou de rapidité. Un paquet ne peut par exemple pas «poser de questions» (DebConf-like) avec Pacman, ou alors ce n'est pas utilisé. **Pourquoi utiliser Setup, qu'a-t-il de mieux ?** Setup a un énorme avantage sur les autres : il est rapide, **très** rapide. La recherche d'un paquet, parmis 25 000, est instantané. La résolution des dépendances est inmesurable à l'échelle humaine, de même que toutes les autres opérations. Même la mise à jour de la base de donnée binaire, une opération extrêmement complexe (lecture de fichiers texte de 20 Mio, pré-résolution des dépendances, écriture binaire optimisée), ne prend qu'à peine plus de 2 secondes pour le contenu de Debian Testing, section main. Setup est aussi une petite base de code simple et documentée (pour le moment en français, je fais trop de fautes d'anglais et personne n'a encore traduit mes commentaires). La gestion des paquets elle-même tient dans moins de 5500 lignes, le _front-end_ en ligne de commande fait à peine plus de 1500 lignes. Le code lui-même est du C++ correctement organisé et utilisant Qt (question débattue plus loin). Setup, bien que largement moins puissant que les autres gestionnaire de paquets, permet d'apprendre comment un programme de ce type fonctionne, et comment ça se crée. Setup est tout jeune, sa première ébauche datant du mois de septembre. **Utiliser Qt ? Quelle horreur !** Ce commentaire (ok, un peu moins sec), a été fait dans un précédent journal parlant de Setup. La raison évoquée était que dépendre de Qt pour «un programme de si bas niveau» est une aberration, surtout pour un serveur. Plusieurs raisons font que Qt est utilisé, les voici : * Logram n'est absolument pas destiné aux serveurs. Là-dessus, mettez une Debian ou une RedHat. Setup suit ce mouvement et ignore totalement ce milieu. Le serveur, c'est ok. C'est sur le _desktop_ que Linux doit faire ses preuves. (note: je ne prétend nullement apporter quoique ce soit de spécial dans ce domaine, j'essaie, c'est tout) * Qt est découpée en bibliothèques. Nous ne dépendons pas, pour le front-end console et la bibliothèque, de QtGui (la plus grosse partie de Qt, se chargeant de la GUI). Les seuls bibliothèques de Qt utilisées sont QtCore, QtXml, QtScript et QtNetwork. * Qt est une dépendance «légère» par rapport à d'autres gestionnaires de paquet dont on se plaint bien moins. URPMI dépend de Perl, Portage est écrit en Python, etc. Ok, il y a bien RPM et la suite DEB qui sont en C, mais le C++ n'est pas plus lourd. * Qt facilite énormément de choses. C'est une bibliothèque Libre (je le rappelle pour ceux qui sont trois guerres en retard) qui fournit énormément de code prêt à l'emploi. La gestion des téléchargements, des processus, du XML, des communications asynchrones, des tables de hash et des listes est gérée par Qt, gratuitement, ce qui permet de limiter les bugs au minimum. * Qt est différent de KDE. Ce n'est pas parce que Setup dépend de Qt qu'il dépend de KDE, loin de là ! * Les performances ne sont absolument pas réduites, voir la suite. De plus, les éventuelles parties trop lentes en Qt sont remplacées par du C++ STL, comme par exemple la gestion des fichiers (un fichier texte de 20Mio, c'est un peu trop pour Qt). On n'est pas obligé de faire du 100% Qt, on peut prendre ce qu'on veut, et optimiser le reste **Les performances de Setup** Voici une suite de commandes avec leur résultat et le temps qu'elles prennent, le tout mesuré sur un ordinateur d'age moyen composé d'un AMD Athlon 64 X2 4000+ (2,4Ghz) et de 2Gio de RAM. Cette machine est certes assez puissante, mais ça va. La quantité de RAM importe peu, Setup étant très léger sur cet aspect (l'opération la plus lourde, lancée dans Valgrind, ne prend que 50Mio. Sans Valgrind, 35Mio à peu près sont utilisés, mais c'est difficile à mesurer tant Setup est rapide). Attention, cette partie est un peu longue, Setup pouvant afficher pas mal de choses. _1. Mise à jour de la base de donnée binaire_ Un dépot local, contenant les 28101 de la future Ubuntu LTS, portés grâce à un script Python maison, est importé dans la base de donnée binaire comme suit : $ time ./setup -R /tmp/setup update [0/6] Téléchargement de /home/steckdenis/repo/dists/experimental/x86_64/packages.lzma gpg: Signature faite le mer 25 nov 2009 13:41:39 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [1/6] Téléchargement de /home/steckdenis/repo/dists/experimental/x86_64/translate.fr.lzma gpg: Signature faite le mer 25 nov 2009 13:41:39 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [2/6] Téléchargement de /home/steckdenis/repo/dists/experimental/all/packages.lzma gpg: Signature faite le mer 25 nov 2009 13:41:39 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [3/6] Téléchargement de /home/steckdenis/repo/dists/experimental/all/translate.fr.lzma gpg: Signature faite le mer 25 nov 2009 13:41:39 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [4/6] Téléchargement de /home/steckdenis/repo/dists/ubuntu/x86_64/packages.lzma gpg: Signature faite le dim 22 nov 2009 13:57:46 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [5/6] Téléchargement de /home/steckdenis/repo/dists/ubuntu/x86_64/translate.fr.lzma gpg: Signature faite le sam 21 nov 2009 10:06:48 CET avec la clé RSA ID 47798B4B gpg: Bonne signature de « Logram Repository » [0/6] Mise à jour de la base de donnée : Lecture des listes [1/6] Mise à jour de la base de donnée : Génération de la liste des paquets [2/6] Mise à jour de la base de donnée : Écriture des chaînes de caractère [3/6] Mise à jour de la base de donnée : Écriture des traductions [4/6] Mise à jour de la base de donnée : Enregistrement des dépendances [5/6] Mise à jour de la base de donnée : Enregistrement de données supplémentaires real 0m2.406s user 0m1.954s sys 0m0.298s C'est le traitement le plus lourd, équivalent de «apt-get update». Pas spécialement plus rapide que le reste, mais déjà pas mal, surtout que cette lenteur fait gagner beaucoup plus tard. _2. Recherche de paquets_ Maintenant, affichons tous les paquets. C'est un autre traitement particulièrement lourd, nécessitant l'instanciation de 28 000 classes. La mémoire et le cache sont clairement ici le goulot d'étranglement : $ time ./setup -R /tmp/setup search '*' | wc -l 28105 real 0m3.072s user 0m2.795s sys 0m0.249s Heureusement, une recherche normale ne prend que quelques centièmes de secondes (équivalent de «apt-cache search») : $ time ./setup -R /tmp/setup search galeon galeon 2.0.7-1ubuntu2 GNOME web browser for advanced users galeon-common 2.0.7-1ubuntu2 data for the galeon web browser real 0m0.076s user 0m0.055s sys 0m0.007s C'est agréable à utiliser, je peux vous le dire. Si tous les autres gestionnaires de paquets faisaient autant ! _3. Métadonnées_ Testons maintenant la rapidité avec laquelle Setup peut afficher des informations sur un paquet, l'équivalent de «apt-cache showpkg». Le "-C" permet d'afficher également le changelog. Pour réduire les délais ne provenant pas de Setup, un dépôt local est utilisé, pour ne pas devoir télécharger les métadonnées : $ time ./setup -R /tmp/setup -C showpkg initng Nom : initng Version : 0.6.99+git20091106~1 Titre : Système de démarrage Init-ng Logiciel graphique : Oui Section : base Distribution : experimental Status : Non-installé Téléchargement : 190 Kio Taille installée : 420 Kio Dépôt d'origine : repo Paquet source : initng Licence : GPL Mainteneur : steckdenis Description courte : Système de démarrage init-ng, remplaçant de SysVInit Description longue : Initng est un nouveau système de démarrage corrigeant les différents problèmes du vieilissant SysVInit. Entre autres, il permet de démarrer les services en parallèle, ce qui peut drastiquement réduire le temps de démarrage (si un processus attend 4 secondes avant de faire quelque-chose, un autre peut déjà travailler). Initng permet également une personnalisation du démarrage plus poussée, et une plus grande légèreté. Ses fichiers de configuration sont facilement éditables, et Logram propose un outil pour le gérer. Dépendances : Légende : D: Dépend S: Suggère C: Conflit P: Fourni R: Remplace N: Est requis par £spaces£ £/spaces£D: libinitng (= 0.6.99+git20091106~1) £spaces£ £/spaces£N: initng-plugins (= 0.6.99+git20091106~1) Versions disponibles : Légende : * = Disponible, I = installée, R = supprimée £spaces£ £/spaces£* 0.6.99+git20091106~1 Système de démarrage init-ng, remplaçant de SysVInit Historique des versions : 0.6.99+git20091106~1 (steckdenis), 14/11/09 00:00 Ajout des questions 0.6.99+git20091106~1 (steckdenis), 9/11/09 00:00 Ajout des informations des fichiers qui doivent aller dans __LOGRAM 0.6.99+gitNov62009~1 (steckdenis), 23/10/09 00:00 Modification du changelog 0.6.99+gitSep202009~1 (steckdenis), 17/10/09 00:00 Première version real 0m0.058s user 0m0.008s sys 0m0.010s _4. Solveur de dépendances_ Maintenant, testons la rapidité du solveur, d'abord sur une petite requête, puis sur une grosse installation : $ time ./setup -R /tmp/setup add initng-plugins Paquets qui seront installés ou supprimés : £spaces£ £/spaces£Légende : I: Installer R: Supprimer U: Mettre à jour P: Supprimer totalement £spaces£ £/spaces£I: initng-plugins 0.6.99+git20091 Système de démarrage init-ng, modules supplémentaires £spaces£ £/spaces£I: initng 0.6.99+git20091 Système de démarrage init-ng, remplaçant de SysVInit £spaces£ £/spaces£I: libinitng 0.6.99+git20091 Système de démarrage init-ng, bibliothèques partagées Solution 1 sur 1, de poids 0. Téléchargement de 279 Kio, installation de 910 Kio Accepter (y), Suivante (n), Précédante (p) ou Annuler (c) ? real 0m0.038s user 0m0.015s sys 0m0.011s Pas mal, je connais des gestionnaires de paquets qui font pire. Voici maintenant une résolution bien plus complexe, utilisant les paquets Ubuntu : $ time ./setup -R /tmp/setup -S off add vim Paquets qui seront installés ou supprimés : £spaces£ £/spaces£Légende : I: Installer R: Supprimer U: Mettre à jour P: Supprimer totalement £spaces£ £/spaces£I: vim 7.2.245-2ubuntu Vi IMproved - enhanced vi editor £spaces£ £/spaces£I: vim-common 7.2.245-2ubuntu Vi IMproved - Common files £spaces£ £/spaces£I: libc6 2.10.1-3ubuntu1 GNU C Library:Shared libraries £spaces£ £/spaces£I: libc-bin 2.10.1-3ubuntu1 GNU C Library:Binaries £spaces£ £/spaces£I: libgcc1 4.4.2-2ubuntu1 GCC support library £spaces£ £/spaces£I: gcc-4.4-base 4.4.2-2ubuntu1 The GNU Compiler Collection (base package) £spaces£ £/spaces£I: tzdata 2009r-1ubuntu1 time zone and daylight-saving time data £spaces£ £/spaces£I: debconf 1.5.28ubuntu1 Debian configuration management system £spaces£ £/spaces£I: debconf-i18n 1.5.28ubuntu1 full internationalization support for debconf £spaces£ £/spaces£I: liblocale-gette 1.05-4build1 Using libc functions for internationalization in Perl £spaces£ £/spaces£I: libtext-iconv-p 1.7-2 converts between character sets in Perl £spaces£ £/spaces£I: perl-base 5.10.0-24ubuntu minimal Perl system £spaces£ £/spaces£I: libtext-wrapi18 0.06-7 internationalized substitute of Text::Wrap £spaces£ £/spaces£I: libtext-charwid 0.04-6 get display widths of characters on the terminal £spaces£ £/spaces£I: findutils 4.4.2-1 utilities for finding files--find, xargs £spaces£ £/spaces£I: vim-runtime 7.2.245-2ubuntu Vi IMproved - Runtime files £spaces£ £/spaces£I: dpkg 1.15.4.1ubuntu1 Debian package management system £spaces£ £/spaces£I: libacl1 2.2.48-1 Access control list shared library £spaces£ £/spaces£I: libattr1 2.4.44-1 Extended attribute shared library £spaces£ £/spaces£I: libgpm2 1.20.4-3.2ubunt General Purpose Mouse - shared library £spaces£ £/spaces£I: libncurses5 5.7+20090803-2u shared libraries for terminal handling £spaces£ £/spaces£I: libpython2.6 2.6.4-1ubuntu1 Shared Python runtime library (version 2.6) £spaces£ £/spaces£I: python2.6 2.6.4-1ubuntu1 An interactive high-level object-oriented language (version 2.6) £spaces£ £/spaces£I: python2.6-minim 2.6.4-1ubuntu1 A minimal subset of the Python language (version 2.6) £spaces£ £/spaces£I: libssl0.9.8 0.9.8g-16ubuntu SSL shared libraries £spaces£ £/spaces£I: zlib1g 1.2.3.3.dfsg-15 compression library - runtime £spaces£ £/spaces£I: mime-support 3.46-1ubuntu1 MIME files 'mime.types' & 'mailcap', and support programs £spaces£ £/spaces£I: libbz2-1.0 1.0.5-3 high-quality block-sorting file compressor library - runtime £spaces£ £/spaces£I: libdb4.7 4.7.25-7ubuntu2 Berkeley v4.7 Database Libraries [runtime] £spaces£ £/spaces£I: libncursesw5 5.7+20090803-2u shared libraries for terminal handling (wide character support) £spaces£ £/spaces£I: libreadline6 6.0-5 GNU readline and history libraries, run-time libraries £spaces£ £/spaces£I: readline-common 6.0-5 GNU readline and history libraries, common files £spaces£ £/spaces£I: libsqlite3-0 3.6.16-1ubuntu1 SQLite 3 shared library £spaces£ £/spaces£I: libselinux1 2.0.88-1 SELinux runtime shared libraries Solution 1 sur 1, de poids 0. Téléchargement de 23 Mio, installation de 83 Mio Accepter (y), Suivante (n), Précédante (p) ou Annuler (c) ? real 0m0.037s user 0m0.017s sys 0m0.010s Installer des paquets avec plus de dépendances est normalement possible, mais le script de portage Ubuntu vers Setup laisse quelques imperfections (des paquets qui n'existent pas par exemple, ou des conflits étranges). Cette résolution des dépendances montre l'exactitude des solutions trouvées (ce n'est pas loufoque), et la rapidité. 37 centièmes de seconde, c'est **très** rapide ! _5. Installation_ L'installation en elle-même est rapide, mais difficile à démontrer pour les raisons suivantes : * Les paquets Ubuntu ne peuvent être installés par Setup. Ce «port» n'est qu'un hack immonde visant à tester le solveur. * Les paquets que j'ai créés sont des paquets de tests, posant des «questions» (comme DebConf). Déduire mon temps de réaction serait trop imprécis pour obtenir une mesure fiable La seule solution est d'installer le seul paquet qui appartient à Logram et ne pose pas de questions : libinitng. Pour avoir tout de même une résolution des dépendances, libinitng-dev (qui dépend de libinitng) sera installé également. Il ne pose pas non-plus de questions. $ time ./setup -R /tmp/setup add libinitng-dev Paquets qui seront installés ou supprimés : £spaces£ £/spaces£Légende : I: Installer R: Supprimer U: Mettre à jour P: Supprimer totalement £spaces£ £/spaces£I: libinitng-dev 0.6.99+git20091 Système de démarrage init-ng, fichiers de développement £spaces£ £/spaces£I: libinitng 0.6.99+git20091 Système de démarrage init-ng, bibliothèques partagées Solution 1 sur 1, de poids 0. Téléchargement de 168 Kio, installation de 400 Kio Accepter (y), Suivante (n), Précédante (p) ou Annuler (c) ? Installation des paquets... [0/2] Téléchargement de libinitng-dev [1/2] Téléchargement de libinitng [0/2] Installation de libinitng-dev [1/2] Installation de libinitng Paquets installés ! real 0m0.139s user 0m0.058s sys 0m0.086s Vous voyez que les téléchargements **et les installations** sont faits en parallèle. Ainsi, pas de temps perdus (les téléchargements peuvent être sur plusieurs mirroirs, si jamais il y en a un qui est lent. Les installations peuvent utiliser plusieurs coeurs). Le tout est très rapide, et marche. Les fichiers sont installés dans /tmp/setup, pour éviter de sâlir la distribution hôte. _6. Fichiers d'un paquet installé_ On peut ensuite récupérer la liste des fichiers installés par un paquet : $ time ./setup -R /tmp/setup files libinitng-dev /tmp/setup/usr/share/doc/initng/initng-chart.png ... Je vous fais grâce des 100 lignes ici ... /tmp/setup/usr/include/libinitng-0.7/initng/event/all.h /tmp/setup/usr/include/libinitng-0.7/initng.h real 0m0.012s user 0m0.005s sys 0m0.004s **Conclusion** J'espère que lire ce journal ne vous a pas trop ennuyé. Je ne pense pas qu'une dépêche soit nécessaire, du fait que ce n'est que la sortie d'une version Alpha d'un programme peu connu. J'espère que vous trouverez un intérêt à Setup. Pour plus d'informations, lisez [l'annonce officielle de la sortie](http://logram-project.org/news-2-17-1-sortie-de-setup-et-libpackages-01-alpha0.html), avec des détails moins techniques mais plus logistiques (et aussi une grosse simplification des choses pour être compréhensible par plus de monde). Merci de m'avoir lu. PS: Ce journal s'adresse avant tout à ceux qui s'intéressent à Setup, et je sais qu'il y en a (ils se sont manifestés dans les autres news). Il n'a pas pour but de me vanter, de vanter Setup, de faire de la pub, etc. J'autorise tout le monde à m'ignorer royalement :-) .