Cómo recuperar ficheros borrados de Amazon Linux

Escenario

Tenemos una aplicación de tipo SpringBoot desplegada en una instancia ec2 de Amazon, con el sistema operativo Amazon Linux. Para sincronizar los cambios con el código desplegado en producción utilizo rsync en este script de bash: Ayer cuando desplegué, la aplicación no compilaba en el servidor remoto. Era debido a que una clase residual que había sido borrada entraba en conflicto con otra recientemente desplegada. Me dije que la manera de solucionarlo era añadiendo el parámetro --delete al comando de resync.

Problema

Olvidé excluir la carpeta en la que los usuarios suben ficheros en la web con lo que pude presenciar en directo como se iban borrando uno a uno en el servidor de producción

Solución

Amazon Linux ustiliza el sistema de ficheros xfs. Buscando en Goolge encontré una herramienta con la que supuestamente se podría recuperar ficheros borrados en ese sistema de ficheros, xfs_undelete. Para recuperar los archivos el disco de origen tiene que estar desmontado. Seguí los pasos siguientes:
  1. Creo un snapshot del disco
  2. Creo un volumen a partir del snapshot
  3. Lo engancho (attach) a la intancia. Atención al elegir la zona, debe coincidir con la de la instancia.
  4. Localizo el dispositivo en /dev, en mi caso aparece como /dev/sdf1
xfs_undelete requiere un par de bibliotecas que no están presentes en Amazon Linux, tcl >= 8.6 y tcllib. La primera la instalo con el paquete expect: Para la segunda hay que descargar el zip de core.tcl-lang.org, lo descomprimimos en nuestra máquina y dentro de la carpeta lanzamos el siguiente comando: Ahora ya podemos lanzar el comando para recuperar los ficheros. Descargamos el zip de github, lo descomprimimos y desde dentro de la carpeta: Se pueden añadir parámetros, como uno para reducir la búsqueda a ficheros borrados después de tal día ( sudo ./xfs_undelete -t 2020-12-10 /dev/sdf1), pero tras varias pruebas no he visto mucha diferencia en los resultados. En mi caso, si bien ha conseguido rescatar algunos ficheros, no he podido recuperar otros, en concreto un par de zips.

Conclusión

Por supuesto, siempre tenemos que tener un respaldo de cualquier fichero que no esté bajo control de versiones. Y, segundo, para desplegar una aplicación SpringBoot no hace falta hacer un rsync de todo el código fuente y luego compilarlo. Basta con mandar el .jar a la carpeta target de la aplicación de destino, y luego parar y arrancar el servicio.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *