Kernel panic not syncing VFS : une erreur classique sur Raspberry-Pi

Chez Openest, nous utilisons quotidiennement des Raspberry-Pi pour créer les prototypes et produits de nos clients. Nous travaillons toujours pour les rendre plus fiables et leur permettre de fonctionner pendant des années. C’est pourquoi notre curiosité a été piquée lorsque nous avons lu plusieurs fois que « Le Raspberry-Pi a des problèmes avec sa carte MicroSD ». En fait, c’est souvent une erreur perçue comme aléatoire : Kernel panic not syncing VFS qui est la cause de cette réputation des Raspberry-Pi. En réalité, elle est provoquée par une mauvaise configuration du système de fichiers.

Erreur courante sur un Raspberry-Pi : Kernel panic not syncing VFS
On trouve beaucoup d’exemples de cette erreur.

Vous pourriez rencontrer un problème similaire sur n’importe quel système embarqué ou PC.

Not syncing VFS n’est pas causée par le Raspberry-Pi

Vous avez déployé un Raspberry-Pi, peut-être y avez-vous ajouté une cape et vous l’avez installée sur le terrain en autonomie. Quelques mois plus tard, le téléphone sonne : le système ne démarre plus et affiche une erreur à l’écran. Parfois aussi, les données sont inaccessibles. S’il y a un écran, il affiche des messages tels que :

Dans le premier cas (Unable to mount) le montage de la partition a échoué. Dans le second cas, le montage a réussi, probablement avec quelques erreurs, mais le programme d’init n’est pas accessible et la séquence de démarrage ne peut continuer. C’est un peu le BSOD (Blue Screen of Death) du Raspberry-Pi et des systèmes sous Linux embarqué. C’est un problème courant et on trouve des tas d’exemples sur le web.

Que signifie « VFS not syncing » :

Pendant son démarrage Linux a besoin d’accéder à un rootfs : une partition qui contient l’arborescence de base d’un système. Elle ressemble à ça :

Un exemple de root filesystem
La racine d’un rootfs sous Linux : une arboresence normalisée

Linux monte cette partition en utilisant le pilote du système de fichier correspondant. Tous ces pilotes ont une interface, une abstraction, nommée VFS (Virtual File System). Si l’opération de montage du rootfs échoue c’est parce que le pilote de système de fichier rencontre un problème et fait remonter cette information au VFS. Linux affiche ensuite cette erreur, mais le problème se situe bien à un niveau inférieur : le système de fichiers.

Souvent ces erreurs d’accès à une partition sont identifiées comme un problème causé par la MicroSD car le détail de la Kernel panic mentionne des erreurs de lecture depuis une partition la partition rootfs. Elle est est souvent corrigé en remplaçant la carte ou en réinstallant le système en entier sur la carte. Malheureusement, ce ne sera que temporaire et le problème réapparaitra après quelques temps.

Votre MicroSD fonctionne toujours, c’est le système de fichiers qui est corrompu

En général si vous réutilisez cette carte Micro SD vous verrez qu’elle fonctionne encore bien. Mais alors, que c’est-il passé ?

Linux utilise un système de fichiers pour lire et écrire sur des supports de stockages. Par défaut avec Raspberry-Pi OS (Raspian) le système de fichier est ext4. Vous pourriez également rencontrer BTRFS, ext3 ou ext2. Ces systèmes de fichiers permettent de gérer efficacement des mémoires de quelques Go à plusieurs To. Ils sont utilisables tant sur des disque durs que sur des SSD, eMMC ou cartes Micro SD. Par contre, ils sont à proscrire sur des mémoires flash de type NAND ou NOR.

Ils ont en commun d’avoir une structure de données pour organiser la lecture et l’écriture des fichiers sur le disque. Cette structure de données est là pour garantir les performances et la fiabilité des fichiers écrits. Dans le cas d’ext4, c’est un arbre composé d’inodes qui pointent vers des fichiers ou d’autres inodes :

Inodes structure filesystem
L’arboressance interne d’ext3. source : https://en.wikipedia.org/wiki/Inode

Qu’est-ce qui cause la corruption d’un système de fichier et provoque l’erreur « Kernel Panic Not syncing VFS » sur un Raspberry-Pi ?

La cause la plus fréquente de corruption d’un système de fichier est l’extinction impromptue. Des données sont en cours d’écriture et subitement le système est coupé :

Les données dans la mémoire ne sont pas toutes accessibles, car l’arbre d’Inodes (pour ext2, 3, 4) est dans un état incohérent et les données sont incomplètes. La partition n’est plus utilisable telle quelle.
Il arrive également que le système soit coupé pendant une mise à jour. Dans ce cas, non seulement le système de fichier est dans un état incohérent, mais en plus c’est tout le reste du rootfs et donc des dépendances entre librairies qui sont potentiellement incompatibles entre elles. L’erreur obtenue sera bien plus difficile à prévoir.

