27 January 2012

Raphaël Hertzog

4 astuces pour maintenir un paquet Debian « 3.0 (quilt) » dans un système de suivi de versions (VCS)

La plupart des paquets Debian sont gérés grâce à un logiciel de gestion de versions (VCS – Version Control System) tel que git, subversion, bazaar ou mercurial. Les particularités du format « 3.0 (quilt) » ne sont pas sans conséquences sur la gestion des paquets dans un VCS, et cet article va vous présenter quelques astuces afin d’en rendre l’usage plus agréable.

(Tous les exemples présentés ci-dessous s’appuient sur l’utilisation de git comme VCS).

1. Exclusion du répertoire .pc

Le répertoire .pc est utilisé par quilt afin de stocker ses données internes (liste des patchs appliqués, sauvegarde des fichiers modifiés). Il est également créé par dpkg-source de telle sorte que quilt « sache » que les patchs sont situés dans debian/patches (et non dans patches, qui est le répertoire que quilt utilise par défaut). À ce titre, le répertoire est conservé même lorsque plus aucun patch n’est actuellemement appliqué.

Vous ne tenez cependant pas à conserver ce répertoire dans votre dépôt : il doit donc être mentionné dans la liste des fichiers exclus. Avec git, il suffit d’indiquer :

$ echo ".pc" >>.gitignore
$ git add .gitignore
$ git commit -m "Ignore quilt dir"

Le fichier .gitignore n’étant pas pris en compte par dpkg-source, le paquet source généré par ce dernier ne sera pas « pollué ».

2. Retirer les patchs après la compilation

Si vous stockez vos sources « amont » avec les patchs non appliqués (ce que font la plupart des gens) et que vous ne compilez pas vos paquets dans un répertoire temporaire prévu à cet effet, alors vous souhaitez probablement « désappliquer » les patchs après la compilation, de sorte à retrouver un dépôt dans un état « propre ».

C’est désormais le comportement par défaut de dpkg-source. S’il a dû appliquer les patchs, il les enlèvera automatiquement également.

Mais on peut tout de même forcer ce comportement en ajoutant « unapply-patches » à debian/source/local-options :

$ echo "unapply-patches" >>debian/source/local-options
$ git add debian/source/local-options
$ git commit -m "Unapply patches after build"

svn-buildpackage compilant systématiquement dans un répertoire temporaire, le dépôt est laissé exactement dans le même état qu’avant la compilation : cette option est inutile dans ce cas. Ce comportement peut également être demandé à git-buildpackage grâce à l’option --git-export-dir=../build-area/ (../build-area/ étant le répertoire utilisé par svn-buildpackage, cette option force git-buildpackage à se comporter comme svn-buildpackage).

3. Gérer vos patchs quilt comme une branche git

Plutôt que de gérer les patchs spécifiques à Debian via quilt, il est possible d’utiliser git lui-même. Avec git-buildpackage vient l’outil gbp-pq (Git-BuildPackage Patch Queue – File des patchs de git-buildpackage). gbp-pq permet l’export d’une série quilt dans une branche git, que vous pouvez alors manipuler comme vous le souhaitez. Chaque commit représentant un patch, vous devez « rebaser » cette branche afin d’éditer les commits intermédiaires. Jetez un oeil à la documentation de gbp-pq pour appronfondir le sujet.

Alternative à gbp-pq, l’utilisation de git-dpm est plus compliquée, mais présente l’avantage de conserver l’historique de toutes les branches utilisées pour générer les séries quilt de toutes les publications Debian. Son principe de fonctionnement est très bien expliqué sur son site, et vous pouvez également souhaiter lire la revue qu’en a fait Sam Hartman, qui en présente les limites.

4. Documenter la manière de passer en revue les modifications

L’un des principaux bénéfices liés à l’utilisation du nouveau format source tient au fait qu’il est dorénavant simple de passer en revue les modifications amont : celles-ci sont conservées en autant de patchs distincts proprement documentés (et, idéalement, en utilisant le format DEP-3). En utilisant les outils décrits précédemment, le message de commit devient l’en-tête du patch. Il devient donc important de saisir des messages de commit explicites.

Cette méthode fonctionne bien tant que votre méthode de travail prend appui sur les patchs Debian, regroupés dans une branche que vous rebasez sur les sources amont à chaque publication. Certains mainteneurs n’aiment pas cette méthode de travail et préfèrent voir appliquer les modifications propres à Debian directement sur la branche d’empaquetage. Ils sautent alors vers une nouvelle version amont en la fusionnant dans cette dernière. Il est difficile dans ce cas de générer une série quilt à partir du système de suivi de versions. Il faut à la place indiquer à dpkg-source de stocker toutes les modifications dans un seul patch (qui devient alors équivalent au bon vieux .diff.gz), et documenter dans son en-tête comment mieux passer en revue les modifications, par exemple dans l’interface Web du VCS.

Le premier comportement est obtenu en passant l’option --single-debian-patch, et le second en écrivant l’en-tête dans debian/source/patch-header :

$ echo "single-debian-patch" >> debian/source/local-options
$ cat >debian/source/patch-header <<END
This patch contains all the Debian-specific
changes mixed together. To review them
separately, please inspect the VCS history
at http://git.debian.org/?=collab-maint/foo.git
<Put more details here>
END

Ceci est une traduction de mon article 4 tips to maintain a “3.0 (quilt)” Debian source package in a VCS contribuée par Weierstrass01. Vous voulez d’autres tutoriels comme celui-ci ? Cliquez ici pour vous abonner à ma newsletter et recevoir les nouveaux articles par email.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

27 January, 2012 10:04AM par Raphaël Hertzog

24 January 2012

Charles Plessy

Étrange Megumi

Cela fait deux jours que tous mes courriels, @debian.org y compris, sont coincés entre leur envoyeur et mon MX, car mon serveur a cassé à un moment où je n'avais pas une seconde à moi (date butoir pour une de financement). C'est un OpenRD Ultimate avec un disque solide d'occasion. J'étais bien content d'avoir un système ARM sous la main, pour tester quelques paquets comme T-COFFEE, mais il semble que je vais devoir le remplacer.

On dirait que la machine redémarre en permanence. Aucune tentative d'accéder au port série USB n'a été fructueuse; il ne se passe pas 10 secondes sans que le port USB ne soit déconnecté / reconnecté. Les loupiotes des deux ports ethernet clignotent ensemble de manière synchrone avec les déconnections. Retirer le disque solide n'a rien changé.

Le disque lui-même se porte bien, et je n'ai rien trouvé dans les logs qui suggère un problème logiciel. Coïncidence étrange, le dernier fichier de log modifié est daemon.log, qui indique la visite de notre réseau sans fil, non protégé mais à ma connaissance jamais visité, d'un(e) certain(e) megumi-PC. Après, plus rien.

24 January, 2012 03:23PM

16 January 2012

Stéphane Blondon

Carte heuristique de commandes unix

Voici une carte heuristique (mind map en anglais) de commandes unix.

Évidemment, la carte est loin d’être exhaustive (il n’existe pas d’écran assez grand pour toutes les afficher en même temps). Il s’agit plutôt d’une tentative pour représenter les outils disponibles en partant du besoin de l’utilisateur plutôt que des outils eux-mêmes : il est facile de consulter une page de manuel si l’on sait quelle page consulter. La commande apropos et le web permettent en général de trouver quelle commande utiliser mais cela reste parfois difficile lorsque l’on ne sait pas définir exactement son problème.

Lorsqu’il y a plusieurs commandes sur le même noeud, cela signifie qu’elles peuvent être utilisées dans le même but mais selon les préférences, les habitudes ou leur disponibilité (si elles sont installées ou non sur le système), on pourra préférer l’une ou l’autre d’entre elles. Par exemple, à titre personnel, j’apprécie most comme lecteur de fichier, entre autres pour la coloration des pages de manuel, mais le paquet n’est pas installé par défaut sous Debian et dérivées. Dans ce cas-là, less est la solution. Je ne cite pas more, réservé aux fans de masochisme hardcore. Autant utiliser cat, il y a un caractère de moins à taper.

Parfois des paramètres sont ajoutées à la commande car ils sont nécessaires pour l’obtention du résultat attendu. Pour autant, l’utilisateur ne devrait pas faire l’économie de regarder les autres options s’il désire un résultat un peu différent.

La plupart des outils cités sont très connus. À part peut-être cal (inclus dans le paquet bsdmainutils dans Debian), concalc (paquet concalc), fold (inclus dans le paquet coreutils) ou tree (paquet tree) ?

Rappelons que la puissance du shell ne se résume à des outils mais bien dans leur combinaison. Si elle ne suffit pas, rien n’empêche d’utiliser un langage de script de plus haut niveau (Perl, Python, Ruby, etc.).

Sources

Carte réalisée avec Freeplane v.1.1.3.
D’autres logiciels existent :

  • Freemind, Vym (directement dans Debian) ;
  • xmind, labyrinth, etc. (non packagés).

Le fichier source .mm est disponible ici.

D’autres personnes ont déjà réalisés des cartes heuristiques comme ici ou .

http://screenshots.debian.net est un site regroupant des captures d’écran de logiciels en actions qui sont disponibles comme paquet dans Debian. L’envoi de captures d’écran de paquets pour compléter le site est ouvert à tous. Les captures sont aussi réutilisées ailleurs, par exemple dans synaptic.


16 January, 2012 11:06PM par ascendances

15 January 2012

Tanguy Ortolo

Structure d'un document EPUB 2

Le logo EPUB : un E vert, avec en légende le mot ePUB

J'ai détaillé dans un autre billet l'intérêt du format EPUB. Comme on me pose souvent des questions sur la nature technique de ce format, et que je m'en pose moi-même de temps en temps, voici quelques explications concernant la version 2 de cette norme. Je n'ai pas encore eu le temps ni l'occasion d'étudier le format EPUB 3 pour le moment.

Objectif de conception

Le format EPUB a été conçu pour les publications électroniques, en utilisant autant que possible des technologies existantes :

  • les textes utilisent le format XHTML 1.1 ;
  • la table de navigation utilise le format NCX défini précédemment pour les livres numériques parlants ;
  • la description du livre avec ses méta-données utilise un format spécifique, OPF, qui intègre la sémantique Dublin Core ;
  • le point d'entrée utilise un format XML ultra-simple qui provient visiblement d'OpenDocument, quoiqu'il ne soit pas mentionné dans cette dernière norme ;
  • le tout est empaqueté dans un conteneur ZIP, une idée récupérée d'OpenDocument, qui la tient vraisemblablement de StarOffice et de Java.

Cette volonté de réutilisation comporte quelques inconvénients, parmi lesquels un certain manque d'homogénéité et un recoupement partiel entre les formats NCX et OPF qui implique la duplication de certaines informations. Bref, c'est à mon avis un peu plus compliqué que si ça avait été conçu de zéro, mais on ne peut pas dire que ça réinvente la roue, bien au contraire.

Le format EPUB est donc défini par l'International Digital Publishing Forum (IDPF), sous le forme de trois volets :

  • Open Container Format, qui définit ce qu'on appellerait naturellement la structure d'empaquetage ;
  • Open Packaging format, qui définit les formats de structuration qui font qu'un livre n'est pas seulement une série de documents HTML en vrac ;
  • Open Publishing Structure, qui définit les formats internes des fichiers qui constituent le contenu d'un livre, en se référant aux formats XHTML et CSS, pour l'essentiel.

Conteneur ZIP

Une publication électronique étant pour des raisons pratiques constituée de plusieurs fichiers, tous ces fichiers sont empaquetés dans un conteneur ZIP, avec une structure qui ressemble à ceci :

  • mimetype
  • META-INF/
    • container.xml
  • OEBPS/
    • content.opf
    • toc.ncx
    • cover.xhtml
    • cover.jpg
    • chap1.xhtml
    • chap2.xhtml

Pour pouvoir identifier facilement un fichier EPUB avec un outil comme file, un fichier mimetype contenant la chaîne « application/epub+zip » est placé en première position, non compressé afin que cette chaîne apparaisse en clair à une position fixe dans le document empaqueté.

% file formation-debian.epub 
formation-debian.epub: EPUB ebook data
% file -i formation-debian.epub 
formation-debian.epub: application/epub+zip; charset=binary

Cette structure est définie dans le premier volet de la norme EPUB, qui s'intitule Open Container Format (OCF).

Point d'entrée META-INF/container.xml

Le fichier META-INF/container.xml sert de point d'entrée du document, en indiquant le nom du fichier de description du livre OPF :

<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
    <rootfiles>
        <rootfile full-path="OEBPS/content.opf"
            media-type="application/oebps-package+xml" />
    </rootfiles>
</container>

La nécessité d'un tel fichier n'est pas évidente ; la norme OCF mentionne seulement rapidement la possibilité d'inclure dans un même conteneur d'autres représentations du document, par exemple une version PDF, qui serait alors indiqué comme second rootfile possible.

Description du document OEBPS/content.opf

Ce fichier est le fichier principal qui définit un document EPUB. Il indique ses méta-données, la liste des fichiers qui le constitue, ainsi que leur ordre d'affichage, désigné par le nom imagé de colonne vertébrale. Il indique également l'emplacement d'un troisième fichier, la table des matières.

Ce fichier est traditionnellement nommé content.opf et placé, ainsi que tous les fichiers qui constituent le document, dans un répertoire OEBPS/, mais ce n'est qu'une convention : il est possible de le nommer autrement, pourvu qu'il soit correctement référencé dans le point d'entrée.

<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>Formation Debian GNU/Linux</dc:title>
        …
    </metadata>
    <manifest>
        <item id="ncxtoc" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
        <item id="stylesheet" href="style.css" media-type="text/css"/>
        <item id="preface" href="preface.xhtml" media-type="application/xhtml+xml"/>
        <item id="chap1" href="chap1.xhtml" media-type="application/xhtml+xml"/>
        …
    </manifest>
    <spine toc="ncxtoc">
        <itemref idref="preface"/>
        <itemref idref="chap1"/>
        …
    </spine>
