Subsecciones

Copias de Seguridad con rsync

El Algoritmo

El programa rsync permite la sincronización de ficheros y directorios entre dos máquinas minimizando el tamaño de la trasmisión mediante el cálculo de las diferencias entre las versiones existentes en las dos localizaciones implicadas.

rsync opera e la siguiente forma (véase Rsync:

  1. El usuario especifica las máquinas de origen y destino asi como los ficheros a actualizar

  2. La máquina de destino descompone el fichero objetivo en pequeños bloques de tamaño fijo y genera checksums para cada bloque

  3. La máquina destino transmite sus checksums a la máquina fuente

  4. La máquina fuente busca el fichero y encuentra los bloques para los cuales los checksum casan con los suyos

  5. La máquina fuente genera un conjunto de instrucciones que la máquina destino puede usar para actualizar el fichero

  6. La máquina fuente envía a la máquina de destino las instrucciones asi como los datos de aquellas partes que no casan al destino

  7. La máquina de destino utiliza las instrucciones y los nuevos datos para actualizar sus ficheros

Mode de Uso

Normalmente se usara como en el ejemplo vía SSH:

rsync -aue ssh /home/user/public_html/ user@orion:/home/user/public_html/directory/

La opción -a es equivalente a -rlptgoD. El significado de cada una de estas opciones es:

La opción -u, --update permite saltarse aquellos ficheros que son mas recientes en el receptor.

La opción -e permite especificar que ssh será utilizada.

Los módulos File::Rsync y File::RsyncP

El módulo File::Rsync ofrece una API de acceso a rsync:

pp2@nereida:~/LCALL$ perl -MFile::Rsync -wde 0
main::(-e:1):   0
  DB<1> $obj = File::Rsync->new( { archive => 1, rsh => '/usr/bin/ssh -l loginname', \
                                  'rsync-path' => '/usr/bin/rsync' } )
  DB<2> $obj->exec( { src => '/home/pp2/public_html/', dest => 'machine:/home/loginname/public_html/pp2/' } )
  DB<3> q
pp2@nereida:~/LCALL$ ssh loginname@machine 'ls -ltr | tail -3'
drwxr-xr-x  38 loginname loginname        4096 2007-03-21 07:26 pp2
drwxr-xr-x  60 loginname loginname        4096 2007-03-21 08:08 pl
drwxr-xr-x   7 loginname loginname        4096 2007-03-21 12:20 public_html
pp2@nereida:~/LCALL$ ssh loginname@machine date
mié mar 21 12:26:37 WET 2007
Otro módulo es File::RsyncP, enteramente escrito en Perl.

Backups con rsync en un Medio Externo

Veamos como hacer una copia diaria de una máquina remota (someserver) a un disco USB externo en otra máquina mylaptop.

El fichero /etc/fstab

La última línea del fichero /etc/fstab muestra la información de montaje:

root@mylaptop:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/sda1
UUID=45797091-2b2f-45b2-95c1-2bfaaea20253 /               ext3    relatime,errors=remount-ro 0       1
# /dev/sda5
UUID=83fce336-1f21-4690-9544-dc7dd988ea71 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
/dev/sdb1       /media/PORTABLE ext3    rw,nosuid,nodev,uhelper=hal,data=ordered

El Programa de Copia

casiano@mylaptop:~/bin$ cat -n someserverbackuptoportabledisk.pl
 1  #!/usr/bin/perl
 2  use strict;
 3  use Log::Log4perl qw{:easy};
 4
 5  my $ismounted = `mount 2>&1`;
 6
 7  # log file is in /home/casiano/backup.log
 8  Log::Log4perl::init('/home/casiano/bin/logconfig');
 9  my $log = Log::Log4perl->get_logger();
10
11  if ($ismounted =~ m{/media/PORTABLE}) {
12
13    my $agent = `keychain --eval --agents ssh 2>&1`;
14    $log->logdie("Error executing keychain") if $?;
15
16    $agent =~ m{SSH_AUTH_SOCK=([^;]+);};
17    $ENV{SSH_AUTH_SOCK} = $1;
18
19    $log->info("Executing ssh someserverbackup");
20    my $backupinfo = `rsync -ae ssh someserverbackup:/root/ /media/PORTABLE/someserver/root/ 2>&1`;
21    $log->info($backupinfo);
22
23    $backupinfo = `rsync -ae ssh someserverbackup:/home/ /media/PORTABLE/someserver/home/ 2>&1`;
24    $log->info($backupinfo);
25
26    exit($?);
27  }
28  $log->logdie("/media/PORTABLE not mounted\n");

La clave está protegida con una passphrase. Previamente se ha cargado un agente y se le ha dado la clave /home/casiano/.ssh/someserverbackupidentity que es la utilizada en las conexiones que efectúan las dos llamadas a rsync.

Configuraciones SSH en .ssh/config y /etc/sshd_config

Deberá existir una entrada como esta en el fichero ~/.ssh/config:

Host someserverbackup
HostName someserver
user root
IdentityFile /home/casiano/.ssh/someserverbackupidentity
BatchMode yes
la clave /home/casiano/.ssh/someserverbackupidentity ha sido publicada en someserver.

La máquina debe permitir el acceso al administrador vía SSH:

root@mylaptop:/etc/ssh# grep -i permitroot sshd_config
PermitRootLogin yes

El fichero de cron

casiano@mylaptop:~$ crontab -e
El fichero fué generado con kcron:

   # backup de someserver a las 14 y a las 0 horas en disco portable
   0 3,21 * * *    /home/casiano/bin/someserverbackuptoportabledisk.pl
   # This file was written by KCron. Copyright (c) 1999, Gary Meyer
   # Although KCron supports most crontab formats, use care when editing.
   # Note: Lines beginning with "#\" indicates a disabled task.

Comprobación de la Copia

Es necesario comprobar que las copias se están haciendo correctamente. En mi agenda pongo una tarea que consiste en comprobar la copia. En mi home en cada una de máquinas hay un fichero AUTOMATICBACKUPCHECKOUT que contiene la fecha. Si la copia de seguridad de dicho fichero contiene la fecha del día anterior, es señal de que el proceso copió el fichero. En el momento de comprobar la copia actualizo manualmente la fecha almacenada en dicho fichero. Este proceso es facilitado por el siguiente guión:

casiano@mylaptop:~/bin$ cat -n checkbackup
 1  #!/bin/bash
 2  for f in /backup/someserver/home/casiano/AUTOMATICBACKUPCHECKOUT \
             /media/PORTABLE/someserver/home/casiano/AUTOMATICBACKUPCHECKOUT;  do
 3    echo "Observe the date of $f:";
 4    ls -l $f;
 5
 6    echo "Contents of $f";
 7    echo "***************************************************************";
 8    cat $f;
 9    echo "***************************************************************";
10  done
11
12  echo "Now we are going to edit AUTOMATICBACKUPCHECKOUT and the backup log file,"
13  echo "press any key to continue and fill the file with today's date"
14
15  # Wait for key to be pressed
16  read -n 1
17  # Edit both remote and local files
18  vi -p scp://someserver/AUTOMATICBACKUPCHECKOUT /home/casiano/mylaptopbackup.log

En el caso de errores puede ser útil revisar el fichero de logs:

casiano@mylaptop:~$ cat backup.log
2009/05/06 15:53:42 INFO someserverbackuptoportabledisk.pl-19-main::: Executing ssh someserverbackup
2009/05/06 15:57:12 INFO someserverbackuptoportabledisk.pl-19-main::: Executing ssh someserverbackup

Casiano Rodriguez León 2015-01-07