BacksUps

Esta vez es sencilla. Llevo miradas muchas páginas en la red y no acabo de encontrar lo que busco. Quiero un script relativamente sencillo que se encargue de hacerme copias de seguridad de determinados directorios. La idea es que la copia no sea de todo el directorio cada día (o semana...) sino de lo modificado desde la última copia. También estaría bien, aunque esto ya es accesorio, que sacase los ficheros de dos direcctorios distintos y que cuando dos fuesen iguales se quedase solo con el más nuevo.
Si tienes alguna sugerencia ya me conmentarás, un cordial saludo.
Santiago

1 Respuesta

Respuesta
1
BackUp Incremental en Linux:
Vamos por partes. En primer lugar veamos como se programa un script sencillo de backup en Linux. Debemos disponer de un directorio donde ir guardando los backups, como por ejemplo /backup. Si no existe lo creamos. Luego, en el directorio /root por ejemplo, generamos el fichero backup. Sh (con un simple editor de texto, como "vi") con el siguiente contenido:
#!/bin/sh
cd /home/
/bin/tar -zcvf /backup/linux-backup.tgz midirectorio
Este script genera una copia comprimida del directorio /home/midirectorio y todo su contenido en /backup/linux-backup.tgz. Si el fichero /backup/linux-backup.tgz ya existe de backups anteriores, lo sobreescribiría sin pedir confirmación.
Una vez creado el script bash de backup, lo referenciamos en el cron, para que se ejecute todos los días, por ejemplo a las 23:30. Esto lo conseguimos editando el cron, mediante el comando "crontab -e" y añadiendo la siguiente línea:
30 23 * * * /root/backup.sh
Para que el script se ejecute, debemos asignarle los correspondientes permisos de ejecución:
chmod 700 /root/backup.sh
Así ya disponemos de un sistema básico de backup. Si además queremos que sólo grabe los ficheros modificados en las últimas 24 horas, debemos buscar un comando bash que efectúe esta selección previamente:
find /home/midirectorio/ -newer /backup/linux-backup.tgz
Veamos como funciona con un ejemplo:
Ls -la
-Rw-r--r-- 1 root root 74 Feb 6 23:00 file1.txt
-rw-r--r-- 1 root root 29 Feb 7 23:00 file2.txt
Tenemos dos ficheros. Uno ha sido actualizado a las 23:00 del día de hoy, 7 de Febrero de 2002. El backup se va a realizar a las 23:30, o sea, dentro de 30 minutos. El fichero file1.txt no se ha modificado desde hace más de 24 horas. La copia de seguridad actual, /backup/linux-backup.tgz es por tanto más reciente que el fichero file1.txt, por lo que éste no debe ser incluido en el nuevo backup. Pues bien, el resultado del find que hemos indicado anteriormente es el siguiente:
find /home/midirectorio/ -newer /backup/linux-backup.tgz
/home/midirectorio/
/home/midirectorio/file2.txt
Debemos excluir los directorios para que su posterior compresión no incluya los ficheros dentro de dichos directorios. Para realizar esta exclusión agregamos los parámetros "\! -type d" a find así:
find /home/midirectorio/ -newer /backup/linux-backup.tgz \! -type d
/home/midirectorio/file2.txt
Luego, comprobamos que efectivamente file1.txt no aparece en el listado. Ahora sólo queda indicar a tar que comprima sólo los ficheros que selecciona find. Esto se hace del siguiente modo:
Find /home/midirectorio/ -newer /backup/linux-backup.tgz \! -type d | xargs tar -zcvf /backup/linux-backup.tgz
Y para tener un backup incremental perfecto, ya sólo queda que el nombre del fichero de backup incluya la fecha y no sobrescriba al anterior. ¿Cómo se consigue esto?
mv /backup/linux-backup.tgz /backup/linux-backup-`date -I`.tgz
En fin, que podriamos generar el script de backup incremental definitivo de esta manera:
vi /root/backup.sh
#!/bin/sh
cd /home/
find /home/midirectorio/ -newer /backup/linux-backup-`date -I -d yesterday`.tgz \! -type d | xargs tar -zcvf /backup/linux-backup-`date -I`.tgz
Atención!, porque la primera vez que ejecutemos el script no habrá un fichero de backup del día anterior y dará error:
Find: /backup/linux-backup-2002-02-06.tgz: No such file or directory
Para evitarlo, creamos un falso fichero del siguiente modo (es un ajuste manual):
touch 02062330 /backup/linux-backup-2002-02-06.tgz
Nota: Esto sólo hay que hacerlo la primera vez. 02062330 significa mes 2, día 6, y 23:30 horas.
Este es el resultado final que obtenemos tras realizar el backup:
ls -la /backup/
-Rw-r--r-- 1 root root 0 Feb 6 23:30 linux-backup-2002-02-06. Tgz
-rw-r--r-- 1 root root 164 Feb 7 23:30 linux-backup-2002-02-07. Tgz
Perfecto!
Gracias nuevamente.
La idea es lo que andaba buscando. Supongo que lo sofisticaré un poquito más, pero es un punto de partida idea.
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas