Sobreescribir una tarjeta MicroSD con errores

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.