Correction temporairement « Not syncing VFS » : réparer le système de fichiers

Sur les systèmes à base de Linux, on trouve des outils permettant de réparer un système de fichiers. Insérez la carte MicroSD sur un PC sous Linux et utilisez fsck (filesystem check). Par exemple pour la carte MicroSD d’un Raspberry-Pi, la commande ressemblera à ça :

fsck.ext4 -y /dev/sda2

Il vous faudra peut-être remplacer « .ext4 » par le système de fichier utilisé sur la partition « rootfs ». De la même façon /dev/sda2 correspond à cette partition. Parfois, elle apparaitra sous la forme /dev/mmcblk0p2.
Alternativement, vous pouvez utiliser GParted, un utilitaire graphique, sélectionner la partition problématique et utiliser la fonction « check » :

check partition fsck gparted
Utiliser fsck avec GParted pour corriger une partition corrompue sur un Raspberry-Pi et réparer Kernel Panic Not syncing VFS.

N’hésitez pas à demander de l’aide dans la section de commentaires de cet article :).

Pistes et solutions à long terme

Les erreurs causées par une extinction impromptue sont difficiles à éviter pour des systèmes connectés qui fonctionnent dans un environnement que vous ne contrôlez pas.

Corriger une partition c’est bien, mais maitriser le risque de corruption c’est mieux. C’est particulièrement vrai, si les appareils que vous déployez sont nombreux car vous multipliez les risques de reproduire ces erreurs. Voici quelques pistes :

  1. Maitrisez l’extinction du système : vous pouvez utiliser une alimentation électrique sans coupure (UPS) pour limiter l’impact des coupures de courant et même en utiliser une qui va demander l’extinction propre du système d’exploitation et donc garantir la consistance des données sur les partitions.
  2. Monter le rootfs en lecture seule : Si vous n’avez pas besoin d’écrire de données sur la partition système, alors il est préférable de la monter en lecture seule comme ça elle ne sera jamais corrompue. Vous pouvez faire cela en modifiant le contenu du fichier /etc/fstab de votre système embarqué et en remplaçant l’option « rw » (read/write) par « ro » (read only) de la partition « / ». Certains services fonctionnant sur Raspberry-Pi OS risquent de rencontrer des problèmes pour écrire des fichiers temporaires et il vous faudra alors les configurer pour qu’ils utilisent « /tmp », c’est-à-dire la RAM du Raspberry-Pi.
  3. En pratique la solution précédente est complexe à mettre en oeuvre et à maintenir. Il y a de nombreux bénéfices à construire un système embarqué sur mesure. Vous pouvez utiliser Yocto ou Buildroot pour adapter précisément le système d’exploitation à vos besoins et aller beaucoup plus loin dans la fiabilisation de votre système. Vous maitriserez précisément les services qui sont lancés, leur configuration, la création de partitions, vous pourrez définir un moyen de les réparer automatiquement et vous pourrez mettre au point une méthode de mises à jour qui empêche tout risque d’erreur.

Parfois la carte Micro SD est en cause, mais ça ne provoquera pas « Kernel panic – not syncing VFS »

Si votre système fonctionne depuis depuis plusieurs années ou s’il écrit (vraiment) beaucoup de données alors la carte micro SD finira par s’user et elle passera dans en lecture seule. Dans cette situation, vous devrez effectivement la remplacer.

La mémoire flash n’est pas éternelle : le nombre d’écritures est limitée. Le Raspberry-Pi ne provoque pas particulièrement ce type de problèmes (pas plus que n’importe quel autre système sous Linux). C’est la responsabilité des développeurs de logiciels de limiter les écritures. Il est aussi recommandé d’optimiser la création et les options de montages de la carte MicroSD.

Conclusion

Si votre système Linux embarqué, en particulier un Raspberry-Pi, ne démarre plus nous serions très intéressés d’en connaître la cause : que ce soit à cause d’une système de fichiers corrompu ou pour une autre raison laissez nous un commentaire !

Questions/Réponses concernant l’erreur Kernel Panic Not syncing VFS sur les systèmes embarqués sous Linux

Comment corriger l’erreur Kernel panic – not syncing VFS ?

Le système de fichiers est corrompu sur la partition principale. En général vous pourrez la réparer. Insérez la carte MicroSD sur votre PC puis utilisez $ fsck.ext4 -y /dev/sdaX.
Ce n’est qu’une correction temporaire et il faut prévoir une solution de long terme.

Comment corriger définitivement Kernel panic – not syncing VFS ?

Idéalement il faut placer le rootfs en lecture seule (RO). A défaut, il faut vraiment minimiser les écritures sur la partition principale et désactiver les services qui ne sont pas indispensables. Pour un produit déployé à plus grande échelle ou plus critique on peut envisager un système sur mesure.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *