Recherche de fichiers avec des erreurs BTRFS non corrigibles

17

J'ai une question concernant les erreurs irrécupérables sur un système de fichiers BTRFS. Plus précisément, j'ai récemment exécuté un nettoyage BTRFS après avoir rencontré un problème avec l'un de mes bâtons de RAM et il semble avoir découvert 4 erreurs impossibles à corriger. C'est la sortie:

scrub status for <UUID>
    scrub started at Thu Dec 25 15:19:22 2014 and was aborted after 89882 seconds
    total bytes scrubbed: 1.87TiB with 4 errors
    error details: csum=4
    corrected errors: 0, uncorrectable errors: 4, unverified errors: 0

Heureusement, tout est sauvegardé dans une sauvegarde tertiaire, je ne crains donc pas de perdre les fichiers (je suis bien conscient des problèmes liés au statut expérimental de BTRFS, j’ai plusieurs sauvegardes pour protéger mes données, et je suis déterminé à continuez à l'utiliser, donc non, s'il vous plaît, non: messages "Solution; n'utilisez pas BTRFS").

Je voudrais cependant savoir comment déterminer quels fichiers sont associés aux erreurs impossibles à corriger. Je veux les trouver, les supprimer et les remplacer par leurs copies sauvegardées.

Si quelqu'un a des informations sur la manière de procéder, j'aimerais beaucoup avoir de vos nouvelles.

Merci d'avance.

RedHack
la source

Réponses:

8

J'ai trouvé la méthode suivante utile ...

btrfs scrub le volume.

Comme vous l'avez montré ci-dessus, un nombre quelconque d'erreurs Csum vous sera présenté.
En utilisant votre exemple de détails d'erreur: csum = 4 . Utilisez ce numéro dans la directive tail de l'instruction suivante:

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'

Il est pratique de diriger ceci vers un fichier (par exemple > csums.txt)

J'ai essayé un certain nombre des méthodes de recherche d'inodes suggérées et elles ont toutes rencontré un succès limité, voire nul.

marque
la source
autant que je sache, vous utilisez tail pour limiter le nombre de lignes affichées et pour ignorer les doublons. Je recommanderais d'utiliser sort | uniqpour se débarrasser des doublons comme ceci:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi
3

Oui, le mappage depuis INODE ou numéro de bloc vers un nom de fichier peut être difficile. Si vous êtes vraiment intéressé, vous pouvez essayer quelque chose comme ceci et voir quels fichiers copier pour copier ... après tout, si le fichier est mauvais, une erreur devrait survenir lors de la copie. J'ai déjà utilisé ce type de technique.

 find /mount-point -type f -exec cp {} /dev/null \;

 where mount-point is the ROOT node/mount-point of the affected filesystem
mdpc
la source
Si vous le lancez maintenant, j'espère que ça va changer quelque chose. Merci pour vos conseils, je vous informerai du résultat.
RedHack
1
Désolé de dire que cela ne semble pas fonctionner = / il a trouvé le premier fichier à l'origine de l'erreur non corrigible, mais il envoie ensuite le message: "descripteur de fichier périmé" au terminal, sauf si je le résilie. Certes, il a trouvé le fichier, mais je ne vois pas comment le supprimer. Je vais devoir contacter la liste de diffusion BTRFS.
RedHack
Vous pouvez le déplacer vers un répertoire spécial, puis l'exclure d'une recherche ultérieure.
MDPC
1
Il ne bouge pas ou ne copie pas, il ne cesse de me dire que le descripteur de fichier est périmé. Je ne peux même pas ls.
RedHack
2

dmesgvous donnera des détails sur les fichiers impliqués dans les erreurs de somme de contrôle non corrigible. Les messages se présentent généralement comme suit: "BTRFS: erreur de somme de contrôle au niveau de la [...] logique sur dev [...], secteur [...], racine [...], inode [...], décalage [ ...], longueur [...], liens [...] (chemin: [...]) "; la dernière information est le chemin absolu du fichier corrompu.

arrrr
la source
1

Je suis venu ici aussi pour "l'erreur non corrigible" de BTRFS. Le grep ci-dessus n'a pas fonctionné pour moi; Je devais utiliser à la place:

$ dmesg | sed -n -r 's#.*BTRFS.*i/o error.*path: (.*)\)#\1#p' | sort -u
somepath/somefile.txt

Notez que le chemin est relatif au début du sous-volume - aucune indication du sous-volume dans lequel il se trouve. Heureusement, ce n'était pas un problème pour moi.

croisé
la source
C'est quoi somepath/somefile.txt? On dirait que vous le tapez en tant que commande séparée - ou s'agit-il du résultat de la commande que vous avez tapée? Si tout est supposé être une ligne de commande, veuillez ne pas séparer les lignes de commande à des fins d'affichage - mettez-les simplement dans la réponse sous la forme d'une longue ligne. Mais qu'est-ce que c'est? Fournissez-vous deux entrées à sort(un tuyau et un fichier)? Ou est somepath/somefile.txtcensé être un fichier de sortie? (Il n'est pas très utile de spécifier des fichiers de sortie, à moins qu'il s'agisse de fichiers intermédiaires que vous utilisez à nouveau. Les gens savent comment gérer les résultats, par exemple, par piping.)
Scott
Est-ce que cela répond à la question initiale? Je ne peux pas dire.
Twisty Impersonator
@ TwistyImpersonator Eh bien, c'est (IMO) clairement destiné à être une alternative à la réponse de Mark , et cela a obtenu huit voix (et est une extension de la réponse de arrrr ).
Scott
1
@Scott la deuxième ligne était un exemple de sortie de la commande.
Crusaderky