Archive for août 2011

Les versions « longterm » de Linux

Embarqué, Linux | Publié par cpb
août 20 2011

Depuis quelques années il existe des versions spécifiques du noyau Linux dont la maintenance est planifiée pour une durée plus longue que les autres. Il s’agit des longterm kernels. La semaine passée Greg Kroah-Hartman qui assure une part importante de la maintenance des noyaux stables et longterm a proposé d’établir de nouvelles règles de fonctionnement pour ces noyaux. La discussion est encore active, mais quelques remarques peuvent déjà être faites.

Situation précédente

Le principe actuel de mise à jour des kernels remonte au mois d’août 2004. A cette époque, le noyau 2.6 était utilisé depuis près d’un an et la phase classique de stabilisation des premiers mois avait été suivie par une première série d’évolutions plus ou moins importantes. Aucune branche de développement spécifique n’avait été ouverte contrairement aux noyaux précédents (pour en savoir plus sur les noyaux antérieurs aux 2.6) et la décision avait été prise de continuer à apporter des nouveautés régulièrement sur la branche 2.6.

Le 14 août 2004, le noyau 2.6.8 venait à peine d’être publié par Linus Tovalds qu’un bug grave fût relevé dans le système de fichiers NFS. Il fallait publier très rapidement un correctif, mais la faible ampleur des modifications ne justifiait toutefois pas la publication d’un nouveau noyau 2.6.9. Linus décida alors de publier l’après-midi un noyau 2.6.8.1 corrigeant le défaut.

 

Version Publication
2.6.0 12/2003
2.6.1 01/2004
2.6.2 02/2004
2.6.3 02/2004
2.6.4 03/2004
2.6.5 04/2004
2.6.6 05/2004
2.6.7 06/2004
2.6.8 08/2004
2.6.8.1 08/2004
2.6.9 10/2004
2.6.10 12/2004

 

Ce fut à partir de mars 2005, avec la sortie du noyau 2.6.11, que le choix de la numérotation sur 4 nombres s’établit définitivement. Un noyau dit stable serait publié régulièrement (à peu près tous les trimestres) avec une numérotation sur trois nombres (par ex. 2.6.12) puis un mainteneur serait désigné pour prendre le relai et regrouper les correctifs sous forme de versions à 4 nombres (2.6.12.4) publiées par le mainteneur du noyau stable. Une fois un nouveau noyau stable publié (ex. 2.6.13) le support sur le noyau précédent serait abandonné.

Cette méthode permettait de disposer d’un kernel flambant neuf (dit stable) tous les deux à trois mois, comportant de nouvelles fonctionnalités et les drivers pour les matériels les plus récents. En outre l’effort consacré à la maintenance et la correction des bugs pouvait se concentrer sur la dernière version stable, sans s’éparpiller sur les versions plus anciennes.

 

Version Publication Dernier correctif Date
2.6.11 03/2005 2.6.11.12 06/2005
2.6.12 06/2005 2.6.12.6 08/2005
2.6.13 08/2005 2.6.13.5 12/2005
2.6.14 10/2005 2.6.14.7 06/2006
2.6.15 01/2006 2.6.15.7 03/2006

 

Cette méthode toutefois n’allait pas sans poser de problèmes. En effet, entre deux versions stables du noyau (à trois nombres) prenaient places de nombreuses modifications internes. Des éléments étaient ajoutés bien entendu (drivers, systèmes de fichiers, protocoles…) mais certains sous-systèmes étaient parfois très profondément modifiés. Par exemple le support des architectures x86/PAE dans le noyau 2.6.10 (permettant d’adresser plus de 4 Go de mémoire) impliqua une modification importante du sous-système Memory Management. En conséquence l’API interne du noyau – celle que l’on utilise pas exemple pour écrire des drivers – se trouve sensiblement modifiée entre deux versions stables. L’API externe – celle offerte par les appels-système – reste bien sûr stable pour ne pas casser la compatibilité avec les bibliothèques et applications de l’espace utilisateur.

Ainsi un driver écrit en dehors du noyau officiel doit être mis à jour (ou du moins vérifié) à chaque nouvelle version stable. Le fait de ne pas offrir de support pour un noyau stable précédent posait des problèmes aux distributions qui intègrent des drivers provenant d’autres sources que le noyau officiel. Pour bénéficier des correctifs (sécurité, performance etc.) il était nécessaire de changer regulièrement de noyau pour basculer sur la nouvelle version stable. En contrepartie les drivers supplémentaires obtenus ou développés indépendamment du noyau standard ne fonctionnaient plus et nécessitaient une mise à jour régulière.

Si les distributions les plus importantes pouvaient à la rigueur se permettre cet effort de suivi et support du kernel, cela n’était pas possible pour les plus petites d’entre-elles.