</package>

Le format de ce fichier est défini dans le second volet de la norme EPUB, qui s'intitule Open Packaging Format.

Table des matières OEBPS/toc.ncx

La table des matières ou navigation control file (NCX) complète le fichier de description : alors que ce dernier indiquait l'ordre de lecture des fichiers composant le document, celle-ci fournit une liste hiérarchique des chapitres ou sections du document.

La différence est subtile : l'ordre de lecture est utilisé pour mettre bout à bout les fichiers lorsque l'utilisateur tourne les pages virtuelles, alors que la table des matières hiérarchique est utilisée lorsqu'il appelle le sommaire. Pour établir une comparaison, la colonne vertébrale du document est semblable à la reliure qui ordonne les pages d'un livre en papier de bois d'arbre, alors que la table des matières est semblable aux quelques pages qui donnent sa… table des matières. :-)

Le format de table des matières ayant été repris du format de livres parlants DAISY, il comporte quelques éléments qui sont redondants avec le fichier de description, notamment le titre du livre.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx version="2005-1" xml:lang="en" xmlns="http://www.daisy.org/z3986/2005/ncx/">
    <head>
        <meta name="dtb:uid" content="…"/>
        …
    </head>
    <docTitle>
        <text>Formation Debian GNU/Linux</text>
    </docTitle>
    <navMap>
        <navPoint id="preface" playOrder="1">
            <navLabel><text>Chapitre 1</text></navLabel>
            <content src="preface.xhtml"/>
        </navPoint>
        <navPoint id="chap01" playOrder="1">
            <navLabel><text>Chapitre 1</text></navLabel>
            <content src="chap1.xhtml"/>
        </navPoint>
        …
    </navMap>

Contenu

Après tous ces formats qui s'apparentent à des données annexes de structure ou d'information, le contenu proprement dit d'un document EPUB prend la forme d'une série de documents XHTML, qui peuvent faire références à des feuilles de style ou à des images.

Le troisième volet de la norme EPUB, Open Publication Structure, précise les fonctionnalités des formats XHTML et CSS qui peuvent être utilisées, et propose le format alternatif DTBook qui peut être utilisé à la place de XHTML.

Méfiez-vous des contrefaçons !

EPUB est le format standard pour les livres numériques, mais bien qu'il soit le format le plus répandu, certains éditeurs ou libraires préfèrent utiliser des formats propriétaires. Amazon est notoirement connu pour refuser la norme, avec un format réellement spécifique à leurs liseuses, mais d'autres acteurs utilisent des formats inspirés d'EPUB, ce qui est plus pernicieux. Citons notamment les EPUB verrouillés et les « KEPUB » de Kobo et de la Fnac. Méfiance donc : exigez du véritable EPUB !

15 January, 2012 11:48AM par Tanguy

09 January 2012

Raphaël Hertzog

Mes activités Debian en décembre 2011

Voici le récapitulatif mensuel de toutes mes activités gravitant autour de Debian. Si vous faites partie des personnes ayant fait un don pour soutenir mon travail (364,18 €, merci à tous !), c’est l’occasion de constater ce que je fais de votre argent. Sinon, c’est toujours quelques nouvelles intéressantes sur l’avancement de mes différents projets.

dpkg et multiarch

J’avais quelques espoirs d’obtenir pour Noël, dans Sid, une version de dpkg supportant multi-arch. L’objectif était jugé réaliste par Guillem, mais celui-ci tomba malade… ce qui nous renvoie à ce mois de janvier, où rien n’a vraiment avancé.

La taille de sa branche pu/multiarch/master n’a pas vraiment diminué, et ce alors que certains de ses commits de décembre concernaient le support multi-architecture. Il nous en reste encore 36 à intégrer, et la majorité du travail qu’il a réalisé s’apparente à de la re-factorisation de bouts de code déjà intégrés. Il a également lancé plusieurs discussions concernant des changements d’interface. J’y ai participé, avec l’espoir de pouvoir de les amener à une conclusion rapide.

De mon côté, je maintiens toujours ma propre branche pu/multiarch/full, dérivée de celle de Guillem, mais augmentée de correctifs supplémentaires que j’ai réalisés, mais qui n’ont pas encore été intégrés. De plus, ma branche n’inclut pas une des modifications de Guillem : sa branche autorise en effet la mise à jour croisée de paquets entre architectures, tandis que dpkg ne gère pas encore correctement cette fonctionnalité.

J’ai commencé à travailler sur ce projet il y a un an déjà, et je ne peux qu’espérer que ce mois de janvier verra la conclusion de cette histoire sans fin. :-|

Travaux divers concernant dpkg

J’ai revu (et plus tard intégré) un patch de Kees Cook améliorant dpkg-buildflags de sorte que ce dernier puisse faire état des options de compilation renforcée activées. Cette fonctionnalité pourra ainsi permettre à des outils tels que lintian de détecter les options de compilation renforcée manquantes.

J’ai encadré/guidé Gianluca Ciccarelli qui essaye d’améliorer dpkg-maintscript-helper afin de gérer correctement le remplacement de répertoires par des liens symboliques, et vice-versa.

Je me suis occupé du bogue n°651993, de sorte que dpkg-mergechangelogs n’échoue plus lorsqu’il rencontre une version de changelog invalide. Je me suis également occupé du n°652414, de telle sorte que dpkg-source --commit accepte un nom de fichier relatif lorsqu’un fichier de patch lui est explicitement passé.

Guillem a également intégré un correctif que j’ai développé concernant le bogue LP n°369898.

Travaux d’empaquetage

Je me suis attelé à l’empaquetage de WordPress 3.3 dès que la version est sortie. L’upstream n’a pas mis à jour sa page de conformité à la licence GPL, ce en dépit du rapport de bogue que j’avais créé. Je me suis donc mis en chasse des sources requises, et les ai intégrées dans l’archive debian.tar.xz du paquet source Debian. C’est une solution assez brutale, mais qui présente le double avantage, d’une part, de permettre la clôture du bogue critique pour la publication n°646729 ; et d’autre part, de réintroduire les fichiers Flash écartés par le passé… ce qui est une bonne chose, dans la mesure où cet uploader à base de Flash est beaucoup plus joli que celui tirant parti du navigateur.

Quilt 0.50 est sortie après 2 ans de (lent) développement. Le paquet Debian comporte de nombreux patchs, et plusieurs de ces derniers ont du être mis à jour afin de tenir compte de cette publication. Certains d’entre eux furent heureusement intégrés upstream, mais cela ne me pris pas moins d’une matinée entière pour boucler cette mise à jour. J’ai également converti l’empaquetage de CDBS vers dh avec un mini-fichier debian/rules.

Zim 0.54 est sortie, et j’ai immédiatement mis à jour le paquet, car cette dernière version corrige un bogue qui m’ennuyait.

Revue de l’empaquetage de ledgersmb

En tant que mainteneur de sql-ledger (et utilisateur de ce logiciel pour ma comptabilité), j’espérais voir ledgersmb empaqueté, de sorte qu’il puisse tenir lieu de remplaçant pour ce premier. J’ai suivi tous les efforts déployés au fil du temps dans ce but, mais aucun n’a abouti à un véritable paquet Debian.

C’est vraiment dommage, et c’est la raison pour laquelle j’ai essayé d’y remédier en me proposant pour parrainer l’envoi du paquet. D’où une première revue de l’empaquetage. Cette revue a pris plusieurs heures, car il est nécessaire d’expliquer absolument tout ce qui n’est pas à la hauteur des standards attendus.

J’ai également créé un rapport de bogue/demande d’évolution pour le paquet lintian (cf. n°652963), suggérant que ce dernier devrait détecter les utilisations incorrectes de dpkg-statoverride (un exemple de « mauvaise » utilisation était présent dans le paquet de ledgersmb).

nautilus-dropbox

Je souhaitais fignoler les derniers détails du paquet dans les temps pour la sortie de la prochaine Ubuntu LTS, compte tenu du fait que le gel de l’import Debian est en janvier. J’ai ainsi intégré certaines des importantes corrections que je souhaitais apporter.

Le paquet Debian diverge de celui amont dans la mesure où les binaires non-libres ne sont pas installés dans $HOME, mais dans /var/lib/dropbox. Ma première correction a concerné un bogue qui avait pour effet une possession incorrecte des fichiers (normalement par root exclusivement). Décompresser le tarball en tant que root entraîne la réutilisation des informations de l’utilisateur et du groupe embarqués, informations ayant changé récemment du côté de Dropbox apparemment.

Nous avons ensuite identifié d’autres problèmes en lien avec la gestion des serveurs mandataires (proxy), cf. n°651065. J’ai également corrigé ce dernier, car il est relativement fréquent que le téléchargement initial déclenché durant la configuration du paquet échoue… et dans ce cas, il appartient à l’utilisateur de re-déclencher le téléchargement après avoir obtenu les autorisations appropriées via PackageKit. Sans mon correctif, l’usage de pkexec aurait entraîné la perte de la variable d’environnement http_proxy, et donc l’impossibilité pour l’utilisateur de télécharger à travers un serveur mandataire.

Enfin, j’ai également réorganisé les patchs spécifiques à Debian, ce afin de mieux séparer ce qui pourrait et devrait être intégré par les auteurs amonts, et ce dont ils ne veulent pas. Dropbox est malheureusement contre l’installation sous /var/lib/dropbox (et les changements qui en découlent), car ils tiennent à mettre à jour automatiquement leurs binaires non-libres.

Un point sur le livre

La traduction du Cahier de l’Admin Debian progresse : 6 chapitres sont déjà traduits (bien que non encore relus).

Sa campagne de libération, quant à elle, avance (lentement). Grâce à 90 nouveaux donateurs, la somme collectée est passée de 60 (début décembre) à 67% de la somme visée !

Merci

Au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Debian Activities in December 2011 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

09 January, 2012 07:05AM par Raphaël Hertzog

05 January 2012

Aurélien Jarno

Performances of open-source Radeon driver

I am the happy owner of a new netbook with an AMD Fusion E-450 APU, which includes a Radeon graphics card. I am using the open-source driver on it, that is a 3.2-rc7 kernel for KMS, and xserver-xorg-video-radeon package from sid. I have to say I am not really happy about the performances.

No I don’t speak about the graphical performances that are pretty good (especially compared to my Intel Atom N450 based previous netbook) but about the power consumption. With this setup and with the original battery I get 2h30 of autonomy. Switching to UMS and adding some power management options in xorg.conf improves it to 2h40, but breaks suspend to ram/disk (a pity for a netbook) and switch between VT. I then tried the non-free fglrx driver, it also suffers from the suspend to ram/disk issue, in addition to crashing xorg when playing videos… On the other hand I get an impressive 3h30 of autonomy, and additionally a silent netbook (contrary to the open-source driver, the fan doesn’t spin at idle).

I have tried plenty of options, ranging from adding some power management options to xorg.conf, to passing dynclks=1 to the radeon module, including setting /sys/class/drm/card0/device/power_method to dynpm. Right now I have worked around the issue by buying a bigger battery which brings me 5h30 of autonomy, but I would really appreciate any software way to improve it with the open-source driver.

05 January, 2012 11:27PM par aurel32

03 January 2012

Florent Gallaire

Django 1.4 passe à HTML5 ! et autres nouveautés

Le 22 décembre dernier est sorti Django 1.4 alpha 1. Comme on peu l’imaginer pour un projet d’une telle ampleur, cette nouvelle version apporte beaucoup de nouveautés. Je me contenterai d’en détailler rapidement cinq qui me semblent particulièrement intéressantes :

    1. Le passage au Doctype HTML5, tous les templates fournis avec Django, en particulier ceux de l’interface d’administration, utilisant donc désormais <!DOCTYPE html>. C’est un choix logique, qui permet d’utiliser toutes les nouvelles fonctionnalités de HTML5 sans plus se soucier de devoir corriger le Doctype.
    2. L’abandon du support de Python 2.4, datant de 2004, mais pas le passage à Python 3. Django supporte et est testé sur Python 2.5, 2.6 et 2.7.
    3. Le nouveau framework de test LiveServerTestCase, compatible avec Selenium et Windmill, pour tester l’interface de votre application web côté client (dans le navigateur web).
    4. La nouvelle option --template pour les commandes startapp et startproject, permettant de leur spécifier aisément un template personnalisé.
    5. La nouvelle clause elif pour la balise if. Elle permettra de ne plus avoir à imbriquer plusieurs if then else et autant d’indentations ou à se définir une balise personnalisée. Alors oui j’ose le dire : c’est pas trop tôt !

On voit donc qu’encore une fois Django continue d’avancer dans la bonne direction, bonifiant sans cesse une base déjà excellente. La seule chose que je regrette encore et toujours, c’est la défiance manifeste de la core team envers l’intégration de django-nonrel… peut-être pour Django 1.5 ?

flattr this!

03 January, 2012 04:38AM par fgallaire

30 December 2011

Roland Mas

Fin d'année

Je ne voudrais pas vous laisser, chers et chères lecteurtrices, sans nouvelles de tout le mois. Ça tombe bien, il me reste un peu de temps avant d'en fêter la fin officielle. Et comme traditionnellement c'est une période où on boucle une année, c'est l'occasion de revenir sur les événements marquants de mon petit monde. Comme ça, en vrac, parce que comme dit la chanson, un an de plus qu'il n'avait l'année dernière, un an de moins qu'il n'aura l'an prochain.

  • Ma mezzanine et son petit vasistas de toit se sont transformés en un vrai bureau et une terrasse (de toit aussi). Mine de rien, ça change la vie, l'apéro sur la terrasse (plutôt que dans la cuisine-bunker). Reste à fignoler quelques détails d'étanchéité, et ça sera tout bon.
  • Après plusieurs tentatives, il semble que je sois officiellement intégré comme batteur dans un groupe musical. Le répertoire actuel comprend essentiellement des reprises dans un style défini comme « blues/rock à l'ancienne », et ça va d'AC/DC à ZZ Top. Je ne manquerai pas de vous faire part des éventuelles apparitions publiques.
  • En plus d'acquérir une certaine aisance (relative) sur ma batterie, je continue d'accumuler des super-pouvoirs de geek et des points d'XP en travaillant pour des clients ; c'est un cercle vicieux, parce que ça me permet de traiter des clients plus nombreux, qui à leur tour me font travailler sur… etc. Je crois qu'à un moment il va falloir se limiter, sinon ça ne va plus rentrer dans 24 heures.
  • L'inconvénient quand on grandit c'est que ça devient mal vu de continuer à jouer avec des « jeux de gamins ». Mais au bout d'un certain temps, l'effet se retourne : il suffit de coller le mot magique « vintage », et hop ça redevient socialement acceptable de ressortir ses Lego et de faire du pixel-art. Et pour peu qu'on fasse une utilisation non-conventionnelle des jouets (cf. mon bricolage avec les wiimotes, dont je vous reparlerai certainement bientôt), ça passe même pour de l'avant-garde.

Si je devais résumer cette année, je dirais que j'ai parfaitement tenu mes bonnes résolutions (et qui peut en dire autant ?), et que je vais donc les reconduire, publiquement cette fois : prendre la vie comme elle vient, en profiter quand c'est possible, et garder fermement un sens des priorités pour ne pas se laisser embêter par les tracasseries et les fâcheux.

Et sur ces bonnes paroles, j'ai un réveillon déguisé musical à préparer, donc je vous souhaite un bon bout d'an. Paix aux gens de bonne volonté. Et aux autres aussi, on est pas vaches.

30 December, 2011 10:15AM

28 December 2011

Florent Gallaire

Le Barreau !

Ce post est un cadeau de Noël pour tous mes fans, avec bien sûr une spéciale dédicace pour Michel Houellebecq :-) .

J’ai réussi à ma première tentative ce qu’il est convenu d’appeler le concours d’avocat, le concours du Barreau, ou encore le Pré-CAPA, c’est-à-dire l’examen d’entrée à l’École de Formation du Barreau, le CRFPA parisien.

Pour illustrer, une très mauvaise photo du panneau d’affichage public des notes de l’Université Paris 1 Panthéon-Sorbonne, prise le 6 décembre dernier :

Je commence les cours spécifiques à la profession d’avocat, comme la déontologie, à partir de janvier. Et après deux stages dont le dernier en cabinet d’avocat, Maître Eolas devra donner du Cher Confrère à celui qu’il avait cru pouvoir définir comme un blogueur s’affirmant juriste.

En France, après Olivier Hugot chez qui j’ai effectué mon stage de Master, les logiciels libres auront donc bientôt un deuxième avocat réellement spécialisé. C’est important, car les développeurs de logiciels libres doivent pouvoir trouver des interlocuteurs compétents à qui parler, et par qui se faire représenter, y compris Pro-bono.

Avec la progression inéluctable de l’utilisation des logiciels libres, le contentieux ne pourra qu’augmenter, car les licences de logiciels libres et Creative Commons ne sont pas là pour faire joli, mais pour être respectées !

flattr this!

28 December, 2011 06:25AM par fgallaire

13 December 2011

Vincent Bernat

Comprendre la mise en cache des routes IPv4 sous Linux

Afin d’améliorer les performances lors de la consultation des tables de routage, Linux maintient un cache des routes. Dans le cadre d’un routeur, l’inefficacité de ce cache peut engendrer un impact important sur les performances.

La documentation de ce composant est très réduite. Il est difficile de trouver des explications à jour sur le fonctionnement et l’optimisation de ce cache. Le livre « Understanding Linux Network Internals » édité par O’Reilly est une exception et contient de précieuses informations sur le sujet. Même s’il a été écrit à l’époque du 2.6.12, la partie sur le cache des routes est toujours d’actualité. Malheureusement, ce livre est orienté développeur et ne s’attarde pas sur l’administration du cache.

J’espère fournir ici une vue concise sur le cache des routes, tel qu’implémenté dans Linux 3.11. Ce cache est dépendant du protocole sous-jacent2 et je ne couvre ici que la version IPv4.

Vue d’ensemble du cache des routes

Lorsque le noyau doit prendre une décision sur comment router un paquet IP, il consulte ses tables de routage. Bien que cela semble assez trivial, il doit répondre à un certain nombre de questions :

  • Est-ce que les adresses source et destination semblent valides ?
  • Est-ce que l’adresse source est martienne3 ?
  • Est-ce que l’adresse de destination est portée par le système ou doit-il router le paquet vers un autre système ?
  • Quelle table de routage faut-il utiliser ?
  • Est-ce que l’adresse de destination correspond à cette route ? Ou à celle-là ?
  • Est-ce que la passerelle à utiliser est actuellement disponible ?

Toutes ces vérifications peuvent prendre du temps, y compris pour des tables de routage réduites. Aussi, Linux tient à jour un cache des routes interrogé avant de consulter les tables de routage et mis à jour après chaque consultation. La commande ip -s route show cache permet de visualiser ce cache :

$ ip -s route show cache
198.51.100.7 from 203.0.113.2 via 192.0.2.1 dev eth1
  cache used 7 age 2sec ipid 0x1fce rtt 131ms rttvar 45ms cwnd 10
198.51.100.17 from 203.0.113.15 via 192.0.2.1 dev eth1
  cache used 3 age 0sec ipid 0xc3bd
local 192.0.2.18 from 203.0.113.15 dev lo src 192.0.2.18
  cache <local> used 154 age 1sec iif eth0

Voici deux exemples :

  • Si Linux reçoit un paquet de 198.51.100.17 destiné à 203.0.113.15, il va trouver le flux correspondant dans le cache. Il sait donc immédiatement qu’il a besoin de faire suivre ce paquet à la passerelle 192.0.2.1. Aucune vérification n’est nécessaire.
  • S’il reçoit un paquet de 198.51.100.16 pour 203.0.113.15, il n’existe aucune entrée appropriée dans le cache et le système doit donc se rabattre sur les tables de routage classiques. Il est probable que la même route que lorsque la source était 198.51.100.17 soit utilisée, mais il est possible qu’il existe une politique de routage différente (impliquant une autre table de routage) ou que 198.51.100.16 soit une adresse portée par le système lui-même et sera donc considérée comme martienne.

Le schéma ci-dessous indique comment est implémenté ce cache dans Linux4. Il utilise une table de hachage à la différence des systèmes BSD qui gardent le cache dans la table de routage. Chaque entrée est une liste chaînée où chaque élément est une entrée du cache.

Schéma de la table de hachage utilisé pour le cache des routes

Une fois qu’une entrée se trouve dans le cache, elle peut être retirée par divers mécanismes. La plupart des entrées sont retirées par le ramasse-miettes (garbage collector) qui parcourt le cache à la recherche d’entrées invalides ou trop vieilles. Il est activé quand le cache est plein ou, à intervalles réguliers, passé un certain seuil.

Réglages disponibles

Il existe plusieurs réglages pour modifier le comportement du cache. La plupart d’entre eux sont disponibles via la commande sysctl.

  • rhash_entries est la taille de la table de hachage5. Si sa valeur n’est pas spécifiée sur la ligne de commande du noyau, elle est calculée au démarrage du système selon la mémoire disponible. Il est possible de la connaître en cherchant, dans les journaux du noyau, quelque chose comme IP route cache hash table entries: 262144 (order: 9, 2097152 bytes).
  • net.ipv4.route.max_size est le nombre maximum d’entrées dans le cache. Excepté en des circonstances exceptionnelles, cette valeur ne peut jamais être dépassée.
  • net.ipv4.route.gc_elasticity représente la taille moyenne des listes chaînées dans la table de hachage. Le ramasse-miettes va se montrer plus agressif lorsque cette taille est dépassée. Cela signifie que le produit de cette valeur avec rhash_entries correspond au nombre d’entrées que le ramasse-miettes va tenter de conserver dans le cache.
  • net.ipv4.route.gc_min_interval_ms est le délai minimal entre deux exécutions du ramasse-miettes. Ce délai n’est pas respecté si le cache est plein. La valeur par défaut convient dans la grande majorité des cas.
  • net.ipv4.route.gc_thresh est le seuil de déclenchement du ramasse-miettes. Celui s’exécute alors toutes les net.ipv4.route.gc_min_interval_ms millisecondes.
  • net.ipv4.route.gc_timeout est la valeur de base utilisée pour déterminer si une entrée est suffisamment ancienne pour être retirée. Quelle que soit la valeur de ce paramètre, le ramasse-miettes tentera d’enlever le même nombre d’entrées. Toutefois, cette valeur peut influencer son efficacité. Nous verrons cela plus en détail par la suite.

Il existe deux réglages que l’on retrouve souvent dans les documentations mais qui sont désormais obsolètes :

  • net.ipv4.route.secret_interval a été retiré de Linux 2.6.35 ; il permettait de vidanger le cache à intervalles réguliers pour éviter qu’il ne se remplisse.
  • net.ipv4.route.gc_interval a été retiré de Linux 2.6.38. Il est toujours présent jusqu’à la version 3.2 mais sans effet. Il permettait de déclencher un nettoyage régulier du cache. Le ramasse-miettes est désormais capable de se débrouiller seul.

MISE À JOUR : Le paramètre net.ipv4.route.gc_interval est de retour dans Linux 3.2. Il est en effet nécessaire pour éviter d’enrayer le ramasse-miette du cache ARP grâce à un nettoyage périodique (contrairement au ramasse-miette qui se déclenche uniquement passé un certain seuil). Il est préférable de laisser ce paramètre à sa valeur par défaut qui est 60.

Statistiques & surveillance

Linux maintient un certain nombre de statistiques sur le cache des routes. Celles-ci sont situées dans /proc/net/stat/rt_cache. La commande lnstat permet de les afficher de manière conviviale :

$ lnstat -s1 -i1 -c-1 -f rt_cache
rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|rt_cache|
 entries|  in_hit|in_slow_|in_slow_|in_no_ro|  in_brd|in_marti|in_marti| out_hit|out_slow|out_slow|gc_total|gc_ignor|gc_goal_|gc_dst_o|in_hlist|out_hlis|
        |        |     tot|      mc|     ute|        |  an_dst|  an_src|        |    _tot|     _mc|        |      ed|    miss| verflow| _search|t_search|
 3096848|   42309|     686|       0|       0|       0|       0|       0|       3|       0|       0|     674|     672|       0|       0|   27644|       8|
 3096984|   41405|     636|       0|       0|       0|       0|       0|       3|       0|       0|     623|     621|       0|       0|   28189|       8|
 3097160|   42483|     700|       0|       0|       0|       0|       0|       5|       0|       0|     694|     692|       0|       0|   29506|      12|

À l’exception de la première colonne, toutes les valeurs affichées sont en unités par seconde. Voyons ce que signifient certaines d’entre elles :

  • rt_cache_entries est le nombre d’entrées actuellement dans le cache. Cette valeur est à comparer avec net.ipv4.route.max_size pour s’assurer que le cache n’est jamais plein et éviter ainsi le déclenchement continu du ramasse-miettes.
  • rt_cache_in_hit et rt_cache_out_hit représentent le nombre de fois où une route a été trouvée dans le cache pour les paquets entrants et sortants, respectivement. Quand un système est utilisé comme routeur, la route est déterminée lorsque le paquet arrive sur le système. Ces valeurs sont à comparer avec rt_cache_in_slow_tot et rt_cache_in_out_slow_tot qui sont le nombre de fois où les tables de routage classiques ont dû être consultées. Sur ce système, l’efficacité du cache est de plus de 98%.
  • rt_cache_gc_total indique combien de fois le ramasse-miettes a été sollicité tandis que rt_cache_gc_ignored correspond au nombre de fois où il n’a finalement rien fait car il a été démarré peu de temps auparavant (moins de net.ipv4.route.gc_min_interval_ms millisecondes). La différence entre ces deux valeurs doit être faible afin de s’assurer que le ramasse-miettes ne se déclenche pas plus de quelques fois par seconde.
  • rt_cache_gc_goal_miss indique combien de fois le ramasse-miettes n’a pas été capable d’enlever les entrées qu’il aurait souhaité retirer. Cette valeur doit être rarement différente de 0.
  • rt_cache_gc_dst_overflow est le nombre de fois où le cache est plus gros que le maximum autorisé. Cela ne doit jamais arriver, sauf lorsque la taille du cache est changée.
  • rt_cache_in_hlist_search et rt_cache_out_hlist_search indique combien de fois il a été nécessaire d’avancer dans une liste chaînée de la table de hachage : à chaque fois que Linux doit suivre le pointeur next, un de ces compteurs est incrémenté. Ces valeurs sont à comparer avec le nombre de requêtes utilisant le cache (que celles-ci aient réussi ou non).

À titre d’illustration, le graphique suivant montre les différentes statistiques exposées ci-dessus dans le cas d’un routeur recevant environ un millier de nouvelles routes par seconde :

Graphique montrant les diverses statistiques issues du cache des routes

rhash_entries a comme valeur 1 048 576, de même pour net.ipv4.route.gc_thresh. Ainsi, le ramasse-miettes s’active à partir de ce seuil. Il n’est exécuté que deux fois par seconde (la valeur de net.ipv4.route.gc_interval_ms est 500) car le cache n’est pas plein. net.ipv4.route.gc_elasticity a comme valeur 3. Cela explique pourquoi le ramasse-miettes devient plus agressif lorsque le nombre d’entrées atteint 3 145 728.

Comme vous pouvez le constater, l’efficacité du cache culmine constamment à près de 100%. Le pourcentage de collisions correspond au rapport de rt_cache_in_hlist_search avec la somme de rt_cache_in_hit et rt_cache_in_slow_tot.

