rsnapshot es una herramienta para hacer snapshots de filesystems utilizando rsync, fácilmente configurable y con un considerable ahorro de espacio cuando los archivos no cambian (utiliza hard links en estos casos). En realidad es un clever perl script para llamar al rsync.

El restore es tan simple como buscar en un filesystem y copiar lo que haga falta.

Funciona tanto local como remotamente (utilizando ssh).

El libro Backup & Recovery: Inexpensive Backup Solutions for Open Systems publicado por O'Reilly contiene una sección sobre rsnapshot disponible en línea.

Instalación

Como la versión que trae ubuntu (heredada de la de debian) es la 1.3.0 que tiene un bug que es un show stopper para usarlo razonablemente con ssh y claves públicas/privadas particulares, instalaremos directamente la versión original.

Primero instalamos (si no estaban ya instaladas) las dependencias con las herramientas normales:

sudo apt-get install rsync perl logrotate

Luego bajamos el paquete y lo abrimos

RSNAPVERSION=1.3.1
mkdir -pv ${HOME}/soft
cd ${HOME}/soft
wget http://www.rsnapshot.org/downloads/rsnapshot-${RSNAPVERSION}.tar.gz
tar xzvf rsnapshot-${RSNAPVERSION}.tar.gz
cd rsnapshot-${RSNAPVERSION}

Configuramos, compilamos e instalamos

cd ${HOME}/soft/rsnapshot-${RSNAPVERSION}

# configuramos para instalar en /usr/local,
# pero que la configuracion vaya en /etc
# (y no en /usr/local/etc)
./configure --sysconfdir=/etc

make test

sudo make install

# Esto hacerlo solo si no estaba instalado anteriormente
sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

Configuración

Generalidades

El archivo de configuración de rsnapshot es /etc/rsnapshot.conf. En general toda la configuración va aquí (excepto la invocación en sí misma que hay que configurarla en el cron.

/!\ OJO /!\ Los campos en el archivo de configuración están separados por TAB... Prácticamente todos los espacios en blanco que se ven en dicho archivo son caracteres TAB. Usar espacios en blanco no funciona. /!\

Vale la pena repetirlo: <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!> USAR TAB, NO ESPACIOS <!>

Además, si una línea es muy larga, se la puede continuar debajo, comenzando la línea de continuación... ¡¡con un TAB!! :-)

¿Ya dije que había que USAR TAB y NO ESPACIOS?

Directorio para snapshots

