Avisar de contenido inadecuado

Copias de seguridad en UBUNTU (crontab, rsync, dd)

{
}

Hoy abordaremos el tema de las copias de seguridad. El objetivo es montar dos tipos de copias, por una parte haremos backups de ficheros y directorios, esto nos permitirá poder restaurar archivos o directorios de manera individual. El otro tipo de copia nos permitirá recuperar nuestro sistema en caso de urgencia.

Backup de directorios y ficheros

Se trata de hacer un backup de todos los archivos de nuestro usuario. A demás, mantendremos un histórico de backups, haremos una copia diaria (lunes, martes, miércoles, etc .), cada lunes machacaremos la copia del lunes anterior y así con todos los días.

El procedimiento es sencillo, elegiremos los directorios y ficheros de los que queremos hacer el backup, y los copiaremos.

    cp -rp ~/banyut /media/sdb5/backup/domingo

Es totalmente funcional, pero la verdad es que no es eficiente, el problema está en que cada lunes nos hará una copia completa de todos los archivos que tenemos en el directorio, cuando lo que seria deseable es que solo copiara los modificados o los creados des del último backup.

No hay problema, tenemos otra instrucción que nos ofrece esta funcionalidad.

    rsync -altgvbp /home/banyut /media/sdb5/backup/domingo

Hoy no explicaré el comando rsync ni sus opciones, si alguien tiene alguna duda primero que consulte “man rsync” y después que pregunte.

Bueno, ya tenemos la instrucción que nos permite poder realizar nuestra copia. El siguiente paso es que estas se realicen de manera automática, para ello utilizaremos otra instrucción que nos ofrece el sistema crontab.

Crontab nos permite ejecutar aplicaciones en un momento determinado, una única vez o de manera recurrente. En un principio puede parecer algo liosa pero en realidad es muy fácil de usar.

    crontab -e

Esta instrucción nos permite editar el archivo /etc/crontab, en el que programaremos las instrucciones que queremos ejecutar.

Cada linea de este archivo esta formada por 7 columnas

  1. Minutos (de 0 a 59)
  2. Horas (de 0 a 23)

  3. Dia (de 1 a 31)

  4. Mes (de 1 a 12)

  5. Dia de la semana (de 0 a 7, donde 0 o 7 es domingo)

  6. usuario (opcional)

  7. orden a ejecutar

Un asterisco en cualquiera de las primeras 5 columnas indica todos, es decir si queremos que algo se ejecute todos los meses en la columna del mes podremos un asterisco.

En realidad es un poco mas complejo pero por el momento ya nos vale así.

Como funcionan estas columnas.

    5 * * * * se ejecutara el minuto 5 de cada hora todos los días.

    0 2 * * * a las 2:00H en punto cada día.

    0 2 * * 0 a las 2:00h todos los domingos del año.

    * 5 * * 1 todos los minutos de las 5:00 a 5:59 de todos los lunes.

    2 * 10 4 * el minuto dos de cada hora el dia 10 de abril de cada año.

    0 3 * * 6 a las 03:00 horas de todos los sábados

En cada una de estas columnas podemos poner más de un valor, o incluso un rango, esto se hace separando cada valor mediante una coma o un rango mediante un guión.

Así en la columna día de la semana podemos poner 1,3,5 que indicara que se ejecute los lunes, miércoles y viernes. O en la columna mes para indicar la primera quincena podemos poner 1-15.

Esto aún podemos complicarlo un pelín más, tenemos otra operación el símbolo “/”, que indica un incremento, por ejemplo, si en la columna minutos ponemos */15 se ejecutará cada 15 minutos, o si en la columna dias ponemos 1-10/2, se ejecutará los dias 1,3,5,7 y 9.

Por último un ejemplo más complejo.

    0 */2 1-15,23,28-31 * 0,6

Se ejecutara cada dos horas los días 1 al 15,el 23, 28, 29, 30 y 31 de todos los meses pero solo cuando sean sábado o domingo.

Ala, como se os ha quedado el cuerpo!!!!

 

Sabiendo esto, ahora podremos conseguir que nuestros backups se ejecuten de manera automática.

Después de teclear crontab -e añadiremos las siguientes lineas.

    0 1 * * 0 instrucción_lunes

    0 1 * * 1 instrucción_martes

    0 1 * * 2 instrucción_miercoles

    0 1 * * 3 instrucción_jueves

    0 1 * * 4 instrucción_viernes

    0 1 * * 5 instrucción_sabado

    0 1 * * 6 instrucción_domingo

