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.

Publicaciones Similares

  • Sonata Admin: cómo redireccionar un usuario según su rol

    Escenario Una aplicación symfony 4.4 con el framework Sonata Admin 3.78.1 cuenta con una página de login para que los administradores del sitio puedan gestionar sus clientes. Ahora queremos que los clientes puedan usar la misma página de login para acceder a sus datos personales como, por ejemplo, sus facturas. Para la gestión de usuarios…

  • Composer e instancia AWS t2.micro ec2: ¡no hay memoria suficiente!

    Escenario: Desplegar una aplicación php en una instacia de tipo t2.micro en EC2 utilizando composer.phar. Problema: Este tipo de instancia sólo dispone de 1GB de memoria, insuficiente para instalar las dependencias de un proyecto de tipo symfony por ejemplo. Resultando en un error fatal de este tipo: PHP Fatal error:  Out of memory (allocated 813694976) (tried to allocate 67108864 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 220 Soluciones. Pagar un poco más por un…

  • Despliegue aplicación Spring Boot

    Escenario Queremos desplegar en la nube una aplicación desarrollada con Spring Boot cuyo código está bajo control de versiones. Para este artículo usaremos ubuntu 16.04 y java 8, pero el procedimiento debería ser el mismo con versiones más actuales. Problema Ninguno. Realmente es sencillo desplegar una aplicación de este tipo si se dispone de las…

  • |

    Cómo ampliar el espacio en disco en 1and1

    Escenario Hemos contratado un servidor dedicado en 1and1 (ubuntu 14.04) y al acceder por ssh constatamos que no disponemos de todo el espacio en disco disponible: $ df -hFilesystem Size Used Avail Use% Mounted onudev 3.9G 4.0K 3.9G 1% /devtmpfs 798M 592K 797M 1% /run/dev/md1 4.0G 990M 3.0G 25% /none 4.0K 0 4.0K 0% /sys/fs/cgroupnone 5.0M 0 5.0M 0% /run/locknone 3.9G 0 3.9G 0% /run/shmnone 100M 0 100M 0% /run/user/dev/mapper/vg00-usr 4.8G 1.3G 3.3G 28% /usr/dev/mapper/vg00-var 4.8G 812M 3.8G 18% /var/dev/mapper/vg00-home 4.8G 10M 4.6G 1% /home Objetivo Aumentar el espacio disponible para dar cabida a nuestros recursos. Solución Nota: sólo aplicable a sistemas linux Primer paso Comprobamos el espacio en disco real: ~$ sudo fdisk -lDisk /dev/sda: 240.1 GB, 240057409536 bytes255 heads, 63 sectors/track, 29185 cylinders, total 468862128 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x24e3fc12   Device Boot      Start         End      Blocks   Id  System/dev/sda1            2048     8390655     4194304   fd  Linux raid autodetect/dev/sda2         8390656    12584959     2097152   82  Linux swap / Solaris/dev/sda3        12584960   468862127   228138584   fd  Linux raid autodetect Segundo…

  • |

    Traducción de variables en javascript

    Escenario Estoy trabajando en una aplicación multi-lenguaje desarrollada con la plataforma spring boot. Para quien no conozca esta plataforma de desarrollo, spring boot te permite gestionar varios lenguajes gracias a un sistema que utiliza ficheros de tipo propiedades para almacenar las traducciones. Los nombres de estos ficheros han de respetar la siguiente convención, messages_{código ISO…

  • Sustitución del mapeo original de FOSUserBundle en symfony2

    Para un nuevo proyecto en PHP que estamos empezando, hemos decidido utilizar la plataforma symfony2. En el pasado he tenido la suerte de trabajar, disfrutar y aprender con symfony 1.x, gracias a su coherente organización, buen uso del PHP y unos robustos cimientos fundados en una extensa documentación y una vasta comunidad de activos desarrolladores.

Deja una respuesta

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