MISE À JOUR : Le graphique ci-dessus provient de valeurs récoltées sur un noyau 2.6.39. Pour un noyau 2.6.35, 2.6.36, 2.6.37 ou 3.2 ou plus récent, le nettoyage effectué toutes les net.ipv4.route.gc_interval secondes va retirer jusqu’à rhash_entries entrées. Si la vitesse à laquelle les nouvelles routes sont ajoutées dans le cache est inférieure à ce rhythme, le nombre d’entrées dans le cache peut décroître même si le seuil défini par net.ipv4.route.gc_threshold n’est pas atteint. À titre d’exemple, voici ce qu’on obtient sur un routeur équipé d’un noyau 2.6.35 et recevant environ 2500 nouvelles routes par seconde ; le seuil de 1 048 576 n’est jamais atteint et le ramasse-miette ne se déclenche donc jamais :

Graphique montrant les diverses statistiques issues du cache des routes sous influence de gc_interval

Optimisations

Quelles sont les valeurs à modifier ? Il faut se poser principalement deux questions :

  1. Quelle efficacité veut-on obtenir du cache ?
  2. Quelle quantité de mémoire veut-on dédier au cache ?

Concernant la mémoire, il faut compter environ 500 Mo pour deux millions d’entrées sur un système 64 bits. À partir de là, il est possible de calculer la consommation moyenne et maximale à partir des valeurs de net.ipv4.route.max_size, rhash_entries et net.ipv4.route.gc_elasticity. Par exemple, si la table de hachage peut contenir 262 144 entrées, que le nombre d’entrées maximal dans le cache est 4 194 304 et que la valeur de net.ipv4.route.gc_elasticity est 8, le cache va utiliser en moyenne 500 Mo et au maximum 1 Go. Si cela représente trop de mémoire, il faut modifier certaines valeurs.

Concernant l’efficacité, la section précédente indique comment la calculer à partir des statistiques exportées par Linux. En règle générale, l’efficacité est supérieure à 90%. Pour l’améliorer, il peut être nécessaire d’augmenter la taille du cache.

Pour doubler le nombre d’entrées dans le cache, il faut doubler net.ipv4.route.max_size, net.ipv4.route.gc_thresh et rhash_entries mais garder net.ipv4.route.gc_elasticity à 8.

Pour que le ramasse-miettes soit efficace, le cache ne doit pas se remplir trop vite. Le ramasse-miettes peut normalement s’adapter à cette situation en effectuant plusieurs passes pour retirer des entrées mais cela impacte alors les performances. Il faut surveiller gc_goal_miss : si cette valeur a tendance à ne pas rester nulle, il peut alors être souhaitable de diminuer net.ipv4.route.gc_timeout.

MISE À JOUR : Avec un noyau où le paramètre net.ipv4.route.gc_interval a une influence, les choses se compliquent. L’algorithme de nettoyage va retirer des entrées à intervalles réguliers d’une façon plus compliquée à prédire. Le nombre moyen d’entrées peut donc être plus faible que la valeur théorique calculée ci-dessus à moins que le nombre de nouvelles entrées par seconde soit suffisamment élevé. La surveillance des différentes métriques est donc indispensable pour trouver les réglages appropriés. Si les entrées semblent expirer trop vite, il est possible de doubler la valeur de net.ipv4.route.gc_timeout.

Le ramasse-miettes en détails

Pour mieux comprendre les indications données auparavant, il est nécessaire d’examiner le fonctionnement du ramasse-miettes. Celui-ci est principalement activé lorsqu’une nouvelle entrée doit être ajoutée au cache et que le nombre d’entrées actuellement en cache dépasse le seuil net.ipv4.route.gc_thresh. Il est implémenté dans la fonction rt_garbage_collect(). Il ne fait rien s’il a déjà été appelé il y a moins de net.ipv4.route.gc_interval_ms millisecondes, à moins que le cache ne soit plein (plus de net.ipv4.route.max_size entrées).

Choisir un but

Le ramasse-miettes va tout d’abord examiner la situation. Il compare le nombre d’entrées actuellement dans le cache avec le produit de rhash_entries et de net.ipv4.route.gc_elasticity:

  1. au-dessous de cette limite, il enlève au plus la moitié de la différence ;
  2. dans le cas contraire, il va tenter d’enlever au moins rhash_entries entrées.

Si on examine le graphique précédent, il est aisé de constater la différence quand le ramasse-miettes est peu agressif (plus de 1 048 576 entrées mais moins de 3 145 728) et quand il l’est (au-dessus de 3 145 728 entrées). En supposant que le ramasse-miettes est capable d’atteindre son but, il est assez simple de simuler son algorithme:

Graphique montrant l'influence des divers paramètres sur le ramasse-miettes

La première courbe montre ce qu’il se passe si environ 2000 nouvelles routes sont ajoutées par seconde avec rhash_entries égal à 262 144 et net.ipv4.route.gc_elasticity égal à 8. Quand le seuil net.ipv4.route.gc_threshold est atteint, le ramasse-miettes n’a quasiment aucun effet. Cependant, quand le nombre d’entrées atteint 2 097 152, il retire 262 144 entrées. À partir de là, le nombre d’entrées oscille aux environs de deux millions.

Sur la seconde courbe, rhash_entries est désormais égal à 1 048 576 mais net.ipv4.route.gc_elasticity vaut 2. Ainsi, le seuil à partir duquel le ramasse-miettes devient agressif est le même. Cependant, il enlève cette fois-ci quatre fois plus d’entrées à chaque fois. Ce qui est gagné d’un côté (faire tourner moins souvent le ramasse-miettes) est perdu de l’autre (plus d’entrées à supprimer à chaque fois). Pour améliorer l’efficacité du cache, il semble préférable de garder net.ipv4.route.gc_elasticity à 8 ou éventuellement 4 pour raccourcir la taille des chaînes (mais le gain semble essentiellement théorique dans ce cas).

Les autres courbes montrent ce qui se produit quand il y a un soudain afflux de routes ou au contraire lorsqu’il y a une pause.

Réalisation de l’objectif

Maintenant que nous comprenons bien comment rhash_entries, net.ipv4.route.gc_elasticity et net.ipv4.route.gc_threshold interagissent, regardons net.ipv4.route.gc_timeout. Une fois que le ramasse-miettes s’est fixé un objectif, il doit choisir les entrées à retirer.

Pour se faire, il parcourt la table de hachage depuis sa dernière position et retire les entrées sélectionnées jusqu’à atteindre son objectif. Si l’entrée n’est plus à jour (par exemple, si l’interface réseau associée a une configuration différente), elle est retirée. Dans le cas contraire, le système va considérer à la fois son âge et sa position dans la chaîne. Si l’entrée est en première position, elle n’est conservée que si son âge est inférieur à net.ipv4.route.gc_timeout. Si elle est en seconde position, elle n’est conservée que si son âge est inférieur à la moitié de net.ipv4.route.gc_timeout. En troisième position, le seuil est le quart de net.ipv4.route.gc_timeout et ainsi de suite. Cela permet au ramasse-miettes de favoriser les chaînes courtes.

Si après un parcours complet de la table, le ramasse-miettes n’a pas pu atteindre son objectif, il effectue un nouveau parcours en agissant comme si net.ipv4.route.gc_timeout avait été divisé par deux. Il fera autant de passes que nécessaire jusqu’à atteindre l’objectif ou jusqu’à l’impossibilité de supprimer toute entrée supplémentaire (ou encore s’il a passé trop de temps). Une fois que le ramasse-miettes se trouve dans ce mode agressif, il conserve ce comportement sur plusieurs cycles en l’atténuant à chaque passage.

Si net.ipv4.route.gc_timeout est très grand, le ramasse-miettes va avoir beaucoup de mal à trouver des entrées à retirer. Plusieurs passes seront nécessaires. Au contraire, si la valeur est trop petite, il va retirer très rapidement des entrées alors qu’il existe de meilleurs candidats plus tard dans la table.

Pour plus de détails sur le fonctionnement du cache des routes, le chapitre 33 de « Understanding Linux Network Internals » constitue une ressource incontournable. Il faut toutefois noter que le cache des routes multipath n’existe plus et que les nettoyages asynchrones (rt_periodic_timer) ont également été retirés.

MISE À JOUR : Comme indiqué précédemment, le paramètre net.ipv4.route.gc_interval a été réintroduit dans Linux 3.2. L’algorithme de nettoyage utilisé est différent de celui du ramasse-miette mais a de nombreuses similitudes. Il est exécuté toutes les net.ipv4.route.gc_interval secondes, y compris si le seuil défini par net.ipv4.route.gc_threshold n’est pas atteint. Il détermine un but proportionnel à net.ipv4.route.gc_interval et inversement proportionnel à net.ipv4.route.gc_timeout. Ce but ne peut dépasser rhash_entries. Si net.ipv4.route.gc_interval et net.ipv4.route.gc_timeout sont égaux, le but est exactement rhash_entries. Celui-ci indique le nombre d’entrées du cache qui seront examinées (et non le nombre d’entrées qui doivent être supprimées). Si une entrée n’est plus valide ou suffisamment ancienne (selon les mêmes critères que pour le ramasse-miette), elle est alors supprimée. Un autre aspect important de cet algorithme est qu’il détermine la taille maximale autorisée pour une chaîne. Initialement, cette valeur est de 20 mais à chaque exécution, l’algorithme la modifie comme étant la longueur moyenne des chaînes qu’il a pu observer augmenté de quatre fois la déviation standard avec un maximum égal à net.ipv4.route.gc_elasticity. Lors de l’insertion d’une nouvelle entrée dans le cache, une chaîne dont la longueur dépasse net.ipv4.route.gc_elasticity se verra retirer un élément (le moins « précieux »), si possible. Ensuite, si la chaîne est toujours plus longue que la valeur autorisée (soit plus longue que net.ipv4.route.gc_elasticity, soit trop longue par rapport aux autres chaînes6), toutes les entrées du cache correspondant à l’interface courante sont invalidées.

Conclusion

Lors de l’optimisation du cache des routes, rhash_entries, net.ipv4.route.gc_elasticity, net.ipv4.route.max_size et net.ipv4.route.gc_threshold sont liées et ne doivent donc pas être modifiées séparément. net.ipv4.route.gc_thresh doit être inférieur au produit de net.ipv4.route.gc_elasticity et de rhash_entries tandis que net.ipv4.route.max_size doit y être supérieur.

Linux expose un certain nombre de métriques liées au cache des routes. Les surveiller permet de vérifier l’efficacité du cache mais également de déceler des anomalies (ramasse-miettes trop fréquent, difficultés à retirer des routes, …).

Le système de cache évolue toujours et certains anciens comportements sont désormais caducs. La meilleure documentation est toujours le code étant donné que les documentations tendent à devenir obsolètes. Le cache des routes pour IPv6 est totalement différent et il n’est donc pas conseillé d’appliquer les conseils indiqués ici aveuglément.


  1. Le contenu de cet article est valide pour les noyaux 2.6.38, 2.6.39, 3.0 et 3.1. Il contient également les informations nécessaires pour comprendre le fonctionnement des noyaux 2.6.35, 2.6.36, 2.6.37 et 3.2. Pour les autres versions, aucune garantie n’est donnée quant à l’exactitude. 

  2. Linux fournit un sous-système indépendant du protocole appelé protocol-independent destination cache (DST). Toutefois, ce composant n’est là que pour découpler les autres sous-systèmes du cache et ne fournit pas tous les services nécessaires à l’implémentation d’un cache. 

  3. Les adresses martiennes sont des adresses qui ne peuvent pas être utilisées comme adresses sources, soit parce qu’elles sont réservées pour un usage spécifique (comme les adresses multicast), soit en raison de la mise en œuvre du reverse path filtering qui vérifie si un paquet reçu sur une interface aurait sa réponse vers la même interface, comme défini dans la RFC 3704. Cette fonctionnalité peut être activée dans Linux via le réglage rp_filter

  4. Pour plus de détails, les fichiers à examiner sont include/net/dst.h, include/net/route.h et net/ipv4/route.c

  5. En fait, la taille de la table de hachage est toujours une puissance de deux. La valeur de rhash_entries est alors arrondie à la prochaine puissance de deux. En interne, sa valeur est stockée dans rt_hash_mask + 1

  6. Cela permet au noyau de se protéger contre les attaques par collision. 

13 December, 2011 06:12PM par Vincent Bernat

28 November 2011

Vincent Bernat

SSL/TLS & Perfect Forward Secrecy

Une fois la clef privée d’un site HTTPS quelconque compromise, un attaquant est capable de monter une attaque par interception (MITM) afin de déchiffrer toutes les communications avec le site compromis. Si l’attaque est détectée, le certificat sera révoqué via une CRL ou un protocole tel que OCSP. Malheureusement, l’attaquant peut aussi avoir en sa position une copie des communications passées de clients avec le serveur. Il est alors capable de déchiffrer celles-ci et y trouver des informations sensibles.

La propriété de forward secrecy1 permet à une information chiffrée aujourd’hui de rester confidentielle en cas de compromission future de la clef privée d’un correspondant. C’est un mécanisme assez coûteux en calculs et de nombreux serveurs font donc l’impasse sur celui-ci. Google a récemment annoncé le support du forward secrecy pour tous ses sites accessibles en HTTPS. Adam Langley a rédigé un article plus détaillé sur ce qui a été réalisé pour améliorer l’efficacité d’un tel mécanisme : avec quelques collègues, il a écrit une implémentation plus efficace pour OpenSSL, basée sur la cryptographie sur les courbes elliptiques.

Sans forward secrecy

Pour comprendre ce que le forward secrecy tente de résoudre, regardons ce qui se passe lors d’une poignée de mains TLS en utilisant une suite de chiffrement telle que AES128-SHA. Durant celle-ci, le serveur va présenter son certificat au client et les deux parties vont s’accorder sur la construction d’un secret maître utilisé par la suite pour protéger la connexion.

Déroulement d'une poignée de mains TLS

Un premier secret de 48 octets est généré et chiffré par le client avec la clef publique du serveur. Il est envoyé durant la troisième étape de la poignée de mains, lors de l’envoi du message Client Key Exchange. Le secret maître est calculé à partir de celui-ci et des valeurs aléatoires qui ont été transmisses dans les messages Client Hello et Server Hello.

Ce procédé est sûr à condition que seul le serveur puisse déchiffrer le premier secret (à l’aide de sa clef privée) envoyé par le client. Supposons maintenant qu’un attaquant enregistre tous les échanges entre le serveur et ses nombreux clients pendant plusieurs mois. Deux ans plus tard, le serveur est décommissionné et jeté à la benne. L’attaquant en profite pour subtiliser le disque et y trouve la clef privée. Il est désormais capable de déchiffrer toutes les communications qu’il a pu intercepter. Cela lui permet de récupérer, par exemple, des mots de passe encore valides aujourd’hui.

Le problème principal est que la clef privée est à la fois utilisée pour l’authentification du serveur et pour le chiffrement du secret partagé. Alors que l’authentification n’est réellement importante que pendant le laps de temps où la communication entre les deux parties est établie, le chiffrement doit être capable de protéger un secret pendant plusieurs années.

Algorithme de Diffie-Hellman

Une solution consiste à n’utiliser la clef privée que pour l’authentification et négocier un secret partagé totalement indépendant de celle-ci. Il existe un protocole à cet effet : l’algorithme de Diffie-Hellman. Il s’agit d’une méthode d’échange de clefs ne nécessitant aucune connaissance préalable entre les deux parties. Voici comme cela fonctionne dans le cadre de TLS :

  1. Le serveur doit initialement disposer de (avec l’aide d’une commande comme openssl dhparam par exemple) :
  2. Le serveur choisit un nombre aléatoire ·a· et calcule ·g^a \mod p·. Après l’envoi du message Certificate, il envoie un message Server Key Exchange (inclu lors de l’étape 3 mais non représenté dans la poignée de mains décrite précédemment) contenant, en clair mais authentifié avec sa clef privée :
    • la valeur aléatoire issue du message Client Hello,
    • la valeur aléatoire issue du message Server Hello,
    • ·p·, ·g·,
    • ·g^a\mod p=A·.
  3. Le client vérifie la signature et choisit un nombre aléatoire ·b·. Il envoie alors ·g^b \mod p=B· dans un message Client Key Exchange. Il calcule ·A^b\mod p=g^{ab}\mod p· qui constitue le premier secret duquel est dérivé le secret maître.
  4. Le serveur reçoit ·B· et calcule ·B^a\mod p=g^{ab}\mod p· qui est identique au premier secret calculé par le client.

La clef privée n’a été utilisée qu’à des fins d’authentification. Un espion ne pourra connaître que ·p·, ·g·, ·g^a\mod p· et ·g^b\mod p·. Calculer ·g^{ab}\mod p· à partir de ces valeurs est connu sous le nom du problème du logarithme discret. Aucune solution efficace à ce problème n’a été découverte pour le moment.

Tel que décrit ci-dessus, l’échange de Diffie-Hellman utilise systématiquement de nouvelles valeurs pour ·a· et ·b·. On parle alors d’échange de Diffie-Hellman éphémère (Ephemeral Diffie-Hellman, EDH ou DHE). Des suites de chiffrement telles que DHE-RSA-AES128-SHA l’utilisent pour obtenir la propriété de perfect forward secrecy2.

Afin d’obtenir un bon niveau de sécurité, les paramètres utilisés doivent être de la même taille que la clef privée (la sécurité du logarithme discret est environ équivalente à celle fournie par la factorisation de deux grands nombres premiers). Les opérations d’exponentiation sur de tels grands nombres sont alors particulièrement longues et impactent la performance de la poignée de mains comme on peut le voir sur le benchmark ci-dessous :

Graphique de comparaison de la vitesse avec et sans Diffie-Hellman

Diffie-Hellman et les courbes elliptiques

L’échange de Diffie-Hellman peut également s’effectuer à l’aide de la cryptographie sur les courbes elliptiques, basée sur la structure des courbes elliptiques sur un corps fini. Pour comprendre comment tout cela fonctionne en détail, l’article de Wikipedia sur les courbes elliptiques est un bon point de départ. Les courbes elliptiques permettent d’obtenir un niveau de sécurité équivalent à RSA en utilisant des clefs plus petites. Par exemple, une courbe elliptique de 224 bits permet d’obtenir un niveau de sécurité similaire à une clef RSA de 2048 bits.

Un peu de théorie

L’échange de Diffie-Hellman décrit auparavant peut facilement être adapté pour utiliser les courbes elliptiques. Au lieu d’utiliser deux entiers ·p· et ·g·, on part d’une courbe elliptique, ·y^2=x^3+\alpha x+\beta·, d’un entier premier ·p· et d’un point de base ·G·. Tous ces paramètres sont publics. En fait, même s’ils peuvent être générés par le serveur, ils sont généralement choisis dans un catalogue.

L’utilisation des courbes elliptiques est normalisée comme une extension de TLS et décrite dans la RFC 4492. Contrairement à l’échange de Diffie-Hellman classique, le client et le serveur doivent se mettre d’accord sur les divers paramètres à utiliser. Cet accord se matérialise essentiellement dans les messages Client Hello et Server Hello. Bien qu’il soit possible d’utiliser une courbe elliptique arbitraire, les navigateurs se contentent d’indiquer le support de quelques courbes prédéfinies telles que NIST P-256, P-384 et P-521. L’échange de clefs est ensuite très similaire au cas classique :

  1. Le serveur choisit un entier aléatoire ·a· et calcule ·aG· qui sera envoyé en clair, mais signé avec la clef privée du serveur, dans un message Server Key Exchange.
  2. Le client vérifie la signature et choisit un nombre aléatoire ·b·. Il calcule et envoie ·bG· dans un message Client Key Exchange. Il calcule également ·b\cdot aG=abG· qui est le premier secret à partir duquel est calculé le secret maître.
  3. Le serveur reçoit ·bG· et calcule ·a\cdot bG=abG·. Il peut alors dériver le même secret maître que le client.

Un espion verra passer les valeurs ·aG· et ·bG·. Il n’existe aucun moyen connu de calculer efficacement ·abG· à partir de ces valeurs et des paramètres de la courbe.

Utiliser une suite de chiffrement telle que ECDHE-RSA-AES128-SHA (avec la courbe NIST P-256 par exemple) constitue déjà une amélioration notable des performances par rapport à la suite DHE-RSA-AES128-SHA grâce aux nombres plus petits mis en jeu.

Les navigateurs ne supportent qu’une poignée de courbes elliptiques et ces dernières ont été choisies entre autres pour leurs structures facilitant des implémentations efficaces. Le travail effectué par Bodo Möller, Emilia Käsper et Adam Langley consiste à fournir une implémentation optimisée pour les processeurs 64 bits des courbes NIST P-224, P-256 et P-521 pour OpenSSL. Pour obtenir plus de détails sur le sujet, vous pouvez lire la fin de l’introduction aux courbes elliptiques d’Adam Langley puis le court papier d’Emilia Käsper sur l’optimisation de l’implémentation de la courbe NIST P-224.

En pratique

Tout d’abord, le support des courbes elliptiques n’est pas présent dans tous les navigateurs. Les versions récentes de Firefox et de Chrome supportent les courbes NIST P-256, P-384 et P-521 mais en ce qui concerne Internet Explorer, il n’y a rien pour le moment. Il faut donc continuer à accepter des suites de chiffrement classiques.

Une version récente d’OpenSSL est nécessaire. Le support pour les suites ECDHE est apparu dans OpenSSL 1.0.0. Il est simple de vérifier leur présence avec openssl ciphers ECDH. Pour utiliser la version optimisée pour 64 bits, il faut se tourner vers la future version 1.0.1 en la configurant avec l’option enable-ec_nistp_64_gcc_128. Une version récente de GCC est alors également requise.

Ensuite, il faut choisir les suites de chiffrement appropriées. Si le forward secrecy est optionnel, vous pouvez partir sur ECDHE-RSA-AES128-SHA:AES128-SHA:RC4-SHA qui est compatible avec la plupart des navigateurs. Si le forward secrecy est obligatoire, il faudra partir sur quelque chose comme ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:EDH-DSS-DES-CBC3-SHA.

Également, il faut s’assurer que l’ordre des suites de chiffrement est respecté. Pour nginx, il s’agit de la directive ssl_prefer_server_ciphers on tandis que pour Apache, c’est SSLHonorCipherOrder on.

MISE À JOUR : Il est également nécessaire de vérifier que le support pour ECDHE est présent dans le serveur web que vous souhaitez utiliser. Pour nginx, le support a été ajouté dans la version 1.0.6 et dans la version 1.1.0. La courbe elliptique sélectionnée par défaut est NIST P-256 et il est possible d’en choisir une autre avec la directive ssl_ecdh_curve. Pour Apache, le support existe depuis la version 2.3.3 mais n’est pas présent dans la branche stable. Ajouter le support pour ECDHE n’est pas très difficile. À titre d’exemple, vous pouvez consulter comment j’ai ajouté son support dans stud. Le problème est similaire pour les suites basées sur DHE ; dans ce cas, il peut aussi être nécessaire de spécifier les paramètres DH à utiliser (générés avec openssl dhparam) à l’aide de la directive adéquate ou en les incluant après le certificat. Un article de Immerda Techblog fournit quelques informations supplémentaires sur ce point précis.

L’implémentation des tickets de session TLS peut être incompatible avec le forward secrecy selon leur implémentation. Quand la clef protégeant les tickets est générée aléatoirement au démarrage du serveur, la même clef peut être utilisée pendant des mois. Certaintes implémentations 3 optent pour une clef dérivée de la clef privée. Dans ce cas, le forward secrecy est rendu totalement inefficace. Il est alors préférable de désactiver tickets.

La commande openssl s_client -tls1 -cipher ECDH -connect 127.0.0.1:443 permet de vérifier que tout fonctionne comme attendu.

Quelques benchmarks

En utilisant l’outil de micro-benchmark utilisé lors de mon précédent article, il est possible de comparer l’efficacité de chacune des suites de chiffrement permettant d’obtenir le forward secrecy :

Graphique de comparaison avec/sans DHE/ECDHE

J’ai utilisé une pré-version d’OpenSSL 1.0.1 datant du 25 novembre 2011. La version optimisée d’ECDHE est celle obtenue en utilisant l’option enable-ec_nistp_64_gcc_128 en configurant OpenSSL.

Concentrons-nous sur la partie serveur. Activer la suite DHE-RSA-AES128-SHA grève les performances d’un facteur 3 tandis que l’utilisation de ECDHE-RSA-AES128-SHA n’implique qu’une pénalité de 27%. La version optimisée permet de réduire la pénalité à 15% par rapport à AES128-SHA. À noter qu’il convient de pondérer de telles pénalités en fonction du nombre de poignées de mains complètement effectuées par les clients. Ainsi, si ceux-ci utilisent trois fois sur quatre une poignée de main raccourcie (reprise d’une ancienne session SSL), il faut diviser par quatre l’impact sur les performances.

Le coût d’une suite utilisant ECDHE semble donc être plutôt raisonnable par rapport au gain de sécurité apporté. Il s’agit donc d’une option à considérer attentivement lors du choix des suites de chiffrement autorisées.


  1. Je ne connais pas la traduction généralement admise pour les termes forward secrecy et perfect forward secrecy. Wikipedia opte pour [confidentialité persistante][pfs] ce qui me semble assez horrible. J’opte donc pour le terme anglais. 

  2. La propriété de perfect forward secrecy est une version améliorée du forward secrecy pour laquelle chaque clef est indépendante l’une de l’autre et la compromission d’une clef ne peut être utilisée pour en compromettre une autre. 

  3. C’est le cas par exemple de l’implémentation que j’ai proposée pour stud afin de permettre le partage des tickets entre plusieurs serveurs

28 November, 2011 09:49PM par Vincent Bernat

23 November 2011

Carl Chenet

Brebis 0.4 : contrôle automatisé de vos sauvegardes

La version “Mobylette” 0.4 de Brebis a été publiée en début de semaine. Pour rappel Brebis est un logiciel libre (GPLv3) de contrôle automatisé de vos sauvegardes déjà présenté sur ce blog et développé dans le cadre du projet Brebis.

Il est par exemple capable de détecter une corruption d’archive sur différents formats. Il identifie également les modifications qui surviennent sur vos archives ou le contenu de vos archives et vous retournent un rapport détaillé des modifications identifiées, modifications pouvant avoir des causes diverses (problème matériel ou logiciel, erreur humaine, malveillance), pour être certain que vos sauvegardes sont exploitables le jour où vous en aurez besoin.

La principale nouveauté de cette version réside dans  la nouvelle option -g ou –gen-list qui permet de générer automatiquement une liste de tous les fichiers dans une archive, et pour chaque fichier tous ses paramètres (type, taille, uid/gid, mode, somme de hachage). Cette liste est ensuite exploitée par Brebis pour identifier précisément tout changement.

Un exemple vaut mieux qu’un long discours.

Installation à partir des sources

# wget http://brebisproject.org/attachments/download/5/brebis-0.4.tar.gz
# tar zxvf brebis-0.4.tar.gz && cd brebis-0.4
# python3.2 setup.py install --install-scripts=/usr/bin
# mkdir /etc/brebis

Prérequis au contrôle de l’archive

L’archive en question va être le fichier /backups/monthly-backup.tar.gz, nous allons commencer par établir une liste de tous les fichiers dans l’archive, avec tous leurs paramètres. Ceci se fait très simplement à l’aide de la commande suivante :

# brebis -g /backups/monthly-backup.tar.gz
# ls /backups/
monthly-backup.tar.gz monthly-backup.list

Tous les fichiers et répertoires dans votre archive et leurs paramètres ont été enregistrés dans le fichier .list. Libre à vous de l’épurer si vous souhaitez restreindre les contrôles ou même de l’écrire vous-même, son format étant très simple (Plus d’informations à ce sujet dans la documentation du projet Brebis)

Configurer Brebis

Nous sauvons maintenant le fichier monthly-backup.list dans /etc/brebis :

# mv /backups/monthly-backup.list /etc/brebis

Puis nous écrivons la configuration suivante pour notre archive dans le fichier  /etc/brebis/monthly-backup.conf :

[main]
name=monthly-backup
type=archive
path=/backups/monthly-backup.tar.gz
files_list=/etc/brebis/monthly-backup.list

Executer Brebis

Notre contrôle d’archive est maintenant en place. Pour l’effectuer, nous passons la commande suivante :

# brebis -c /etc/brebis/ -l /var/log/brebis.log

Tous les fichiers .conf dans /etc/brebis seront pris en compte. Le fichier /var/log/brebis.log est créé, vide si aucune différence n’est constatée entre l’état actuel de l’archive et l’état enregistré dans /etc/brebis/monthly-backup.list. La moindre différence rencontrée sera notifiée de manière explicite dans le journal de Brebis.

Si par exemple je modifie la somme de hachage d’un des fichiers présents dans /etc/brebis/monthly-backup.list, j’obtiens l’entrée suivante à la prochaine execution de Brebis dans le journal /var/log/brebis.log :

WARNING:root:1 file with unexpected hash while checking
/backups/monthly-backup.tar.gz:
WARNING:root:toto/titi hash is ce4f8cacd8fc702bdd03531b9447818b.
Should have been ce4f8cacd8fc702bdd03531b94478184.

Il ne vous reste qu’à insérer la commande précédente dans la crontab de votre système pour effectuer à intervalle régulier le contrôle de vos données. Vous pouvez aussi provoquer l’envoi d’un e-mail si le fichier brebis.log est non vide, ou toute forme d’alerte qui vous conviendra.

Le site officiel du projet : http://www.brebisproject.org
Liste de diffusion des utilisateurs : https://lists.sourceforge.net/lists/listinfo/brebis-users
Brebis sur Identi.ca : http://identi.ca/brebis and http://identi.ca/group/brebis



23 November, 2011 11:09PM par Carl Chenet

16 November 2011

Tanguy Ortolo

Faites des copies privées !

Logo copie privée

En France, chaque fois qu'on achète un support de stockage vierge — disque dur, disque optique, carte mémoire ou clef USB — on s'acquitte systématiquement d'un supplément, la redevance pour copie privée. Cette redevance sert à rémunérer les auteurs en contrepartie de l'autorisation faite au public d'effectuer des copies privées.

La loi

Cette autorisation est définie dans l'article L122-5 du code de la propriété intellectuelle :

Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire :

2° Les copies ou reproductions strictement réservées à l'usage privé du copiste et non destinées à une utilisation collective, à l'exception des copies des œuvres d'art destinées à être utilisées pour des fins identiques à celles pour lesquelles l'œuvre originale a été créée et des copies d'un logiciel autres que la copie de sauvegarde établie dans les conditions prévues au II de l'article L. 122-6-1 ainsi que des copies ou des reproductions d'une base de données électronique ;

Remarques

Le premier détail que l'on peut remarquer, c'est que cet article parle de copie à l'usage privé du copiste : le caractère privé ne porte pas sur le propriétaire de l'exemplaire copié mais sur le copiste lui-même.

Deuxième détail d'importance, l'article n'attache aucune importance à la source de la copie. Stricto sensu, des copies issues de diffusions par ailleurs parfaitement illicites devraient pouvoir être couverte par ce droit à la copie privée. Je ne crois pas qu'il existe de jurisprudence précise à ce sujet, mais le plus prudent reste de se contenter de copier des diffusions licites.

Conséquences

À mon avis, le fait le plus marquant est que l'on paie systématiquement une redevance pour copie privée, qu'on le veuille ou non. La conclusion la plus importante, c'est que la moindre des choses est d'en profiter, d'en profiter au maximum, et de lutter contre tout ce qui pourrait venir restreindre son application, typiquement les verrous numériques.

À partir de là, il faut éviter à tout prix l'auto-censure qui consisterait à s'interdire volontairement d'effectuer des copies qu'on a non seulement le droit de faire, mais qu'on a surtout payées au moyen de cette redevance. La technologie nous a doté de machines à copier surpuissantes, donc profitons-en :

  • Vous avez aimé un livre emprunté à la bibliothèque ? Profitez-en pour le photocopier intégralement, et ignorez de l'avertissement selon lequel « le photocopillage tue le livre », qui n'a pas force de loi et la présente de façon fallacieuse.
  • Rippez vos CD et DVD : de simples fichiers sont souvent plus pratiques que des disques, surtout pour des flims de Disney bourrés de publicités censées être impossibles à sauter.
  • Lorsque vous invitez des amis à voir un flim, proposez-leur de repartir avec une copie privée.
  • Lorsque vous écoutez la radio, enregistrez et conservez les morceaux qui vous plaisent : c'est un excellent moyen de se procurer de la musique à peu de frais, surtout lorsqu'il s'agit de radios Web à méta-données.
  • Lorsque vous utilisez des services de diffusion à la demande comme Spotify ou de radio personnalisée comme Last.fm, enregistrez également !

Pour enregistrer les radios Web, vous pouvez utiliser l'excellent Streamripper ; pour générer une radio Web à partir de Last.fm en vue de l'enregistrer, vous pouvez utiliser LastFMProxy.

16 November, 2011 08:59PM par Tanguy

29 October 2011

Charles Plessy

Tout dans Git

Ce samedi a bien commencé avec la lecture sur Planet Debian de deux articles stimulants, l'un à propos de GitTogether2011, et l'autre à propos de l'utilisation de Git dans la société Baserock.

J'aime beaucoup l'idée d'utiliser Git au-delà de la gestion du code source de programmes. D'ailleurs cet article est lui-même diffusé via un réseau de référentiels Git. Pour les paquets Debian dont je m'occupe et qui sont gérés avec Git, je stocke depuis quelques temps les journaux de construction dans une branche appelée meta. Depuis que sbuild filtre certaines parties variables de ses journaux, la commande git diff --word-diff=color permet de surveiller efficacement la différence entre les constructions de deux versions d'un paquet. Par exemple, pour la mise à jour de bedtools que j'ai faite ce matin, pas grand chose à signaler si ce n'est que -D_FORTIFY_SOURCE=2 n'est plus passé et que par conséquent les alertes -Wunused-result ont disparu.

Un des autres avantages de stocker les journaux de construction est simplement de rendre disponible une information qui ne l'était pas auparavant : buildd.debian.org contient les journaux pour toutes les plates-formes sauf celle utilisée par le responsable du paquet, souvent l'une des plus utilisées, car ses téléchargements combinent paquets source et binaires. Ce problème sera réglé lorsque notre archive reconstruira automatiquement les paquet binaires téléchargé avec les paquets source, mais pas complètement car il est toujours possible de télécharger un paquet binaire isolément.

Dans la branche meta de mes dépôts Git, les journaux sont gardés côte-à-côte pour toutes les plates-formes. Je ne suis pas sûr que que ça soit la disposition idéale, mais pour le moment je suis réticent à l'idée d'avoir une multitude de branches parallèles. Je commence à automatiser la gestion des journaux, par exemple avec le petit script suivant pour les récupérer depuis buildd.debian.org.

#!/bin/bash

BASEURL=buildd.debian.org:/srv/buildd.debian.org/db
PACKAGE=$1
shift

for version in "$*"

do
  scp $BASEURL/${PACKAGE:0:1}/$PACKAGE/${version}/* .
  for arch in $(ls *bz2 | sed 's/_.*//g')
    do bzcat ${arch}*bz2 > ${arch}.log
    rm ${arch}_*_log.bz2;
  done
done

exit

29 October, 2011 08:59AM

28 October 2011

Stéphane Blondon

Publications Debian sur une ligne du temps

La distribution Debian est connue pour donner des codes de personnage de Toy Story aux différentes distributions publiées. Il y a aussi un numéro mais c’est tout de même moins amusant. L’idée a depuis été reprise par Ubuntu et Fedora, mais en utilisant d’autres thèmes. Android fait de même avec son API. Même Apple a réutilisé le concept. Il est cependant probable que l’idée avait déjà été utilisée avant Debian…

Vers l’infini et au-delà ! (mais quand ce sera prêt)

Voici le résultat si l’on met chaque version sur une frise chronologique. Le segment jaune de la ligne de temps correspond à une période où il n’y avait pas encore de noms de code. Les noms de code pouvaient difficilement apparaître avant la sortie de Toy Story… Ils ont été ajoutés à partir de la première version officielle : la 1.1, surnommée Buzz.

On voit bien le changement de rythme entre les premières années et la suite, la loooooooooooongue période de développement de Sarge et la régularité des publications suivantes.

La prochaine version aura pour nom de code Wheezy, un personnage qui apparaît dans le deuxième épisode de Toy Story. Après la période sans nom de code, puis celle des noms du premier film, peut-être est-ce le début d’une troisième période pour les noms de code de la distribution ?

Sources

L’image a été réalisée avec The Gimp.

Les personnages sont principalement tirés de fonds d’écran distribués par Pixar, retouchés pour l’occasion (trouvables, par exemple sur pixar.wikia.com).

La ligne de temps est un bricolage fait avec Calc (LibreOffice) et la touche Impr écran.

Correctifs

Merci à TomThePhysicist, la honte et l’opprobre sont sur moi : je me suis trompé dans la frise comme l’atteste les commentaires. La version dans l’article prend en compte ces remarques. Je ferai pénitence en écrivant plus de 65.000 de lignes de code en {insérez ici votre langage détesté}, sans indentation et sans parenthèse.
Merci aussi à Elessar, je ne retrouvais plus le terme exact en français.


28 October, 2011 10:12AM par ascendances

13 October 2011

Carl Chenet

Debian Squeeze 6.0.3 et Lenny 5.0.9

Conformément à sa politique de mise à jour régulière tout au long du cycle de vie de la version stable, le projet Debian a publié samedi 8 octobre la troisième mise à jour de l’actuelle version stable “Squeeze”.

L’ajout de firmwares, la correction de plusieurs problèmes et de nombreux correctifs de sécurité sont à l’ordre du jour. Le détail est accessible sur la page dédiée à cette publication.

Les utilisateurs de la vieille Debian stable “Lenny” seront heureux d’apprendre que le projet Debian ne les oublie pas a publié le 1er octobre une nouvelle mise à jour numérotée 5.0.9. Quelques corrections de problèmes mais surtout de nombreux correctifs de sécurité à appliquer sur le prédecesseur de Squeeze.

Il est toutefois à noter que le support de la vieille stable est assez court, en raison de l’effort qu’il demande à la communauté Debian . Les utilisateurs de Lenny devront envisager une migration vers Squeeze à brève échéance s’ils souhaitent conserver une Debian mise à jour régulièrement.


13 October, 2011 11:14PM par Carl Chenet

09 August 2011

Aurélien Jarno

Debian s390x port (aka 31 bits is not enough)

During Debconf 11, I got access to a fast s390 machine, and I have started to work on a Debian s390x port, the 64-bit version of the s390 port. One of my goal was to help the SPARC64 port, as some of the issues are the same: both are 64-bit big-endian, don’t support unaligned access and behave differently between -fpic and -fPIC.

Why such a port?

When talking about 64-bit ports, we usually hear: “4GB is enough, handling 64-bit takes more memory”. This really sounds like “640K ought to be enough for anybody”. The s390 port is actually 31-bit from the address point of view (one bit is reserved for address space extension from 24 to 31 bits), so each process is limited to 2GB only. Nowadays applications which need more than 2GB are not that uncommon, especially on mainframes. Actually the 2GB limit already causes some problem in Debian: in some cases it’s not possible to build haskell applications or even C applications using GCC. On the other hand, we already require a 64-bit kernel on the s390 port (only the userland is 32-bit), and applications are handling more and more 64-bit or greater values (files offset, time counters, uid, etc.).

What is the status?

Bootstrapping the architecture was not really easy (as for any other new architectures), due to a huge amount of dependencies and build-dependencies loops, as explained by Wookey during Debconf11. Now that this part is mostly done, an autobuilder has been started and currently more than 65% of the packages are built. The s390x port is hosted on debian-ports.org. Unfortunately it is not yet deboostrapable, though that should happen in the next few days (only a few packages are missing).

The main issues are currently packages which fail to build from source due to linker, gcc-4.6 and curl changes, or due to the libjpeg and multiarch transitions, and thus are not directly related to s390x. If your package is in this case, it would be a good idea to fix it. Otherwise if it has a lot of reverse dependencies and the bug is opened for a while, just expect an NMU (as allowed by the 0-day NMU policy). Of course for a few packages s390x specific fixes are needed, some of them are already in the BTS.

How you can help?

The list of bugs blocking the s390x port is available through the s390x usertag, fixing these bugs (a lot of them are general FTBFS) would help a lot. Alternatively if you have access to an s390x machine you can take a look at the packages failing to build.

Update: Fixed the explanation about the 32th bit, thanks to Bastian Blank for the comment.

09 August, 2011 09:45PM par aurel32

31 July 2011

Roland Mas

Juillet 2011

Encore un mois d'aventures palpitantes que je n'attends que de vous narrer :

  • Les RMLL sans être orateur ni animateur de session, c'est bien aussi, on peut discuter tranquillement, assister à des trucs, tout ça.
  • Y'a même des séances d'improvisation musicale ouvertes à tous, et j'ai donc, pour la première fois, joué en public, pour accompagner à la batterie une mandoline, un violon électrique et une basse à cinq cordes. Wouhou.
  • Je vous ai pas dit ? FusionForge 5.1 est sorti. J'ai commencé à bosser sur les paquets pour Debian.
  • Après le secteur de la construction, j'ai ce mois-ci encouragé celui du bricolage. Peinture, parquet, électricité, réseau… c'est bientôt fini, mais déjà habitable. La preuve : j'écris ces quelques lignes en regardant le soleil se coucher sur le Larzac (en tout cas, la direction du Larzac).
  • Je tiens à remercier tous ceux qui m'ont donné un coup de main (voire plus), et à inviter les autres. Si vous savez de quoi je cause, venez donc prendre l'apéro un de ces jours pour inaugurer ça ; sinon, venez voir de quoi il s'agit (et ça n'empêche pas de prendre l'apéro).

