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 2007
Otro 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
