Encontrar archivos con errores no corregibles BTRFS


17

Tengo una pregunta sobre errores irrecuperables en un sistema de archivos BTRFS. Específicamente, he ejecutado un BTRFS Scrub recientemente después de experimentar un problema con una de mis memorias RAM y parece haber descubierto 4 errores no corregibles. Esta es la salida:

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

Afortunadamente, tengo todo respaldado en una copia de seguridad terciaria, por lo que no estoy particularmente preocupado por perder los archivos (soy muy consciente de los problemas asociados con el estado experimental de BTRFS, tengo varias copias de seguridad para mantener mis datos seguros y decididos a continúe usándolo así que por favor no: "Solución; no use publicaciones BTRFS").

Sin embargo, me gustaría saber cómo determinar qué archivos están asociados con los errores que no se pueden corregir. Quiero encontrarlos, eliminarlos y reemplazarlos con sus copias de seguridad.

Si alguien tiene información sobre cómo hacer esto, me encantaría saber de usted.

Gracias de antemano.

Respuestas:


8

He encontrado útil el siguiente método ...

btrfs scrub El volumen.

Se le presentará cualquier cantidad de errores de csum como se muestra arriba.
Usando sus detalles de error de ejemplo : csum = 4 . Use ese número en la directiva de cola de la siguiente declaración:

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

Es útil canalizar esto a un archivo (por ejemplo > csums.txt)

He probado varios de los enfoques de búsqueda de inodo sugeridos y todos se han encontrado con un éxito limitado o nulo.


Según tengo entendido, está utilizando la cola para limitar el número de líneas que se muestran e ignorar los duplicados. Recomendaría usar sort | uniqpara deshacerse de los duplicados de esta manera:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi

3

Sí, la asignación de INODE o Número de bloque a un nombre de archivo puede ser difícil. Si está realmente interesado, puede intentar algo como esto y ver qué archivos copiar ... después de todo, si el archivo es malo, debería arrojar un error durante la copia. Anteriormente he usado este tipo de técnica.

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

 where mount-point is the ROOT node/mount-point of the affected filesystem

Ejecutándolo ahora, ojalá que aparezca algo. Gracias por tu consejo, te informaré sobre el resultado.
RedHack

1
Lamento decir que no parece funcionar = / encontró el primer archivo que causa el error que no se puede corregir, pero luego envía el mensaje: "identificador de archivo obsoleto" al terminal a menos que lo finalice. De acuerdo, encontró el archivo, pero ahora no puedo encontrar la manera de deshacerme de él. Voy a tener que contactar con la lista de correo BTRFS.
RedHack

Puede moverlo a un directorio especial y luego excluirlo de una búsqueda adicional.
mdpc

1
No se moverá ni copiará, solo me sigue diciendo que el identificador del archivo está obsoleto. Ni siquiera puedo ls.
RedHack

2

dmesgle proporcionará detalles sobre los archivos involucrados en los errores de suma de verificación no corregibles. Los mensajes suelen tener este aspecto: "BTRFS: error de suma de comprobación en lógica [...] en [...] dev, sector [...], raíz [...], inodo [...], desplazamiento [ ...], longitud [...], enlaces [...] (ruta: [...]) "; La última información es la ruta absoluta al archivo que está dañado.


1

Vine aquí buscando el "error no corregible" de BTRFS también. El grep anterior no funcionó para mí; Tuve que usar en su lugar:

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

Observe cómo la ruta es relativa al inicio del subvolumen, sin indicación de en qué subvolumen se encuentra. Esto, afortunadamente, no fue un problema para mí.


¿Qué es somepath/somefile.txt? Parece que lo está escribiendo como un comando separado, ¿o es el resultado del comando que escribió? Si se supone que todo es una línea de comando, no divida las líneas de comando para mostrarlas, solo colóquelo en la respuesta como una línea larga. ¿Pero, qué es esto? ¿Está proporcionando dos entradas a sort(una tubería y un archivo)? ¿O está somepath/somefile.txtdestinado a ser un archivo de salida? (No es muy útil especificar archivos de salida, a menos que sean archivos intermedios que está utilizando de nuevo. La gente sabe cómo manejar los resultados; por ejemplo, por tuberías.)
Scott

¿Responde esto a la pregunta original? No puedo decirlo
Twisty Impersonator

@TwistyImpersonator Bueno, claramente (IMO) está destinado a ser una alternativa a la respuesta de Mark , y eso obtuvo ocho votos (y es una expansión de la respuesta de arrrr ).
Scott

1
@Scott la segunda línea era una salida de muestra del comando.
crusaderky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.