A l’occasion du noyau 2.6.16, Greg Kroah-Hartman (qui travaillait pour SUSE) décida de prendre en maintenance ce noyau sur une période suffisamment longue pour avoir une pérennité acceptable pour les entreprises ne souhaitant pas mettre à jour le noyau de leur parc informatique tous les trimestres. Il réalisa un long travail de maintenance sur ce noyau jusqu’en  2008 avec un 62ème correctif !

 

Version Publication Dernier correctif Date
2.6.16 03/2006 2.6.16.62 08/2008
2.6.17 06/2006 2.6.17.14 06/2006
2.6.18 09/2006 2.6.18.8 02/2007
2.6.19 11/2006 2.6.19.7 03/2007
2.6.20 02/2007 2.6.20.21 10/2007
2.6.21 07/2007 2.6.21.7 08/2007
2.6.22 07/2007 2.6.22.19 02/2008
2.6.23 10/2007 2.6.23.17 02/2008
2.6.24 01/2008 2.6.24.7 05/2008
2.6.25 04/2008 2.6.25.20 11/2008
2.6.26 07/2008 2.6.26.8 11/2008

 

Courant 2008 le noyau 2.6.16, encore utilisé par de nombreuses distributions commençait à sembler ancien. De nombreuses fonctionnalités importantes (système tickless, nouvel ordonnanceur, gestion améliorée du cache mémoire, etc.) étaient apparues depuis. Quelques versions du noyau avaient été maintenues un peu plus longtemps que les autres (2.6.20, 2.6.22, 2.6.25) mais aucune n’avaient la longévité du 2.6.16.

Il fallu une nouvelle impulsion de Greg Kroah-Hartman pour choisir et figer une version avec maintenance étendue. Le noyau 2.6.27 fut choisi, et sa maintenance entamée par Greg est aujourd’hui (2.6.27.59) assurée par Willy Tarreau.

 

Version Publication Dernier correctif Date
2.6.27 03/2006 2.6.27.59 04/2011
2.6.28 12/2008 2.6.28.10 05/2009
2.6.29 03/2009 2.6.29.6 07/2009
2.6.30 06/2009 2.6.30.10 12/2009
2.6.31 09/2009 2.6.31.14 07/2010

 

La nécessité de disposer de versions pérènes du kernel Linux  se faisant sentir de plus en plus – notamment avec la croissance du marché de Linux embarqué – un premier noyau (2.6.32) fut marqué officiellement  longterm et maintenu par Greg Kroah-Hartman. Puis un second kernel (2.6.33) et la méthode faisant des émules, d’autres mainteneurs se proposèrent pour deux autres versions (Paul Gortmaker pour le 2.6.34 et Andi Kleen pour le 2.6.35).

 

Version Publication Dernier correctif Date
2.6.32 12/2009 2.6.32.45 08/2011
2.6.33 02/2010 2.6.33.18 08/2011
2.6.34 05/2010 2.6.34.10 06/2011
2.6.35 08/2010 2.6.35.14 08/2011
2.6.36 10/2010 2.6.36.4 02/2011
2.6.37 01/2011 2.6.37.6 03/2011
2.6.38 03/2011 2.6.38.8 06/2011
2.6.39 05/2011 2.6.39.4 08/2011

 

Situation actuelle et avenir

Avec le passage à la version 3 du kernel, Linus souhaite se débarrasser de la numérotation à quatre nombres, pour revenir à un schéma plus simple.

  • Le noyau stable actuel est le 3.0
  • Le niveau de correctif sur le noyau stable est 3.0.3
  • Le prochain noyau stable sera le 3.1, une version release candidate 3.1-rc2 est disponible dès aujourd’hui, on peut donc s’attendre à une publication du 3.1 en septembre ou octobre.

 

Une fois un kernel stable publié, il n’y aura plus de maintenance assurée sur le noyau stable précédent (avec probablement quelques semaines de recouvrement quand même).

Greg propose à partir de maintenant de choisir tous les ans un noyau pour un support longterm qui sera assuré pendant deux ans. A chaque instant, il y aura donc deux kernels longterm et (au moins) un kernel stable disponible sur http://www.kernel.org/.

Ce système me semble assez avantageux pour tous. Les hackers et passionnés désireux de tester les dernières fonctionnalités du kernel pourront télécharger et compiler régulièrement le dernier noyau stable. Les distributions pourront proposer le dernier noyau longterm (pour bénéficier des nouveautés) ou le précédent (pour les plus conservateurs). Enfin, les administrateurs de parcs informatiques pourront programmer la mise à niveau biennale du kernel de leurs machines.

Certaines entreprises trouveront la durée de maintenance trop courte. En effet, il existe de nombreux domaines où l’on aime « geler » une version des logiciels pour toute la durée de vie du produit dans lequel on l’intègre. J’entends souvent mes interlocuteurs dans le domaine des systèmes embarqués dire :