Con esto conseguiremos que se ejecute cada día a las 01:00 horas las instrucciones indicadas. Podemos substituir “instrucción_******” por la orden rsync arriba descrita.

De todas formas lo haremos un pelín más completo, crearemos un script para cada día de la semana, además recogeremos un log.

Empezaremos creando los directorios necesarios.

    mkdir ~/.crono_bak

    cd ~/.crono_bak

 

Dentro del directorio que acabamos de crear, crearemos siete ficheros mas llamados lunes.sh, martes.sh, ..., domingo.sh y en su interior pondremos lo siguiente.

#!/bin/bash

pathLog="/media/sdb5/backup/logLunes.log"

echo ----------------------------------------------------------------------- >> $pathLog

echo ---INICI COPIA SEGURETAT LUNES >> $pathLog

date >> $pathLog

echo ----------------------------------------------------------------------- >> $pathLog

echo -- Iniciem Sincronització directori /home/monti >> $pathLog

rsync -altgvb /home/monti /media/sdb5/backup/sistema/lunes >> $pathLog

echo ----------------------------------------------------------------------- >> $pathLog

echo -- Sincronització Finalitzada >> $pathLog

date >> $pathLog

echo ----------------------------------------------------------------------- >> $pathLog

Este código es el que corresponde al script del lunes, para los otros seis haremos lo mismo pero substituyendo Lunes por el día de la semana concreto.

El script ejecuta la instrucción rsync, el resto de las lineas lo que hacen es generar un fichero log.

Una vez creados los siete ficheros, tendremos que darles permiso para poder ejecutarlos.

    chmod +x *.sh

Para que se ejecute todos los dias a la 1 de la mañana, nuestro crontab quedará así.

# m h dom mon dow command

0 1 * * 1 /home/banyut/.crono_back/lunes.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 2 /home/banyut/.crono_back/martes.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 3 /home/banyut/.crono_back/miercoles.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 4 /home/banyut/.crono_back/jueves.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 5 /home/banyut/.crono_back/viernes.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 6 /home/banyut/.crono_back/sabado.sh >>/media/sdb5/backup/logcrono.log

0 1 * * 0 /home/banyut/.crono_back/domingo.sh >>/media/sdb5/backup/logcrono.log

 

Por su puesto, la ruta /media/sdb5/backup/sistema/ tiene que existir y en su interior tiene que haber 7 directorios llamados lunes, martes, etc.

bueno, ya se que el script es muy mejorable y que se podria haber hecho con un solo fichero en vez que con siete, pero creo que para empezar ya esta bien así.

Para poder revisar nuestra programación ejecutaremos:

    crontab -l

He dado por hecho que el demonio cron esta activado, para comprobar esto podemos ejecutar.

    ps -ef | grep crontab

En caso que no este en marcha lo iniciaremos de la siguiente forma

    sudo /etc/init.d/cron start

Por último para ver si se ha ejecutado bien podemos mirar el log que hemos creado en /media/sdb5/backup/logcrono.log podemos mirar los logs del dia en concreto dentro de la carpeta /media/sdb5/backup/*****.log,tambien podemos ver cuando se ha ejecutado nuestro crontab consultando el log del systema.

    cat /var/log/syslog |grep crontab

Bueno, ya esta bien por hoy, mas tarde seguiremos con la segunda parte.

 

 

---

La inteligencia me persigue, pero ... yo soy más rapido 

{
}
{
}

Comentarios Copias de seguridad en UBUNTU (crontab, rsync, dd)

El domingo se puede representar como 0 ó 7.
El Lunes corresponde al numero 1, el martes al 2 ...
Alberto 29/06/2008 a las 13:22
exacto, es así.
necesito esto para backup de directorios en windows (seria un cliente remoto) al servidor de backup con rsync, como puedo abordar esto? Gracias
gueraike gueraike 22/07/2008 a las 16:26
Hola gueraike,
No acostumbro a dar soporte a entornos windows, creo que con lo que cobran por cada licencia bien pueden dar el servico técnico necesario.
De todas maneras la orden que he expuesto aquí pertenece al sistema operativo GNU linux, y desconozco si hay algun comando similar en windows. Lo que si sé, es que en el entorno de windows, existen multitud de herramientas   que realizan el trabajo que tu pides, si googleas un poco no tendras muchos problemas en encontrarlas.
De todas maneras facilmente puedes utilizar el backup que ofrecen todas las versiones de windows para hacer este trabajo. Hace tiempo implemente algo parecido a lo que pides mediante una VPN y el backup de windows.
suerte.
Banyut, gracias. Lo digo con toda emocion, es por gente que dedica su tiempo en ayudar a los demas que linux es lo que es...
Mursuli Mursuli 21/09/2008 a las 16:34
Banyut, ME ENCANTA, me has salvado la "vida" bueno, los datos. En serio, esto del software libre y de "sus gentes" es maravilloso.
Adonai106 09/01/2009 a las 16:42
Curioso has dicho lo mismo que dije yo hace tiempo y que precisamente fue lo que me apasiono y lo que aún me apasiona.
"esto del software libre y de "sus gentes" es maravilloso"
No podria estar mas de acuerdo con tigo.
saludos.
siguiendo el buen "rollito" y siguiendo una de las frases mas antiguas de la gente de software libre ("comparte el conocimiento") , intento poner un punto de ayuda a gueraike (perdon de antemano el no seguir el hilo linux/unix).
Queraike , así como en unix/linux esiste el cron , en windows estan las taeas programadas , mirate en panel de control , asi como en unix/linux se programa en uno de los shell , en windows se hace en batch (comandos que se escriben , mira en el web)
echale un vistazo a lo de las tareas programadas y a progrmacion batch , pero tambien te comento que las maquinas unix/linux pueden entenderse por samba , sería bueno que tambien mirases esto y quizas te animes a probar linux (hay "versiones de linux" que no necesitan ni ser instaladas , se llaman live-cd)
Repito: perdon por salirme un poco del tema , pero en este caso ,creo que merece explicarle no? ;-)
Uno_Mas Uno_Mas 26/02/2009 a las 15:04
Muchas gracias banyut. Esto está muy bueno y lo voy a adoptar.
Pero primero quería aclarar una duda:
En un momento decís: "Dentro del directorio que acabamos de crear, crearemos siete ficheros mas llamados lunes.sh, martes.sh, ..., domingo.sh....."
Y luego en el cron sugerís poner:
"...../home/banyut/.crono_back/dilluns.sh....."
Infiero que te referís a "/home/banyut/.crono_back/lunes.sh" y así con todos, no?
Aclaro esto porque más o menos entiendo catalán, pero la gente de mi tierra no y esto podría hacer que el sistema de backup propuesto no funcione (como te darás cuenta por mi forma de hablar soy de Buenos Aires, Argentina), y realmente sería una lástima porque está muy bueno.
Vuelvo a agradecerte, como el resto de los compañeros, tu dedicación a difundir tu conocimiento.
Javier
tiolucas tiolucas 01/03/2009 a las 04:09
Si Javier, tienes razón, ya lo he corregido.
Es el problema de las traducciones, a veces me cuesta distinguir entre las dos lenguas y si a eso le sumamos la costumbre, pues pasa lo que pasa.
gracias.
Hola Javier.
Hay algo muy curisoso que vi en tu post:
"rsync -altgvbp /home/banyut /media/sdb5/backup/domingo. Hoy no explicaré el comando rsync ni sus opciones, si alguien tiene alguna duda primero que consulte “man rsync” y después que pregunte. ".
umm, si has echado un vistazo al man de rsync (http://rsync.samba.org/ftp/rsync/rsync.html) te podras dar cuenta que utilizando "a", es como utilizar -rlptgoD junto
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)

En pocas palabras, no es necesario poner todo eso, redundas, haces lo mismo poniendo rsync -avb /home/banyut /media/sdb5/backup/domingo
Saludos ;)
Thiney Thiney 01/09/2009 a las 04:09
En primer lugar muchas gracias,
quizá me responda a mí mismo cuando lo aplique o quizá sea una perogrullada pero ¿Qué pasa si no enciendes el ordenador ese día? A mí por ejemplo me interesa una copia al mes pero si no lo enciendo el día exacto ¿se haría en cuanto lo encendiera? Saludos
angel angel 01/10/2009 a las 15:59
gueraike
No si he entendido bien, pero creo que el cliente está en windows y el servidor de copias en linux.
Si es así monta la unidad que quieres copiar en el servidor y ejecuta las órdenes como si estuvieras en local.
RaF RaF 26/10/2009 a las 13:38
tu lo que eres es tremendo mamaguevo
antoniot antoniot 05/03/2010 a las 22:26
Hola, lo he estado probando, pero me pasa una cosa muy rara, me hace copias incrementales, yo lo que quiero es que me haga copias completas todos los días, es posible esto?? gracias
diego diego 22/10/2010 a las 10:18
Diego, si te lees el articulo, en el tercer párafo, te indico como hacerlo para que no sea incremental, y comento las ventajas de no hacerlo así. simplemente se trata de sustituir el comando rsync por el cp.
Hola a todos.
Estoy tratando de montarme un sistema de copias de seguridad en mi servidor con Lubuntu y me han surgido una serie de dudas.
Para poner el ordenador en marcha creo que no habría problema programándolo desde la bios. Le pones que se encienda todos los dias a una hora determinada, y los dias que no quieras hacer la copia de seguridad (por ejemplo Sábados y Domingos) le pones con el mismo crontab que se apague unos pocos minutos después. El problema lo tengo cuando quiero que se apague solo, una vez ha terminado de realizar la copia de seguridad. Creo que sería arriesgado programar el apagado a una hora concreta, ya que puede que no haya terminado de copiar, o que le de demasiado tiempo y se quede el ordenador encendido inutilmente. ¿Hay alguna forma de programar el apagado una vez haya terminado de copiar? gracias por vuestra ayuda
Egrojyos Egrojyos 19/12/2010 a las 18:00
¿Bastaría con añadir una linea con el comando de apagado al final del fichero .sh?
Egrojyos Egrojyos 19/12/2010 a las 18:11
Saludos Banyut, tu post esta excelente. No si podrias ayudarme con lo siguiente
Estoy trabajando con dos computadoras, una linux debian y la otra windows xp, resulta que en la maquina linux tengo cierta informacion la cual hago backup manual diariamente hacia la maquina windows (las dos maquinas estan en red), pero ahora quiero hacerla el backup de forma automatica a cierta hora del dia.  Como podria hacer para copiar la informacion en la pc windows de forma automatica? que me recomendarias?

Gracias y espero tu amable respuesta 
Daniel Daniel 23/04/2011 a las 02:53
exelente, funciona de maravilla, muy buen aporte, gracias
elgogryn elgogryn 14/07/2011 a las 16:02
y como hago uno diario es decir sin que sobreescriba.. tengo nocion que es con una concatenacion pero no se como
aydee aydee 20/10/2011 a las 17:26
Hola, necesito ver si me puedes ayudar con mi problema. Tengo varios servers linux ubuntu, para ser mas preciso, uno de archivos y otro de base de datos y un tercero que quiero que sea solo de backup sobre los otros 2. Los 3 montados sobre una misma red. Nunca hice algo asi, solo hice backup en un mismo equipo montando discos.
Las base de datos son postgresql y como dije anteriormente el otro es servidor de archivos samba.
Como puedo crear una rutina de backup desde ese equipo sobre los otros 2 y que sea diferencial.
Abrazo a la distancia. 
Daniel Diaz Daniel Diaz 11/04/2012 a las 02:48
Gracias Banyut por tan buena explicacion y acada uno que brindo sus aportes, yo no soy experto en este ambiente pero necesito de su apoyo para realizar de sus tareas, y eso es muy valioso no he visto la segunda parte y me gustaria tenerla.
Athus Athus 08/06/2012 a las 00:56
Excelente, la verdad que me funciona de maravillas, una cosita nomas que queria agregarle como deberia hacer si quiero comprimir esos archivos. (me queda poco espacio en el disco :)
David David 21/06/2012 a las 15:19
Buen día, ve vino genial tu aporte!!
Lo implementé para todos los días. Uso un fileserver Turnkey (Debian squeeze).
Lo único que cuando programé los cron, no se ejecutan en la hora fijada, solo salen errores en el cron.log.
(CRON) error (grandchild #14402 failed with exit status 1)
Alguna idea que pudo fallar.? Está programado todos los días a las 04:00 en una carpeta remota montada en el dir /media/puesto09.
Por otro lado vi que se le puede agregar el parámetro z al rsync para que comprima los datos sobre la transmisión y disminuye le tráfico de red.
Espero tu ayuda y nuevamente gracias.
Marianof
Marianof Marianof 18/10/2012 a las 14:51

Deja tu comentario Copias de seguridad en UBUNTU (crontab, rsync, dd)

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar Tu nombre