Avertissement: Cet article date de 2015, les commandes présentées sont peut-être obsolètes.

J'ai eu plusieurs fois un problème de carte SD corrompue suite à des redémarrages violents de Raspberry Pi. J'ai utilisé l'outil fsck pour régler les problèmes. Voici la procédure, pour que je ne doive pas refarfouiller à chaque fois.

La première chose à faire est de brancher la carte SD sur un ordinateur avec un système GNU/Linux. (C'est probablement faisable sous Windows mais je ne connais pas les outils...). Ensuite, on peut vérifier les logs :

$ sudo cat /media/simon/548da502-ebde-45c0-9ab2-de5e2431ee0b/var/log/dmesg
...
[   17.698285] FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
...

On voit que le volume n'arrive pas à se monter et ils proposent d'utiliser fsck. On regarde sous quel nom est la carte SD :

# avec la carte SD montée:
$ ls /dev/
...
sdb
sdb1
sdb2
...

# avec les partitions démontées:
$ ls /dev/
...
sdb
...

# en retirant la carte sd de l'ordinateur: 
$ ls /dev/
...

La carte est sous le nom "sdb" !

On rebranche ensuite le lecteur de carte SD et on démonte les partitions :

$ sudo umount /dev/sdb1
$ sudo umount /dev/sdb2

On lance fsck sur chaque partition. J'ai repris les arguments utilisés sur hardware-libre.fr.

$ sudo fsck /dev/sdb1 -p -c -v 
fsck de util-linux 2.25.2
CP0: Argument invalide
Trying to set fallback DOS codepage 437
fsck.fat 3.0.27 (2014-11-12)
0x25: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
 Automatically removing dirty bit.
Performing changes.
/dev/sdb1: 16 files, 2385/7161 clusters
$ sudo fsck /dev/sdb2 -p -c -v
fsck de util-linux 2.25.2
/dev/sdb2: Updating bad block inode.

       71298 i-noeuds utilisés (7.51%, sur 949664)
          54 fichiers non contigus (0.1%)
          93 répertoires non contigus (0.1%)
             nombre d'i-noeuds avec des blocs ind/dind/tind : 0/0/0
             Histogramme des profondeurs d'extents : 55895/13
      552209 blocs utilisés (14.35%, sur 3846912)
           0 bloc défectueux
           1 fichier de grande taille

       50842 fichiers normaux
        4879 répertoires
          56 fichiers de périphérique en mode caractère
          25 fichiers de périphérique en mode bloc
           2 fifos
         689 liens
       15480 liens symboliques (15294 liens symboliques rapides)
           5 sockets
------------
       71978 fichiers

Le tutoriel sur hardware-libre.fr conseille d'utiliser aussi les arguments -c -v -y. Je ne suis pas bien sûr de la différence entre la commande précédente. Il faudrait que je fouille un peu.

$ sudo fsck /dev/sdb2 -c -v -y 
fsck de util-linux 2.25.2
e2fsck 1.42.12 (29-Aug-2014)
Vérification des blocs défectueux (test en mode lecture seule) : complété                                             
/dev/sdb2: Updating bad block inode.
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe

/dev/sdb2: ***** LE SYSTÈME DE FICHIERS A ÉTÉ MODIFIÉ *****

       71298 i-noeuds utilisés (7.51%, sur 949664)
          54 fichiers non contigus (0.1%)
          93 répertoires non contigus (0.1%)
             nombre d'i-noeuds avec des blocs ind/dind/tind : 0/0/0
             Histogramme des profondeurs d'extents : 55895/13
      552209 blocs utilisés (14.35%, sur 3846912)
           0 bloc défectueux
           1 fichier de grande taille

       50842 fichiers normaux
        4879 répertoires
          56 fichiers de périphérique en mode caractère
          25 fichiers de périphérique en mode bloc
           2 fifos
         689 liens
       15480 liens symboliques (15294 liens symboliques rapides)
           5 sockets
------------
       71978 fichiers

Après avoir fait ça, je peux rebooter sur la carte SD ! :-)