Pregunta Cómo determinar qué archivo / inodo ocupa un sector determinado


Recibí mensajes en /var/log/kern.log que indican fallo de la unidad. Los mensajes ocurrieron al copiar mi $HOME entre unidades (ext4 -> ext3):

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

Los mensajes vienen en grandes cantidades, este es uno de esos grandes volúmenes. sdb es la unidad de origen.

¿Cómo puedo saber a qué archivo / inodo pertenece el sector? Solo quiero saber para poder recuperar los archivos en cuestión de una copia de seguridad. ¿Algo más rápido que el siguiente código más un análisis posterior de la salida?

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;

OS: Ubuntu Oneiric.

EDITAR: El comando anterior también da salida a stderr Los archivos que no se pudieron leer.


7
2017-09-26 21:02


origen




Respuestas:


La idea aproximada sería

  1. haga algunos cálculos para averiguar el número de bloque del sistema de archivos según el número de sector físico
  2. utilizar debugfs Comandos testb / ncheck / icheck para averiguar si el bloque está en uso y el nombre de los archivos que lo están utilizando

Hay un bad block HOWTO en el sitio del proyecto smartmontools Describiendo el proceso con más detalle.


2
2017-09-26 22:58



Gracias por el puntero. ¿Conoce una herramienta que automatiza este proceso? - krlmlr
No, pero debería ser bastante fácil escribir algo que se ajuste a la necesidad. - the-wabbit


  1. Encuentra en qué partición está el sector ejecutando fdisk -lu /dev/sdb. Supongamos que es "sdb2" que comienza en el sector 45612307.

  2. Resta eso de 95891008 para obtener 50278701.

  3. A continuación, determine cuántos sectores por bloque: tune2fs -l /dev/sdb2 | grep Block. Supongamos que es 4096.

  4. Calcule la relación bloque / sector: 512 bytes / sector / 4096 bytes / bloque = 0.125 bloques / sector.

  5. Calcule el bloque del sector: 50278701 * 0.125 = 6284837.625.

  6. Use debugfs para averiguar cuál está usando el bloque. Si icheck 6284837 devuelve inode 12345 y luego ejecuta ncheck 12345.

Advertencias: Es posible que deba desactivar el registro en diario. Esto puede no funcionar con ext4.


5
2017-09-26 23:18



Me gustaría agregar una manera de verificar si sus cálculos son correctos, como usar stat o FIBMAP / FIEMAP iocalls. - neutrinus