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:
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:
-r, --recursive
Desciende recursivamente en los subdirectorios
-l, --links
Copia enlaces
-p, --perms
Preserva permisos
-t, --times
Preserva los tiempos
-g, --group
Preserva los grupos
-o, --owner
Preserva el propietarios (solo si es el root)
-D, --devices
Preserva los dispositivos (sólo si es el root)
-u, --update
permite saltarse aquellos ficheros que son mas recientes
en el receptor.
La opción -e
permite especificar que ssh
será utilizada.
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 2007Otro módulo es File::RsyncP, enteramente escrito en Perl.
Veamos como hacer una copia diaria de una máquina remota (someserver
)
a un disco USB externo en otra máquina mylaptop
.
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
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
.
Deberá existir una entrada como esta en el fichero ~/.ssh/config
:
Host someserverbackup HostName someserver user root IdentityFile /home/casiano/.ssh/someserverbackupidentity BatchMode yesla 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
casiano@mylaptop:~$ crontab -eEl 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.
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