« Notre fournisseur [d'OS temps-réel propriétaire payant] nous garantit une maintenance pendant 15 ans, comment peut-on avoir la même chose avec Linux ? »

La réponse est simple :

« En payant quelqu’un pour l’assurer au-delà de deux ans ! »

Si un bug dans un noyau longterm, non découvert au-delà des deux ans est soudainement révélé par un utilisateur d’un système embarqué pour lequel aucune évolution vers un noyau plus récent n’est envisageable (probabilité quand même assez réduite), de nombreuses sociétés spécialisées sur Linux (notamment Logilin pour qui je travaille) seront à même de proposer des prestations d’ingénierie pour corriger le défaut.

 

PS: Vacances et déplacements professionnels aidant, je n’ai pas posté beaucoup d’articles ce mois-ci. Je viens de terminer la rédaction de celui-ci dans une chambre d’hôtel sur Madison Avenue – NY  ;-)   J’espère reprendre un rythme un peu plus régulier à partir de la semaine prochaine.

 

 

Crash système et récupération

Intérêts divers, Linux | Publié par cpb
août 05 2011

Kernel panic – not syncing: No init found.

J’indiquais dans un article précédent (à la fin de « Construire son système personnel pour Pandaboard – 1« )  que ce message était pour moi une excellente nouvelle, car il indiquait que le noyau avait correctement démarré, identifié les périphériques et trouvé son système de fichiers initial. Une excellente nouvelle lorsqu’on construit un système embarqué. Pas lorsque le message se présente sur mon poste de travail principal ! Voici donc une mésaventure qui m’est arrivé cette semaine.

Circonstances

Après une longue journée de développement logiciel, de rédaction d’un chapitre de mon prochain livre, et de configuration d’un système live Gnu/Linux dont je vous reparlerai prochainement, j’allais lancer la sauvegarde quotidienne de mon répertoire personnel sur le serveur lorsqu’un popup attire mon regard, indiquant que des mises à jour étaient disponibles pour quelques dizaines de packages de la Fedora 15 que j’utilise. Je valide alors naturellement le téléchargement et la mise à jour de ces packages, tout en fermant mes dernières applications. Le système de mise à jour m’a demandé la confirmation pour l’installation d’une nouvelle version du kernel Linux, ce que j’ai accepté.

Puis, j’ai quitté l’écran des yeux pendant quelques instants, pour préparer la synchronisation de mon répertoire personnel sur un ordinateur portable. J’ignore quelle était exactement la tâche de mise à jour en cours lorsque j’ai aperçu l’écran de mon poste de travail s’éteindre. Ce dernier allait apparemment redémarrer tout seul, ce qui m’a légèrement surpris, mais la mise à jour du noyau nécessite évidemment un reboot du système.

 Sauf que ce reboot s’est mal terminé ! Le message classique du « kernel panic » indiquant qu’il ne pouvait charger le programme init est apparu. J’ai donc essayé successivement un reboot à froid – ordinateur totalement éteint puis rallumé – puis un redémarrage sur les versions précédentes du noyau (dans le menu de choix de Grub), rien n’y fit le système restait incapable de trouver son programme init. J’ai tenté de redémarrer en mode mono-utilisateur en ajoutant (avec le menu Grub) sur la ligne de commande du kernel l’option « single« .

Le fichier /sbin/init (qui correspond sur les Fedora 15 à un lien symbolique vers /bin/systemd) aurait pu être endommagé, aussi ai-je tenté sans grande conviction d’ajouter l’option init=/bin/sh sur la ligne de démarrage du kernel. En vain.

Diagnostic

Arrivé à ce point, une touche d’angoisse commençait à poindre. Ce poste de travail ne comporte que deux partitions : la première contient le système Linux Fedora proprement dit et la seconde mon répertoire de travail personnel. Je ne pouvais m’empêcher d’imaginer la sauvegarde pénible du contenu de cette partition à l’aide d’un outil de récupération plus ou moins convivial, suivi d’une réinstallation du système.

En analysant la situation, on peut quand même déduire quelques éléments :

  • Le bootloader fonctionne correctement et charge le noyau, ce n’est donc pas un problème de disque ou de partition.
  • Le noyau démarre a priori normalement et ne panique qu’au moment de lancer le processus init. Le comportement est le même pour les deux versions précécentes du kernel, ce n’est donc pas lié au noyau Linux lui-même.
  • Le processus /sbin/init ne démarre pas, non plus que /bin/sh. Il y a très peu de chances que ces deux exécutables aient été endommagés simultanément. Dans le doute je pourrais toujours essayer ultérieurement avec d’autres commandes comme /bin/ls, etc.

 

Mes soupçons se portèrent alors sur les bibliothèques. Il suffit que la bibliothèque C par exemple soit endommagée pour qu’aucun exécutable ne fonctionnent hormis ceux dont l’édition des liens a été réalisée de manière statique, mais il n’y en a pratiquement plus dans les distributions classiques actuelles. Pour vérifier cela, il faut déjà accéder à la partition système incriminée.

J’ai démarré sur un CD-Rom Fedora 15 live que j’avais gravé il y a quelques temps pour mettre mon système à jour. Je conseille vivement de toujours disposer d’un CD live relativement récent pour ce genre de situation où la tension nerveuse aidant on n’a aucune envie de devoir télécharger et graver une nouvelle image dans l’urgence.

Une fois le système live en fonctionnement, j’ai monté manuellement les deux partitions de mon disque dur sur deux répertoires temporaires. J’ai examiné rapidement le contenu des répertoires /bin/sbin, /etc, et /lib avec la commande « ls -lrt » qui présente le contenu des répertoires classé par ordre chronologique. Les derniers fichiers listés sont les plus récemment modifiés. L’erreur est apparue rapidement :

 

# cd /mnt/sda1/lib
# ls -lrt
[...]
-rwxr-xr-x.  1 root root     0  3  juin 16:52 libgcc_s-4.6.0-20110603.so.1
lrwxrwxrwx.  1 root root    28  4  août 05:25 libgcc_s.so.1 -> libgcc_s-4.6.0-20110603.so.1
#  ls -l libgcc*
-rwxr-xr-x.  1 root root 115328 30 mai  20:48 libgcc_s-4.6.0-20110530.so.1
-rwxr-xr-x.  1 root root      0  3 juin 16:52 libgcc_s-4.6.0-20110603.so.1
lrwxrwxrwx.  1 root root     28  4 août 05:25 libgcc_s.so.1 -> libgcc_s-4.6.0-20110603.so.1
#

Visiblement la mise à jour de la bibiothèque libgcc ayant échoué, le fichier visé par le lien symbolique est vide.  Ceci explique que le démarrage des exécutables soit impossible.

Récupération

On peut déjà corriger partiellement le problème en redirigeant le lien symbolique vers la version précédente.

# ln -sf libgcc_s-4.6.0-20110530.so.1 libgcc_s.so.1

Puis, pour vérifier le fonctionnement, je tentai un déplacement chroot vers ma partition système.

# chroot /mnt/sda1
#

Ceci fonctionna et les utilitaires classique (ls, df, rpm) marchèrent correctement.

Toutefois, le problème étant survenu lors d’une mise à jour du système, la base de données des packages devait probablement être en mauvais état. J’ai dû exécuter successivement (de mémoire, je n’ai pas pu faire de capture d’écran).

# yum check

qui m’indiqua qu’il restait une transaction de mise à jour non terminée. Je la complétai donc avec

# yum-complete-transaction

toutefois, des erreurs persistaient et je dus effectuer les opérations suivantes (chacune m’indiquant la suivante à lancer)

# package-cleanup --problems
# package-cleanup --dupes
# rpm -Va --nofiles --nodigest

Enfin, certains conflits persistant entre packages de même nom et de numéros de version différents, je dus terminer le nettoyage avec une série de :

# yum erase nom-du-package

Après retrait du CD live et redémarrage, tout fonctionna à nouveau comme avant. Ouf !

Conclusion

Cette petite mésaventure, heureusement sans conséquences autres qu’un peu de temps perdu, m’a permis de tirer quelques remarques que je présenterai sous forme de conseils :

  • Ne jamais paniquer, ne jamais se précipiter et surtout ne jamais tenter de réinstaller quoique ce soit avant d’avoir tout essayé. Il est extrèmement rare qu’un incident logiciel (je ne parle pas de la mort physique d’un disque) bloque irrémédiablement un système Linux. Tant qu’il n’y a pas de fumée ou d’odeur bizarre, il y a un bon espoir de pouvoir remettre tout le système en marche comme précédemment.
  • Disposer d’un CD-Rom bootable live de préférence de la même distribution (même version majeure) que votre poste de travail. Il n’est pas très agréable de devoir courir après un CD vierge et un poste libre pour télécharger et graver la version de sauvetage alors que votre poste de travail est apparemment moribond.
  • Éviter les mises à jour du système en étant connecté en mode graphique avec plusieurs applications en cours d’utilisation. Et éviter avant-tout de faire une mise à jour du système si les données utilisateur qu’il contient n’ont pas été entièrement sauvegardées. C’est une règle simple, mais rarement respectée d’autant que bon nombre d’environnements de travail nous présentent une fenêtre « 50 mises à jour disponibles » alors que nous venons de commencer notre travail depuis quelques dizaines de minutes…

En respectant ces conseils, et avec un peu de patience et de réflexion, on doit pouvoir redémarrer un système Linux quelque soit le plantage survenu.