Esto se configura en /etc/rsnapshot.conf. Si el directorio no existe, lo creará la primera vez que se lo ejecute (salvo que se configure no_create_root 1 allí mismo. La configuración default en general es razonable:

# All snapshots will be stored under this root directory.
#
snapshot_root   /.snapshots/

# If no_create_root is enabled, rsnapshot will not automatically create the
# snapshot_root directory. This is particularly useful if you are backing
# up to removable media, such as a FireWire or USB drive.
#
#no_create_root 1

Intervalos

rsnapshot arranca periódicamente desde el cron y tiene un concepto de intervalos que se deben definir en el archivo de configuración e invocárselo con ellos.

Los intervalos normalmente se llaman:

  • hourly
  • daily
  • weekly
  • monthly

sin embargo, esto es sólo una convención. Lo único importante es definirlos en el archivo de configuración (/etc/rsnapshot.conf) en orden ascendente. Los nombres son totalmente arbitrarios. En el archivo de configuración se los lista y a cada uno se le configura la cantidad que hay que mantener de cada uno. Una configuración posible sería:

# Backup intervals
# el intervalo principal es cada 4 horas, mantenemos 6 de estos:
interval cada4horas 6
# luego rotamos uno por día y mantenemos 7 de estos:
interval diario     7
# hacemos además uno semanal y mantenemos 5 de estos:
interval semanal    5
# y uno mensual y mantenemos 12:
interval mensual   12

Ahora hay que configurar el cron para que invoque al rsnapshot con la frecuencia que queremos (insisto, los nombres son arbitrarios). Lo mejor es crear un archivo de cron /etc/cron.d/rsnapshot:

# corremos el menor (el que realmente sincroniza desde el filesystem)
# una vez cada 4 horas (a las 00:07, 04:07, 08:07... 20:07):
07 */4  * * *       root    /usr/local/bin/rsnapshot cada4horas
# rotamos diariamente todos los dias a las 03:39
39 3    * * *       root    /usr/local/bin/rsnapshot diario
# rotamos semanalmente los domingos a las 07:11
11 7    * * 0       root    /usr/local/bin/rsnapshot semanal
# rotamos mensualmente cada 1ero de mes a las 02:23
23 2    1 * *       root    /usr/local/bin/rsnapshot mensual

Los horarios aquí son arbitrarios... en general, prefiero no usar horas en punto, y cuarto o y media ya que la mayoría de la gente las usa.

Comandos

En el archivo de configuración (/etc/rsnapshot.conf), descomentar la línea para el comando cp (ya que estamos en linux) y del comando ssh. Asegurarse de que los paths sean los correctos:

# LINUX USERS:   Be sure to uncomment "cmd_cp". This gives you extra features.
# EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility.
#
# See the README file or the man page for more details.
#
cmd_cp     /bin/cp

# uncomment this to use the rm program instead of the built-in perl routine.
#
cmd_rm      /bin/rm

# rsync must be enabled for anything to work. This is the only command that
# must be enabled.
#
cmd_rsync   /usr/bin/rsync

# Uncomment this to enable remote ssh backups over rsync.
#
cmd_ssh    /usr/bin/ssh

# Comment this out to disable syslog support.
#
cmd_logger  /usr/bin/logger

# Uncomment this to specify the path to "du" for disk usage checks.
# If you have an older version of "du", you may also want to check the
# "du_args" parameter below.
#
cmd_du     /usr/bin/du

# Uncomment this to specify the path to rsnapshot-diff.
#
cmd_rsnapshot_diff /usr/local/bin/rsnapshot-diff

Puntos de backup (backup points)

Los backup points son los directorios que se quieren resguardar. La configuración por defecto del rsnapshot contiene un conjunto razonable de puntos que uno siempre debería resguardar en un linux:

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
backup /home/      localhost/
backup /etc/       localhost/
backup /usr/local/ localhost/

Esto se lee del siguiente modo:

  • hacer un backup del directorio /home (y todos sus subdirectorios) y dejarlo en subdirectorios de /.snapshots/localhost.

  • hacer un backup del directorio /etc (y todos sus subdirectorios) y dejarlo en subdirectorios de /.snapshots/localhost.

  • hacer un backup del directorio /usr/local (y todos sus subdirectorios) y dejarlo en subdirectorios de /.snapshots/localhost.

/!\ ATENCIÓN /!\ Las barras (/) al final de los nombres de los directorios (tanto fuente como destino) son <!> obligatorias <!>

/!\ ATENCIÓN /!\ Ya no debería hacer falta repetir que los espacios entre backup y el nombre del directorio a backupear, y entre este último y el directorio donde dejar dicho backup son en realidad <!> TAB, NO ESPACIOS <!> ¿no?

backup de mayor frecuencia

Luego de la ejecución del comando

/usr/local/bin/rsnapshot cada4horas

(que normalmente se hace via cron):

  • primero se elimina el último backup de nivel "cada4horas" (/.snapshots/localhost/cada4horas.5)

  • luego se rotan los backups anteriores de nivel "cada4horas" (si los hay):
    • /.snaphots/localhost/cada4horas.4 ==> /.snaphots/localhost/cada4horas.5

    • /.snaphots/localhost/cada4horas.3 ==> /.snaphots/localhost/cada4horas.4

    • /.snaphots/localhost/cada4horas.2 ==> /.snaphots/localhost/cada4horas.3

    • /.snaphots/localhost/cada4horas.1 ==> /.snaphots/localhost/cada4horas.2

    • /.snaphots/localhost/cada4horas.0 ==> /.snaphots/localhost/cada4horas.1

  • por último, se hace el backup en sí (porque "cada4horas" es el nivel más bajo), que nos va a dejar algo parecido a esto:

/.snapshots/localhost/cada4horas.0/etc
/.snapshots/localhost/cada4horas.0/etc/fstab
/.snapshots/localhost/cada4horas.0/etc/passwd
/.snapshots/localhost/cada4horas.0/etc/group
...
/.snapshots/localhost/cada4horas.0/home
/.snapshots/localhost/cada4horas.0/home/baby
/.snapshots/localhost/cada4horas.0/home/baby/.bashrc
/.snapshots/localhost/cada4horas.0/home/baby/.bash_profile
...
/.snapshots/localhost/cada4horas.0/usr/local
/.snapshots/localhost/cada4horas.0/usr/local/bin
/.snapshots/localhost/cada4horas.0/usr/local/bin/my_funny_script.sh
/.snapshots/localhost/cada4horas.0/usr/local/bin/locally_installed_program
...
/.snapshots/localhost/cada4horas.0/usr/local/etc
/.snapshots/localhost/cada4horas.0/usr/local/etc/locally_installed_program.conf
...
/.snapshots/localhost/cada4horas.0/usr/local/share
/.snapshots/localhost/cada4horas.0/usr/local/share/locally_installed_program
/.snapshots/localhost/cada4horas.0/usr/local/share/locally_installed_program/stuff
...

backup de menor frecuencia

Cuando se ejecuta

/usr/local/bin/rsnapshot diario

sucede lo siguiente:

  • se borra el último "diario" (en nuestro caso /.snaphots/localhost/diario.6.

  • se rotan el los "diarios" anteriores
    • /.snaphots/localhost/diario.5 ==> /.snaphots/localhost/diario.6

    • /.snaphots/localhost/diario.4 ==> /.snaphots/localhost/diario.5

    • /.snaphots/localhost/diario.3 ==> /.snaphots/localhost/diario.4

    • /.snaphots/localhost/diario.2 ==> /.snaphots/localhost/diario.3

    • /.snaphots/localhost/diario.1 ==> /.snaphots/localhost/diario.2

    • /.snaphots/localhost/diario.0 ==> /.snaphots/localhost/diario.1

  • se sube el último "cada 4 horas"

    • /.snaphots/localhost/cada4horas.5 ==> /.snaphots/localhost/diario.0

Lo mismo sucede con los otros niveles (semanal y mensual).

Resumen de funcionamiento

El único que realmente copia cosas del origen hacia el backup es el de mayor frecuencia (en nuestro caso "cada4horas").

Backup remoto

Para poder hacer backup de máquinas remotas necesitamos que la máquina remota tenga rsync y un servidor ssh y tenemos que poder acceder con permisos de root via ssh.

Ver /ClavesSsh para ver cómo armar las claves.

Una vez que las claves están bien configuradas hay que agregar en /etc/rsnapshot.conf la opción para que use la clave privada que creamos.

Suponiendo que esa clave esté en /root/.ssh/my-host_rsnapshot_rsa_id hay que agregar una línea:

ssh_args    -i /root/.ssh/my-host_rsnapshot_rsa_id

Claramente lo que hay entre ssh_args y -i es <!> TAB, NO ESPACIOS <!> ¿no?

Ahora podemos agregar backup points remotos:

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
backup  /home/  localhost/
backup  /etc/   localhost/
backup  /usr/local/     localhost/

# MY-HOST.EXAMPLE.COM
backup  root@my-host.example.com:/home/ my-host.example.com
backup  root@my-host.example.com:/etc/  my-host.example.com
backup  root@my-host.example.com:/usr/local/    my-host.example.com

Esto se lee del siguiente modo:

  • hacer un backup del directorio /home (y todos sus subdirectorios) del equipo local y dejarlo en subdirectorios de /.snapshots/localhost.

  • hacer un backup del directorio /etc (y todos sus subdirectorios) del equipo local y dejarlo en subdirectorios de /.snapshots/localhost.

  • hacer un backup del directorio /usr/local (y todos sus subdirectorios) del equipo local y dejarlo en subdirectorios de /.snapshots/localhost.

  • hacer un backup del directorio /home (y todos sus subdirectorios) del equipo remoto my-host.example.com y dejarlo en subdirectorios de /.snapshots/my-host.example.com.

  • hacer un backup del directorio /etc (y todos sus subdirectorios) del equipo remoto my-host.example.com y dejarlo en subdirectorios de /.snapshots/my-host.example.com.

  • hacer un backup del directorio /usr/local (y todos sus subdirectorios) del equipo remoto my-host.example.com y dejarlo en subdirectorios de /.snapshots/my-host.example.com.

Backup con scripts

Algunos datos no se puede backukpear copiando archivos, por ejemplo, bases de datos o servidores ldap. Para esto, se puede poner, en lugar de un backup point, un backup script.

El script debe dejar su salida en el current directory. Es decir, no debe escribir en ningún directorio que no sea ./.

selección de paquetes instalados (dpkg)

Una de las cosas difíciles al rearmar una máquina desde 0 es recordar exactamente qué paquetes había instalados... esto es fácil de listar con dpkg:

backup_script   /usr/bin/dpkg --get-selections > dpkg_selections        localhost/var/db/

Lo que hay entre backup_script y /usr/bin/dpkg y lo que hay entre dpkg_selections y localhost/var/db/ son <!> TABS, NO ESPACIOS <!>

Si quisiéramos hacerlo en forma remota (es decir, obtener el listado de paquetes instalados en otro equipo), conviene hacerlo en dos pasos:

backup_script   /usr/bin/ssh -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com "dpkg --get-selections > /var/db/dpkg_selections"  .dummy_dpkg
backup  -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com:/var/db/ my-host.example.com/

dump de mysql

Para hacer un backup de MySQL usamos el comando mysqldump

backup_script   /usr/bin/mysqldump --all-databases > mysql.sql  localhost/var/db/

Lo que hay entre backup_script y /usr/bin/mysqldump y lo que hay entre mysql.sql y localhost/var/db/ son <!> TABS, NO ESPACIOS <!>

Si quisiéramos hacerlo en forma remota (es decir, obtener el backup de las bases MySQL en otro equipo), conviene hacerlo en dos pasos:

backup_script   /usr/bin/ssh -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com "mysqldump --all-databases > /var/db/mysql.sql"    .dummy_mysql
backup  -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com:/var/db/ my-host.example.com/

In both cases, in the host that has the mysql server we have to add a file with the password of user root so it works:

MYSQLROOTPW=xxxxxx
sudo sh -c "cat > ~root/.my.cnf" <<EOF
[client]
user = root
password = $MYSQLROOTPW
host = localhost
EOF
sudo chmod -v 0600 ~root/.my.cnf

dump de postgresql

Para hacer un backup de PostgreSQL usamos el comando pg_dumpall

backup_script   /usr/bin/sudo -u postgres pg_dumpall > postgresql.sql   localhost/var/db/

Lo que hay entre backup_script y /usr/bin/sudo y lo que hay entre postgresql.sql y localhost/var/db/ son <!> TABS, NO ESPACIOS <!>

Si quisiéramos hacerlo en forma remota (es decir, obtener el backup de las bases PostgreSQL en otro equipo), conviene hacerlo en dos pasos:

backup_script   /usr/bin/ssh -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com "sudo -u postgres pg_dumpall > /var/db/postgresql.sql"     .dummy_postgresql
backup  -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com:/var/db/ my-host.example.com/

dump de ldap

Para hacer un backup del árbol LDAP usamos el comando ldapsearch

backup_script  /usr/bin/ldapsearch -c -x -y /etc/ldap/slapd_root_pw -D cn=administrator,cn=config -b dc=example,dc=org > ldap.ldif   localhost/var/db/

Lo que hay entre backup_script y /usr/bin/ldapsearch y lo que hay entre ldap.ldif y localhost/var/db/ son <!> TABS, NO ESPACIOS <!>

Para que esto funcione hay que:

  • reemplazar cn=administrator,cn=config por el dn (distinguished name) del usuario administrador de slapd.

  • reemplazar dc=example,dc=org por la base del árbol LDAP (o de la porción que se quiera backupear).

  • crear un archivo /etc/ldap/slapd_root_pw con la password del administrador de slapd.

    • <!> Atención <!> Este archivo debe tener sólo la clave, no puede tener siquiera un fin de línea al final

    • <!> Atención <!> Este archivo sólo debe poder ser leído por root

SLAPDROOTPW=xxxxxx
sudo sh -c "echo -n ${SLAPDROOTPW} > /etc/ldap/slapd_root_pw"
sudo chmod -v 0600 /etc/ldap/slapd_root_pw

Si quisiéramos hacerlo en forma remota (es decir, obtener el backup del árbol LDAP en otro equipo), conviene hacerlo en dos pasos:

backup_script   /usr/bin/ssh -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com "ldapsearch -c -x -y /etc/ldap/slapd_root_pw -D cn=administrator,cn=config -b dc=example,dc=org > /var/db/ldap.ldif"       .dummy_ldap
backup  -i /root/.ssh/my-host_rsnapshot_rsa_id root@my-host.example.com:/var/db/ my-host.example.com/

Rotación de logs

Configuramos el logrotate:

sudo sh -c "cat > /etc/logrotate.d/rsnapshot" <<EOF
/var/log/rsnapshot {
        rotate 12
        monthly
        compress
        missingok
}
EOF

BackupConRsnapshot (última edición 2009-07-25 10:37:43 efectuada por MarianoAbsatz)

Edit and actions menu

  • Página inmutable
  • Información
  • Adjuntos