Recuperar todo el disco
Bien, esto resolvió la parte potencialmente grave de la situación, pero quedaba intentar el rescate de todo el disco, porque no me gusta andar haciendo inventario de lo que tiene desperdigado (ya sé que es una mala práctica, pero soy humano después de todo).
Así que compré un disco nuevo, para poder devolver el disco pequeño al cajón con los datos actualizados.
Copia en bruto de dispositivos en Linux
Monté el disco nuevo en la máquina Linux, junto al disco estropeado, e intenté la copia sector a sector con la orden dd (manejar con cuidado esta utilidad). Sin embargo comencé a observar errores durante la copia cuando ya se había copiado más del 50% del disco, y me pregunté si no sería posible usar algo mejor. Leyendo por la red encontre una referencia a ddrescue (lo mismo que dd, pero ignora los errores de lectura).
Aborté la copia dd y en su lugar intenté ddrescue:
ddrescue /dev/disks/by-id/scsi-SATA_ST3500320AS_9QM4CGC1 /dev/disks/by-id/scsi-SATA_ST3500320AS_9QM774TP
Hubiese sido de utilidad especificar la opción que copia la salida de la consola a un fichero log, para tener un mapa de defectos del disco, pero no lo hice.
Pensé, durante las largas horas del rescate, que si encontrase un utilitario capaz de identificar el nombre de los archivos afectados por sectores defectuosos en el disco, sería posible copiarlos desde el disco pequeño para sustituirlos por copias funcionales. Sorprendentemente, no conseguí encontrar ninguno para ntfs, aunque es muy fácil construir uno para sistemas de archivo fat.
El disco estaba tan estropeado que no conseguí terminar la copia transcurridas 12 horas. Aborté la copia una vez que estuve seguro de haber duplicado las dos primeras particiones (algo más del 50% del disco).
Recuperación del sistema Windows
No estaba seguro si la copia quedaría utilizable o no, pero monté el disco rescatado en su ordenador, reemplazando al pequeño, y lo arranqué. Windows comenzó a cargarse, e inmediatamente se inició chkdsk, advirtiendo de inconsistencias y errores en el disco (que el original enmascaraba).
Milagrosamente, Windows consiguió iniciarse, y realicé una verificación del sistema:
sfc /scannow
Esta utilidad solicitó el disco original de Windows XP, del que copió algo que seguramente estaba estropeado, y el problema quedó definitivamente resuelto.
Esta recuperación funcionó porque apenas había unos sectores dañados al pricipio del disco (32 sectores, unos 48Kb), y al parecer ningún problema con la estructura de carpetas.
Windows consiguió iniciarse porque ningún archivo vital para el arranque resultó estropeado. Si esto hubiese sucedido, se complicaría notablemente la restauración del sistema operativo, sin la ayuda de la utilidad que reconoce archivos en sectores defectuosos, ya que sfc sólo funciona sobre el sistema de Windows iniciado.
NOTA: SMART sólo avisó que el disco estaba a punto de fallar en la máquina Linux, durante el proceso de rescate.