Hace poco me he encontrado en la situacion de que una tarjeta MicroSD me estaba causando problemas, provocando algunos cierres inesperados de aplicaciones en el telefono y dandome guerra a la hora de interactuar con archivos del movil desde el ordenador. Los errores eran de este tipo, unos 30 cuando hice la copia de seguridad de los 40GB que tenia dentro de la tarjeta:
May 17 23:31:57 casa kernel: [101623.873871] sd 6:0:0:0: [sdc] tag#0 Sense Key : Aborted Command [current] May 17 23:31:57 casa kernel: [101623.873873] sd 6:0:0:0: [sdc] tag#0 Add. Sense: Incompatible medium installed May 17 23:31:57 casa kernel: [101623.873875] sd 6:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 01 b9 a6 08 00 00 08 00 May 17 23:31:57 casa kernel: [101623.873877] blk_update_request: I/O error, dev sdc, sector 28943880 May 17 23:31:57 casa kernel: [101623.873880] Buffer I/O error on dev sdc1, logical block 3617729, async page read May 17 23:32:38 casa kernel: [101664.137808] sd 6:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE May 17 23:32:38 casa kernel: [101664.137811] sd 6:0:0:0: [sdc] tag#0 Sense Key : Aborted Command [current] May 17 23:32:38 casa kernel: [101664.137813] sd 6:0:0:0: [sdc] tag#0 Add. Sense: Incompatible medium installed May 17 23:32:38 casa kernel: [101664.137815] sd 6:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 01 b9 ad 50 00 00 08 00 May 17 23:32:38 casa kernel: [101664.137816] blk_update_request: I/O error, dev sdc, sector 28945744 May 17 23:32:38 casa kernel: [101664.137819] Buffer I/O error on dev sdc1, logical block 3617962, async page read May 17 23:33:33 casa kernel: [101719.877854] sd 6:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE May 17 23:33:33 casa kernel: [101719.877858] sd 6:0:0:0: [sdc] tag#0 Sense Key : Aborted Command [current] May 17 23:33:33 casa kernel: [101719.877860] sd 6:0:0:0: [sdc] tag#0 Add. Sense: Incompatible medium installed May 17 23:33:33 casa kernel: [101719.877862] sd 6:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 01 bd 97 d8 00 00 08 00 May 17 23:33:33 casa kernel: [101719.877863] blk_update_request: I/O error, dev sdc, sector 29202392 May 17 23:33:33 casa kernel: [101719.877866] Buffer I/O error on dev sdc1, logical block 3650043, async page read May 17 23:34:21 casa kernel: [101767.209847] sd 6:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Total, que decidi iniciar el procedimiento de devolucion con el vendedor. Pero claro, uno no quiere mandar alegremente una tarjeta con todas sus fotos y datos personales por ahi, asi que la solucion pasaba por saber como sobreescribir una tarjeta MicroSD con errores antes de enviarla al fabricante. El problema es que la utilidad dd fallaba cuando intentaba escribir la tarjeta MicroSD en el momento en que tenia timeouts de escritura en la misma.
Me puse a buscar y encontre lo siguiente
Podemos localizar los bloques erroneos de una tarjeta MicroSD con el siguiente comando
root@casa:~# badblocks -v -b 4096 /dev/sdX Checking blocks 0 to 31217151 Checking for bad blocks (read-only test): done Pass completed, 0 bad blocks found. (0/0/0 errors)
Si queremos localizar los bloques malos de una tarjeta y sacarlos a un archivo txt usaremos el siguiente comando
badblocks -v -b 4096 -o badblocks.txt /dev/sdX
Si queremos que el propio badblocks se encargue de sobreescribir la tarjeta MicroSD en el proceso de busqueda de bloques malos, utilizaremos el siguiente
badblocks -v -b 4096 -t random -w /dev/sdX
Otra forma de sobreescribir una tarjeta MicroSD con errores es usando la herramienta ddrescue, que escribira en la tarjeta ignorando los errores de la misma hasta llenarla.
root@casa:~# ddrescue --verbose --force --no-split /dev/zero /dev/sdX GNU ddrescue 1.19 About to copy an unknown number of Bytes from /dev/zero to /dev/sdc. Starting positions: infile = 0 B, outfile = 0 B Copy block size: 128 sectors Initial skip size: 128 sectors Sector size: 512 Bytes Press Ctrl-C to interrupt rescued: 127865 MB, errsize: 0 B, current rate: 14876 kB/s ipos: 127865 MB, errors: 0, average rate: 21547 kB/s opos: 127865 MB, run time: 1.64 h, successful read: 0 s ago Copying non-tried blocks... Pass 1 (forwards) ddrescue: Write error: No space left on device
Curiosamente, al ejecutar estos comandos y sobreescribir una tarjeta MicroSD me di cuenta de que la tarjeta propiamente no reportaba errores, asi que parece que la escritura le ha sentado bien.