La suite… une autre fois.

31 July, 2011 08:15PM

04 June 2011

Olivier Berger (pro)

Intervention au prochain séminaire IRILL : Bug tracking à grande échelle et interopérabilité des outils de développement dans l’écosystème FLOSS

Je suis intervenu au séminaire Logiciel Libre et Programmation de l’IRILL, le jeudi 09/06 à 15h45.

Titre de l’exposé : Bug tracking à grande échelle et interopérabilité des outils de développement dans l’écosystème FLOSS

Résumé :

L’écosystème du logiciel libre (FLOSS) est caractérisé par un développement extrèmement décentralisé, avec de multiples canaux de production et de distribution décorellés, et des processus d’assurance qualité qui doivent donc prendre en compte ces aspects.

Dans cet ensemble de processus d’Assurance Qualité, nous détailerons le volet du suivi des rapports de bugs, en présentant quelques pistes de standardisation et des mécanismes d’interopérabilité (comme le standard OSLC).

Il reste encore de nombreux efforts d’implémentation à conduire, mais avec un espoir concret à lé clé de permettre la réalisation de nouveaux outils, basés sur l’approche Linked Data, permettant un suivi des rapports de bugs à grande échelle.

Toutes les informations concernant ce séminaire sont sur : http://www.irill.org/activities/seminaries

Update : les transparents de l’intervention sont en ligne (PDF 4 Mo).

04 June, 2011 07:08AM par Olivier Berger

09 February 2011

Olivier Berger (pro)

Conférence “Debian: 17 ans de logiciel libre, “do-ocracy” et démocratie.” le 24/02 à 15h à Évry

À l’invitation des associations AIESEC et MiNET, Stefano Zacchiroli, leader du projet Debian interviendra sur le campus de Télecom & Management SudParis à Évry, le jeudi 24/02/2011, à 15h, pour faire une conférence intitulée “Debian: 17 ans de logiciel libre, “do-ocracy” et démocratie.“.

Attention: en raison des contraintes de sécurité pour l’accès au site, une inscription préalable est demandée (envoi des noms et prénoms à minet@it-sudparis.eu).

Update : Transparents (PDF en anglais – 1.4 Mo)

Update:
<iframe frameborder="0" height="300" src="http://player.vimeo.com/video/20475812?title=0&amp;byline=0&amp;portrait=0" width="400"></iframe>

Debian: 17 ans de logiciel libre, “do-ocracy” et démocratie from Olivier Berger on Vimeo.


Affiche de la conférence

09 February, 2011 02:29PM par Olivier Berger

05 October 2010

Vincent Carmona

Adapter une bibliothèque C pour ruby (4)

Ce quatrième billet présente comment obtenir une documentation grâce à rdoc : il suffit de commenter les fichiers sources.

Documentation

Commenter

Pour documenter les méthodes de la classe TagLib::File, il suffit de commenter les différentes fonctions les implémentant.

La méthode title permet d'obtenir le titre d'une piste. On l'indique en commentaire juste avant la fonction file_get_title.
 
/*Get track title*/ 
VALUE 
file_get_title(VALUE self) 

Par défaut, les paramètres d'une méthode sont nommés p1, p2, .... Pour la méthode title=, on utilise l'instruction call-seq: pour afficher le texte title=title (au lieu de title=(p1)).
 
/* 
call-seq: title=title 
 
Set track title to title 
 
title: a string 
*/ 
VALUE 
file_set_title(VALUE self, VALUE title) 

La méthode initialize ne devrait jamais être appelée directement depuis un code ruby. On utilise l'instruction :nodoc: pour indiquer que la méthode ne doit pas apparaitre dans la documentation.
 
/*:nodoc:*/ 
VALUE 
file_init(VALUE self, VALUE path) 

J'indique que je ne désire pas commenter le module TagLib en plaçant un commentaire vide afin d'éviter que rdoc utilise un commentaire non-désiré.
 
/* */ 
  mTagLib=rb_define_module("TagLib"); 

Dans le fichier lib/raglib2.rb, j'ajoute la directive :main: afin que la page initiale de la documentation pointe sur la classe TagLib::File.
 
#:main: TagLib::File 
module TagLib 

Bizarrement, cette directive ne semble pas fonctionner si elle est placée dans le fichier taglib2.c.

Produire la documentation

 
rdoc --exclude extconf.rb 

Le fichier doc/index.html est créé.
aperçu de la documentation

Conclusion

Rendez-vous pour le dernier billet où j'introduirai quelques concepts que je n'ai pas utilisé dans le module TagLib.

Billet original publié sur les blogs de developpez.com...

05 October, 2010 10:43PM par vinc-mai

04 October 2010

Vincent Carmona

Adapter une bibliothèque C pour ruby (3)

Cet article fait suite au premier et deuxième billets dans lesquels nous avons vu comment créer un objet de la classe TagLib::File. Cet objet utilise les fonctions de la bibliothèque taglib, écrite en C, afin d'accéder aux tags de fichiers audio. Dans ce billet, nous verrons comment obtenir les valeurs des tags et comment modifier un tag.

» Lire la suite!

Billet original publié sur les blogs de developpez.com...

04 October, 2010 02:47PM par vinc-mai

18 August 2010

Grégory Colpart

Mon compte-rendu de DebConf 10 à New York

DebConf est la conférence annuelle des développeurs du projet Debian. Cela permet aux développeurs et contributeurs de Debian d’assister à des présentations techniques, sociales et politiques, mais aussi de se rencontrer et travailler ensemble. Cette année, la 11e DebConf s’est tenue à New York du 1er au 7 août. Evolix a sponsorisé cette conférence et j’étais donc sur place, voici mon résumé de cette semaine.

Premiers pas plutôt festifs le vendredi soir avec le SysAdmin Day dans un bar à Manhattan puis direction Brooklyn pour une Debian Party organisée par NYC Resistor, un collectif local de hackers en électronique à l’origine de MakerBot, une imprimante 3D Open Source. Samedi c’est l’arrivée à Columbia University, l’université américaine qui accueille la DebConf 10. Une bonne partie des participants est hébergée sur le campus universitaire, dans des chambres avec accès haut-débit et une cafétéria à volonté.

C’est donc le dimanche 1er août que commence la DebConf avec des présentations orientées grand public pour cette première journée appelée le “Debian Day”. Un grand message de bienvenue pour un public plus large en ce premier jour, puis enchaînement des présentations. J’ai tout d’abord assisté à une présentation sur le sysadmin par François Marier qui a livré toutes ses astuces et une série de packages intéressants (unattended-upgrades, safe-rm, etckeeper, fcheck, fwknop, etc.). J’ai d’ailleurs pu échanger par la suite avec lui d’autres informations, sachant qu’il travaille dans une boîte similaire à Evolix : Catalyst située en Nouvelle-Zélande ! J’ai ensuite assisté à la présentation de Stefano Zacchiroli, l’actuel leader Debian, qui encourage fortement les développeurs à réaliser des NMU (Non Maintainer Upload), c’est-à-dire la publication d’un package par un autre développeur que celui responsable officiellement. J’ai ensuite poursuivi avec la présentation du Google Summer of Code 2010 de Debian : une présentation générale puis plusieurs “étudiants” expliquent leur projet en cours : Debian-Installer pour OpenMoko, GUI pour aptitude en QT, etc. D’autres présentations ont ensuite suivies, mais j’ai plutôt été découvrir le “hacklab” : une pièce pourvue de multiprises, switches et points d’accès afin de permettre à plusieurs dizaines de personnes de travailler/hacker. Le “Debian Day” a été un franc succès avec plusieurs centaines de participants. En soirée, c’est l’heure du coup d’envoi “officiel” de la DebConf par Gabriella Coleman, l’une des organisatrices de la DebConf 10, qui présente avec humour la semaine à venir, avec un petit retour en images sur les éditions précédentes.

Deuxième jour, on a le droit à un Bits from DPL en direct de la part de Stefano Zacchiroli (au lieu du traditionnel mail). Ensuite, il y a de nombreuses présentations. Durant DebConf, il y en aura plus de 100 au total, réparties dans 3 salles : Davis (avec vidéo), 414 Schapiro et Interschool (avec vidéo). Le choix est parfois difficile ! Pour ma part, j’ai assisté en fin de matinée à la présentation de la structure américaine à but non lucractif SPI : c’est elle qui gère les droits de la marque Debian, mais pas seulement : OpenOffice.org, Drupal, PostgreSQL, Alfresco, etc. de nombreux projets de logiciels libres utilisent cette structure légale ! Dans l’après-midi, c’est Mark Shuttleworth, fondateur d’Ubuntu et CEO de Canonical, qui nous présente le travail réalisé pour améliorer l’interface graphique des netbooks, notamment par l’intermédiaire du projet Ayatana. Puis, Jorge Castro, responsable chez Canonical des relations avec les développeurs extérieurs, parle de la collaboration entre Ubuntu et Debian. On notera que toute une équipe de Canonical est venue à DebConf et que les relations avec Debian semblent devenir plus sereines. Le soir venu, c’est l’heure de Wine&Cheese, un évènement devenu incontournable pour une DebConf : imaginez des centaines de fromages et alcools venus du monde entier (Italie, Allemagne, France, Mexique, Brésil, USA, Taïwan, Pologne, Kazhastan, Espagne, Nouvelle-Zélande, Corse, Vénézuela, Hollande, Marseille, Irlande, Angleterre, Japon, etc. etc.) et plus d’une centaine de développeurs Debian lâchés dessus pendant des heures… le résultat est… indescriptible ! Pour ma part, j’avais apporté un rosé Bandol, des bières La Cagole, du Banon et de la Tapenade… qui n’ont pas fait long feu.

Troisième jour et l’on débute par un talk d’Eben Moglen, avocat de la FSF, qui rappelle les dangers du Cloud Computing comme la gestion des données privées. Sa réponse : “Chacun devrait avoir un serveur chez soi” et il évoque la FreedomBox, une boi-boîte que tout le monde aurait chez soi pour faire office de petit serveur avec les fonctionnalités classiques (web, messagerie, VoIP). Cette idée rencontre un certain enthousiasme et plusieurs réfléchissent déjà à la réalisation de cette idée ! J’ai ensuite suivi une succession de présentations sur le thème de l’entreprise. On a parlé du déploiement de machines avec le logiciel Puppet, de l’installation automatisée de Debian avec FAI et Gosa, notamment présentée par Mickaël Bank, un développeur allemand très actif dans Debian. On a également des témoignages très intéressants : Russ Allbery, administrateur système et réseau à l’université de Standford en Californie, explique quels sont les arguments en faveur de Debian en entreprise et en profite pour présenter la gestion de Debian à Standford ; Faidon Liambotis, sysadmin chez GRNET (un opérateur public grec), présente leur utilisation de Debian mais aussi leurs choix en terme de déploiement (Puppet/FAI) ou de virtualisation (KVM/Ganeti). Pour terminer la journée, Guido Trotter de chez Google, nous parle des fonctionnalités réseau intéressantes sous Linux (VLAN, tunnels, routing, etc.). Une journée riche en idées et en informations ! En soirée, nous avons visualisé le film Open Source Sita Sings the Blues et Nina Paley nous a expliqué son choix d’une licence libre pour son film.

Le quatrième jour, c’est le Day Trip. Il s’agit classiquement d’une journée consacrée à des activités touristiques extérieures. Nous avons été visiter l’église Trinity Church à Manhattan où le drame du 11 septembre 2001 a mis un superbe orgue hors d’usage, remplacé temporairement par un orgue électronique “Powered by Linux”… qui a finalement été conservé en raison de sa qualité. Keith Packard, l’un des gourous de X.org employé chez Intel, a joué quelques minutes sur cet orgue. Ensuite, direction la plage de Coney Island. Puis un match de baseball où Stefano Zacchiroli lancera la première balle du match.

Cinquième jour, on reprend avec un BoF (un BoF=Birds of a Feather est une discussion informelle de groupe) sur la virtualisation où plusieurs personnes témoignent de leurs expériences et connaissances sur le sujet. Pas mal d’informations intéressantes, notamment sur le couple Ganeti/KVM pas mal mis en avant par Iustin Pop, l’un des développeurs de Ganeti employé chez Google. J’y apprends notamment que KVM gère une notion de mémoire partagée et ainsi démarrer une 2e machine virtuelle avec un même OS ne consommerait pas de mémoire supplémentaire sur le système hôte ! Suite des présentations, notamment une portant sur DebConf 12 qui pourrait peut-être se dérouler au Brésil. Et fin de la matinée avec François Marier qui présente le projet Libravatar permettant d’offrir une alternative à Gravatar, l’outil centralisé de gestion des avatars. Ses idées sont de se baser sur les DNS pour répartir les avatars pour chaque noms de domaine. Il a déjà commencé à développer une application en Django pour gérer cela. Suite de la journée avec un BoF sur Lintian (outil de vérification de la conformité des packages Debian) géré par Russ Allbery. Puis j’ai assisté à une présentation de Guido Günther qui a expliqué comment gérer son packaging avec Git et notamment git-buildpackage (très intéressant pour moi car je gère déjà mes packages Debian comme ça). Ensuite, petite pause sportive, car une dizaine de développeurs Debian a été participé à un cross de 5 kms dans le Bronx, avec des résultats honorables !

Sixième jour, on débute par Bits from Release Team qui déclare en direct que Squeeze, la prochaine version stable, est désormais freezée ! Un scoop à DebConf ! C’est ensuite Stefano Zacchiroli qui nous présente son travail en cours sur une amélioration de la gestion des dépendances, non seulement pour Debian mais aussi pour les autres distributions : plus de détails sur le site du projet Mancoosi. C’est ensuite la traditionnelle photo de groupe. En début d’après-midi, Margarita Manterola dresse un constat très lucide de l’état de Debian avec son talk Making Debian Rule, again. Puis en fin d’après-midi, c’est un BoF très apprécié mené par Joey Hess sur CUT (Constantly Usable Testing) qui explore les possibilités d’avoir une distribution Testing utilisable en permanence ! Le soir venu, c’est un BoF sur l’utilisation d’OpenPGP et la classique Keysigning Party qui a regroupé plusieurs dizaines de participants.

Septième et dernier jour, encore de nombreuses présentations. J’ai notamment assisté à celle de Philippe Kern, membre de la Release Team, qui a parlé du management de la version stable et de volatile. On notera par exemple qu’on peut désormais corriger des bugs en priorité “Important” dans les points de Release. La suite ce sont des fameux Lightnings Talks, une dizaine de présentations très courtes : une qui suggère d’arrêter complètement d’utiliser les mots de passe, une autre sur le logiciel runit, une autre sur les éclairs (lightnings !) ou encore l’historique en photos des Wine&Cheese Party ! Fun et instructif. Puis c’est l’heure de la conférence de clôture, où l’on remet des prix à ceux qui ont corrigé le plus de bugs mais surtout tous les volontaires sont vivement remerciés et j’en profite pour adresser une nouvelle fois mes remerciements à :
- L’équipe qui a organisé cette DebConf 10 : un travail impressionnant pour un résultat professionnel et communautaire à la fois : on frôle la perfection !
- L’équipe vidéo qui a fait un travail génial et vous pouvez ainsi retrouver l’ensemble des talks en vidéo,
- Les centaines de personnes sympas et passionnées qui contribuent à faire de Debian une distribution de grande qualité… et qui sait évoluer, la preuve avec les sujets abordés lors de cette DebConf !

Petite conclusion de cette semaine intensive, comme vous avez pu le lire : j’ai pu acquérir de nombreuses informations et faire le plein de nouvelles idées, mais aussi avoir des contacts réels avec d’autres développeurs et comprendre encore mieux le fonctionnement “social” de Debian. C’est donc très positif et cela va me permettre d’améliorer mon travail quotidien au sein d’Evolix, mais aussi réfléchir à d’autres projets et me motiver pour contribuer davantage à Debian. Debian rules !

18 August, 2010 11:52AM par Gregory Colpart

24 January 2010

Grégory Colpart

Autres exemples de migration Etch->Lenny [1]

La fin du support officiel de Debian Etch approchant, il est grand temps de migrer vers Lenny pour les machines pas encore à jour. Après un premier exemple de migration Debian Etch->Lenny, je poursuis la série avec des informations tirées de plusieurs migrations récentes sur des serveurs en production.

Je ne rappellerais pas toutes les précautions nécessaires (tests préalables, sauvegardes, désactivations des services, etc.) ni la classique question  sur  “quand faut-il migrer ?”, vous trouverez tout cela dans mes exemples précédents. Je rappelle simplement l’idée de base : prendre les précieuses Release Notes, mettre à jour le fichier sources.list, puis exécuter les commandes aptitude update && aptitude upgradex, puis mettre-à-jour les services les plus critiques via aptitude install <PACKAGE>, et enfin aptitude dist-upgrade && aptitude dist-upgrade (répéter dist-upgrade est souvent nécessaire).

Passons désormais aux différentes remarques sur ces migrations :

- PostgreSQL : on passe de la version 8.1 à 8.3. Notez qu’il s’agit de paquets différents, il est donc possible de garder la version 8.1 en Etch, et d’installer en parallèle la version 8.3, afin de faciliter encore plus la migration. Pour migrer les données, on réalisera un dump avec pg_dumpall qui sera réinjecté dans la nouvelle base. On pourra ensuite adapter le port dans postgresql.conf pour passer la version 8.3 en production.

- phpPgAdmin : avec PostgreSQL 8.3, on ne peut plus se connecter à la table template1 : c’est le comportement par défaut de phpPgAdmin, qu’on devra donc modifier en mettant postgres à la place (pour la variable $conf['servers'][0]['defaultdb'] dans le fichier config.inc.php)

- Apache : la configuration de l’alias /icons/ est déplacé dans le fichier mods-available/alias.conf, il peut donc faire doublon avec la déclaration dans apache2.conf, ce qui sera signalé via le warning suivant : [warn] The Alias directive in /etc/apache2/apache2.conf at line 240 will probably never match because it overlaps an earlier Alias. Commenter les directives dans le fichier apache2.conf résoudra ce petit soucis.

- OpenLDAP : on passe d’une version 2.3 à 2.4, mais le plus marquant pour la migration est que cela force le processus à tourner avec un utilisateur/groupe dédié. Pour diverses raisons (dist-upgrade interrompu par exemple), on pourra rencontrer des soucis plus ou moins alarmants. Ainsi, j’ai pu rencontrer cette erreur :
bdb(dc=example,dc=com): PANIC: fatal region error detected; run recovery
bdb_db_open: database “dc=example,dc=com” cannot be opened, err -30978. Restore from backup!
backend_startup_one: bi_db_open failed! (-30978)
slap_startup failed
On veillera donc sur l’utilisateur/groupe propriétaire des fichiers dans le répertoire /var/lib/ldap et, au besoin, on ajustera : chown -R openldap:openldap /var/lib/ldap/
Mon conseil : mettre-à-jour le paquet slapd de façon spécifique avant le dist-upgrade

- Postfix : on passe de 2.3 à 2.5. On notera simplement la valeur par défaut de $smtp_line_length_limit characters qui passe à 990, ce qui coupe les lignes trop longues pour se conformer au standard SMTP. Si cela posait problème, on pourrait revenir à l’ancien comportement en positionnant smtp_line_length_limit=0

- SpamAssassin : l’utilisant en stockant la configuration des utilisateurs dans un annuaire LDAP, le daemon spamd s’est mis à râler : cannot use –ldap-config without -u
Le problème sera résolu en ajoutant l’option -u nobody, ce qui fera tourner spamd en tant que nobody (ce qui n’est pas une mauvaise chose, au contraire).

- Amavis : apparemment, lors de la détection d’un virus, le code retourné n’est plus 2.7.1 mais 2.7.0 : 2.7.0 Ok, discarded, id=13735-07 – VIRUS: Eicar-Test-Signature
Rien de bien grave, mais cela a nécessité d’adapter un plugin Nagios pour qu’il attende le bon code de retour.

- Courier-imapd-ssl : après une mise-à-jour gardant mon fichier /etc/courier/imapd-ssl actuel, j’obtenai des erreurs avec certains clients IMAP :
couriertls: accept: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
En regardant de plus près, certaines directives changent dans ce fichier de configuration, et il est donc conseillé de repartir du fichier proposé par Lenny, et d’y apporter ses modifications (souvent, cela se limite à préciser le certificat).

- Horde : si vous utilisez une base de données pour stocker les paramètres ou autres, la paquet php-db (déjà en Recommends: en Etch) est d’autant plus nécessaire, sous peine d’obtenir l’erreur : PHP Fatal error:  _init() [<a href='function.require'>function.require</a>]: Failed opening required ‘DB.php’ (include_path=’/usr/share/horde3/lib:.:/usr/share/php:/usr/share/pear’) in /usr/share/horde3/lib/Horde/DataTree/sql.php on line 1877

- Sympa : on attaque là le cauchemard de mes migrations. À chaque fois, tellement de soucis majeurs et mineurs, que j’ai l’impression d’être le seul à utiliser ce paquet. Voici en vrac tous les soucis rencontrés : les accents dans les descriptions ont sautés (une sorte de double encodage) et cela a nécessité des corrections manuelles, la table logs_table doit être créée à la main (j’utilise Sympa avec PostgreSQL), et enfin une typo surprenante un “GROUP BY” à la place d’un “ORDER BY” (j’ai ouvert le bug #566252 à ce sujet).

- Asterisk : on passe de la version 1.2 à la version 1.4. Lors de la migration, j’ai constaté un bug étrange, le fichier modules.conf qui charge les modules additionnels a disparu. Du coup, sans lui, Asterisk ne charge pas les modules nécessaires (SIP, etc.). Il a donc fallu le restaurer.

- udev : le meilleur ami des sysadmins (ou pas). Si les migrations douloureuses Sarge->Etch sont loin derrière nous, il reste néanmoins quelques blagues. La dernière en date a été un renommage des interfaces réseau : eth0->eth1 et eth1->eth2. Classique mais étonnant, ce genre d’humour est sensé être dépassé grâce aux “persistent rules” qui nomment les interfaces en fonction de l’adresse MAC. À rester vigilant sur ce point avant le redémarrage donc.

Voilà pour les remarques. Vous noterez que je n’ai pas abordé le noyau Linux. C’est parce que pour la majorité de nos serveurs, ils sont gérés de façons spécifiques (au lieu d’utiliser les noyaux officiels Debian). Ainsi, ils restent dans leur version actuelle (2.6.31 à cette heure) pendant la migration. Bien sûr, cela n’empêche pas d’effectuer un redémarrage de la machine suite à la mise-à-jour : cela permet de s’assurer que tout est bien en place et le sera toujours après un éventuel redémarrage d’urgence.

Rendez-vous pour de prochaines migrations !

24 January, 2010 06:05PM par Gregory Colpart

18 May 2008

Olivier Berger (perso)

Déclaration d'impôts sous Debian testing : difficultés mais contournement trouvé

Dotclear

Unknown column 'PM.link_type' in 'where clause' (1054)

Something went wrong while loading template file for your blog.

18 May, 2008 07:55PM par olberger

15 October 2007

Olivier Berger (perso)

Encore un logo debian détourné ?

Mais d'où vient ce logo

REMOVED

Plus d'infos ou (en noir et blanc).

Update 20071016 : bon, ben, les camarades de la CGT ont réagi promptement et retiré le logo "contrefait". Reste les camarades de coca-cola ;)

15 October, 2007 05:01PM par olberger

19 April 2006

Pierre Machard

Et si les écologistes s’étaient trompés au sujet du nucléaire?

Hier en lisant slashdot je suis tombé sur un billet qui mentionnait que Patrick Moore (un des fondateurs de Greenpeace), dans un éditorial du Washington Post, expliquait que l’énergie nucléaire était la seule source d’énergie qui pouvait couvrir nos besoins.

« Thirty years on, my views have changed, and the rest of the environmental movement needs to update its views, too, because nuclear energy may just be the energy source that can save our planet from another possible disaster: catastrophic climate change. »

Ce qui dans la langue de Molière pourrait donner quelque chose comme :
« En 30 ans, mes idées ont évolué, et le mouvement écologiste doit également évoluer dans ses considérations, car l’énergie nucléraire est peut être la source d’énergie qui peut préserver notre planète d’un autre risque probable : un boulversement climatique. »

La catastrophe de Tchernobyl a eu lieue il y a 20 ans, néanmoins, il convient de réfléchir sur nos besoins en énergie, développer les énergies non-fossiles, mais aussi de se rendre compte que nous n’avons pas d’alternative au nucléaire, sans quoi nous serions obligé d’éteindre tous nos ordinateurs.

19 April, 2006 09:01AM par migus

15 March 2006

Pierre Machard

Une belle explication des DRM

Hier soir dans l’hémicycle de l’Assemblée Nationale j’ai eu la chance d’entendre une magnifique définition de ce qu’est un DRM. M. Suguenot (UMP) a très didcatiquement détaillé comment fonctionne un DRM. Je vous copie/colle ici le verbatim du propos de M. Suguenot. La seule erreur à noter est l’utilisation du verbe crypter là où nous aurions dû trouver chiffrer :

« Lorsque vous achetez de la musique sur internet, les DRM sont déjà systématiquement utilisés. Dans le système de Microsoft adopté par la Fnac et Virgin, le serveur de votre fournisseur crypte le morceau de musique à l’aide d’une clef secrète, que vous ne recevrez naturellement pas. Vous devez alors utiliser un lecteur compatible, Windows Media Player par exemple. Ce lecteur, détectant que le fichier est crypté, protégé par un DRM, prend contact avec le serveur pour lui demander la clé secrète nécessaire à la lecture. Avant de la lui envoyer, le serveur lui demande le numéro de série de votre ordinateur puis met à jour votre fiche client en y inscrivant le numéro de série du morceau concerné suivi de celui de l’ordinateur sur lequel vous désirez l’écouter, avant de fabriquer un fichier qu’on appelle licence. Cette licence contient la clé secrète de décryptage, mais aussi une liste de règles précisant ce que vous êtes autorisé à faire avec le morceau en question. Le serveur envoie cette licence à votre lecteur qui la « cache » sur votre disque dur. Disposant alors du morceau de musique et de sa licence, il vérifie dans celle-ci que vous avez bien le droit de lire celui-là. Si tout est en règle, vous pouvez, enfin, écouter votre musique !

Comprenant mieux le fonctionnement des DRM, on imagine les règles qu’ils permettent d’imposer. Si vous transférez le morceau sur une autre machine, le lecteur, ne trouvant plus de licence, va à nouveau contacter le serveur pour en obtenir une. Votre fiche client sera mise à jour et le serveur « saura » que vous avez installé ce morceau une deuxième fois. Si vous dépassez le nombre maximal d’ordinateurs autorisés, cinq avec iTunes par exemple, le serveur refusera de vous accorder une nouvelle licence, vous devrez lui demander d’en retirer une à un ordinateur pour la transférer à un autre. La licence peut également imposer une limitation dans le temps de l’utilisation d’un fichier, un délai au-delà duquel le lecteur le détruira.  »

15 March, 2006 10:36AM par migus