Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Proyectos


Nuevo tema Responder al tema
 [ 10 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Jul 04, 2004 11:00 pm
Mensajes: 1672
Ubicación: México, Distrito Federal

Nota Publicado: Dom Feb 01, 2009 10:12 am 
Arriba  
Hice un script para respaldar la información que tengo en mi computadora, lo que hace es lo siguiente:

1. Hace respaldos incrementales de los directorios que se le indican.
2. Los respaldos son del tipo instantáneas (snapshots).
3. Muy sencillo de respaldar y recuperar directorios.

Los respaldos de tipo instantáneas son muy útiles, ya que puedo ver todos los archivos de un directorio y decidir los que me hacen falta, pudiendo navegar por ellos dependiendo de la periodicidad del respaldo.

El que sean incrementales es útil ya que se ahorra espacio solo copiando aquellos archivos nuevos o que tuvieron cambios.

Ahora bien, no importa que un archivo no haya tenido cambios, este aparecerá en cada instantánea que se haya tomado del directorio donde se encontraba, pero solo ocupara espacio como un archivo, esto se logra creando vínculos fuertes o duros al archivo, es decir se encuentra en todas las instantáneas pero solo ocupa un espacio.

Esto da la facilidad que se pueden hacer respaldos cada hora si se desea, si solo se modificó un archivo de 100Kb solo se ocupará el espacio de 100kb, pero para nosotros será como si tuviéramos un nuevo respaldo con todos nuestros archivos.

Si hasta aquí estás convencido, entonces te puedo contar porque hice este script.

Desde hace algún tiempo hago respaldos de los directorios más importantes de mi equipo a otro disco duro de mi mismo equipo, y tiene algún tiempo que lo hago a un NAS que configuré, el problema que me encontré con mi tipo de respaldos es que si solo necesito un archivo, tengo que obtener todo el respaldo, y una vez que lo obtengo saco el archivo, otro problema es que como no son respaldos incrementales, ocupo mucho espacio en cada respaldo y no puedo tener muchos.

Cuando leí de unos nuevos programas para respaldar como son backintime, flyback o timevault; los cuales se encuentran inspirados en el sistema de respaldos de MAC OS X llamado Time Machine. Pensé que podía ser una buena oportunidad para cambiar mi sistema de respaldos.

Probé con el que sonaba que tenía más movimiento, en este caso el backintime, pero lo que no me gustó fue que al menos el que yo probé, si yo hacía un pequeño cambio en un archivo volvía a sacar un respaldo completo de todo mi directorio o directorios que estaba respaldando. En un principio pensé que a lo mejor algo estaba haciendo mal, pero buscando un poco en los foros del programa leí algo como lo siguiente: "si solo modifico un mb de información, ¿porqué se tiene que respaldar todo el directorio de nuevo?". Según comentaban este era un comportamiento similar en Time Machine.

Por esta razón busqué alguna herramienta que hiciera algo similar a lo que necesitaba, en mi búsqueda encontré un programa muy sencillo llamado rdiff-backup, este hace un respaldo del directorio que se le indica y va haciendo respaldos incrementales del mismo con la periodicidad que se necesite, pero tiene un gram problema, recuperar o inclusive revisar si un archivo de una determinada fecha tiene una modificación se vuelve bastante engorroso, uno tiene que navegar mediante la línea de comandos, e inclusive ir sacando del respaldo archivo por archivo lo que uno va necesitando, sin saber a ciencia cierta si el archivo es o no es lo que uno necesita.

Sistemas como rdiff-backup se basan en el hecho de que si yo hago un respaldo de un directorio, lo más seguro es que si recupero voy a saber de que día necesito recuperar el archivo, y de que muy seguramente voy a necesitar el respaldo completo. Este principio era muy válido en tiempos anteriores donde uno corría procesos diarios semanales y quincenales, y sabía la fecha del último proceso válido, pero en las épocas actuales uno no sabe en que fecha modificó un archivo y si en realidad es el que necesita, además de que a lo mejor solo se necesita un archivo de un respaldo de varios gigabytes de información.

La idea de tomar instantáneas me había agradado y me parecía la mejor forma de resolver mi problema, por lo que investigando un poco más, ubiqué una serie de páginas que me indicaban como hacer respaldos incrementales rotativos "Mejorando mi estrategia de copias de seguridad" y "Easy automated snapshot-style backups"; los que me dieron las bases para completar un script que cumpliera lo que necesitaba para mis respaldos.

Que es lo que hace el script:

1. Realiza respaldos de los directorios que se le indican.
2. Los deja donde uno le diga
3. Puedo navegar entre los archivos de cada respaldo que a mis ojos es como si tuviera todos los archivos del directorio con la misma estructura del directorio original.
4. Recupero el archivo que necesito con un simple copiar y pegar.
5. Los respaldos son incrementales, es decir no me genera más espacio por archivos que no se hayan modificado.
6. Me indica la fecha y hora de los respaldos.
7. Decido el tiempo que deseo conservar los respaldos, ya sea en días o borrándolos de forma manual.

El script en bash es como sigue:


Citar:
#!/bin/bash
#
# Programa para realizar respaldos de un directorio, la ventaja es que hace
# un respaldo del tipo instantánea (snapshot) donde en cada dia el usuario
# puede encontrar todos los archivos tal y como se encontraban al momento
# en que se hizo el respaldo.
#
# Además para el usuario es como si se hubieran respaldado todos los
# archivos, pero en realidad solo se respaldan los cambios, creándose
# enlaces duros a los archivos existentes.
#
# Se recibe como parametro el directorio para dejar los respaldos.
#
# Los respaldos se dejan en un directorio que indica la fecha y hora
# del respaldo, de esa forma queda más fácil navegar por ellos.
#
# Los respaldos conservan integra la estructura y permisos del directorio
# que respaldan.
#
# ****VARIABLES IMPORTANTES****
#
# $1 - Parametro que indica el directorio donde van todos los respaldos
# $2 - Parametro que nos dice el numero de dias que se conservan los respaldos
# $fecha - Fecha del respaldo y nombre del directorio donde se va a
# guardar el respaldo actual
# directorios - Archivo que tiene los directorios que se van a respaldar
# $directorio - Directorio que se está respaldando
#
# 29 de enero del 2009
# Destructor

# Obtiene fecha y hora de respaldo
fecha="$(date "+%Y-%m-%d-%H:%M:%S-%A")"
echo
echo "============================================================"
echo "Fecha y hora del respaldo $fecha"

# Borra respaldos mayores al numero de dias que se especifiquen
echo
echo "============================================================"
echo "Respaldos borrados"
find $1 -maxdepth 1 -name '2*' -mtime +$2 -print -exec rm -rf {} \;

# Obtiene el directorio de respaldo más reciente
for archivo in $(ls -t $1 --group-directories-first)
do
echo "El respaldo anterior se encuentra en $archivo"

# Respalda cada uno de los directorios indicados en el
# archivo de respaldo llamado directorios
for directorio in $(cat $1/directorios)
do
echo
echo "**************************************************************"
echo "Respaldando el directorio $directorio"

# Crea directorio para respaldar
mkdir -p $1/$fecha$directorio
rsync -av --delete --link-dest=$1/$archivo$directorio/ $directorio/ $1/$fecha$directorio/
done
echo
echo "///////////////RESPALDO CONCLUIDO//////////////////"
exit 0
done



Para usarlo es muy sencillo, solo se debe hacer lo siguiente:

1. ¿Donde voy a guardar los respaldos?

Con tener un directorio en mi equipo, en un disco duro externo, o en otro equipo con espacio para lo que necesito debe ser suficiente, digamos que el directorio donde voy a guardar los respaldos se llama: /mnt/Multimedia/Respaldos.

2. ¿Qué directorios voy a respaldar?

Dentro del directorio donde voy a guardar los respaldos se debe crear un archivo con nombre "directorios" que por cada línea indique los directorios que se van a respaldar, más o menos como sigue:

Citar:
/home/rponcedeleon/Documentos
/mnt/Imagenes/Portables
/mnt/Imagenes/Proyectos


Tener cuidado de no colocar la diagonal final en los directorios que se van a respaldar.

3. Copiar el script que se encuentra en las líneas superiores y darle permisos de ejecución, yo le puse por nombre respaldo.sh, pero en realidad puede ser el que se quiera.

4. Decidir los dias que se necesitan guardar los respaldos.

Ahora ya se puede ejecutar el script, podemos probarlo con una ejecución directa desde el directorio donde hayamos guardado el script, por ejemplo:

Citar:
sh respaldo.sh /mnt/Multimedia/Respaldos 30


Con esto le estamos indicando que queremos hacer un respaldo de los directorios que se encuentran en el archivo directorios que debimos haber guardado en /mnt/Multimedia/Respaldos, y que solo queremos conservar 30 días de respaldos.

Al ejecutar el script podemos observar que nos indica la fecha del respaldo, si existe algún respaldo anterior, los respaldos que borró, y los archivos que respaldó; en este caso por ser nuestro primer respaldo nos va a dar mucha información y se va a tardar bastante, los siguientes respaldos serán más breves.

El script nos debe entregar una salida, similar a esta:

Citar:
============================================================
Respaldos borrados

============================================================
Fecha y hora del respaldo 2009-01-31-23:39:22-sábado
El respaldo anterior se encuentra en 2009-01-31-20:19:28-sábado

**************************************************************
Respaldando el directorio /home/rponcedeleon/Documentos
sending incremental file list
./
CIC/Programas/
CIC/Programas/respaldo.sh

sent 83531 bytes received 365 bytes 167792.00 bytes/sec
total size is 1040765788 speedup is 12405.43

**************************************************************
Respaldando el directorio /mnt/Imagenes/Portables
sending incremental file list
./

sent 1176 bytes received 19 bytes 2390.00 bytes/sec
total size is 491212357 speedup is 411056.37

**************************************************************
Respaldando el directorio /mnt/Imagenes/Proyectos
sending incremental file list
./

sent 51036 bytes received 329 bytes 34243.33 bytes/sec
total size is 3357108911 speedup is 65357.91


Ahora, si vamos al directorio /mnt/Multimedia/Respaldos, podemos observar que tenemos un nuevo directorio de tipo 2009-01-30-13:28:02-viernes, que tiene el respaldo de los directorios que le indicamos, tal cual la estructura de los directorios originales, y conservando los permisos originales, vínculos, archivos ocultos, es decir todo.

Si volvemos a ejecutar el script, observaremos que ahora la información es menor, sino cambiamos nada solo serán mensajes de avisos, y si volvemos a navegar en nuestro directorio de respaldos a lo mejor veremos un nuevo directorio como el que sigue 2009-01-30-13:40:02-viernes.

Es decir, tenemos dos directorios de respaldo, y si navegamos en él, tenemos todos los archivos de nuestros directorios; es decir tenemos dos instantáneas de respaldos, pero si observamos el espacio en disco, los archivos no están duplicados.

Esta es la maravilla, solo respalda los archivos modificados o nuevos, pero podremos navegar por nuestros respaldos con la ayuda de nuestro navegador favorito, de hecho el directorio de respaldos pudiera lucir como sigue:

http://2.bp.blogspot.com/_Fc7nwg1NfYU/S ... pshot1.png

Aquí se observa como con la ayuda de mi navegador (konqueror) busco entre los diferentes respaldos que conservo para ubicar un archivo, lo interesante de esto es que no se duplica espacio en disco y sigo conservando la facilidad de buscar en cuantos respaldos necesite, de una forma sencilla, sin aprender una nueva interfaz y si quiero puedo tener muchos respaldos al día.

Para mayor facilidad puede ser conveniente que la salida del script la mandemos a un archivo de bitácora donde puedo ver con más calma lo que pasó durante su ejecución, esto lo puedo lograr con una línea como la que sigue:

Citar:
sh respaldo.sh /mnt/Multimedia/Respaldos 30 >> /home/rponcedeleon/respaldo.log


Con los dos ">>" le indico que la salida del script se vaya a un archivo respaldo.log que se encuentra en /home/rponcedeleon, que si el archivo no existe lo crea, y si existe le agrega más líneas.

Para dejar sus respaldos que se ejecuten cuantas veces necesiten lo pueden incluir en cron, o en anacron.

En mi caso yo lo incluí al arranque de mi sesión, entonces antes de hacer algo, lo primero que hace mi sistema es respaldar cualquier cosa que pude haber hecho en mi sesión anterior.

Por la forma en que se encuentra el script puedo respaldar diferentes directorios con diferentes criterios; a lo mejor algunos necesito hacer un respaldo a la semana, o cada tercer día; o conservar solo una semana de respaldos o un mes; solo debo correr el script con parámetros diferentes.

Por otro lado no existe problema en quitar o agregar directorios al respaldo, desde el momento que lo hagamos podremos apreciar el cambio en el respaldo correspondiente, ya que el script respeta la estructura de directorios que se le indique.

Esperando que este script les sea tan útil como a mi, me despido.

_________________
Reglamento del foro | Temas más preguntados | Mi blog | Debian Tes

 Perfil  

Desconectado
Administrador
Administrador
Avatar de Usuario

Registrado: Mié Dic 31, 1969 6:00 pm
Mensajes: 3237
Ubicación: León, Guanajuato; México.

Nota Publicado: Lun Feb 02, 2009 12:39 pm 
Arriba  
Muy bien, Destructor. Buen trabajo.

Considera pubicar este script y pequeño tutorial de uso en la sección manuales linux, sería más facil de encontrar y consultar.

http://manuales.espaciolinux.com/colabo ... ales-linux

Un saludo.

_________________
No hay nada que agradecer. Hago, lo tengo que hacer.
Reglamento del foro | Temas más preguntados | Blog personal | Twitter: @pacorevilla

 Perfil WWW ICQ  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Jul 04, 2004 11:00 pm
Mensajes: 1672
Ubicación: México, Distrito Federal

Nota Publicado: Lun Feb 02, 2009 3:14 pm 
Arriba  
ok, gracias ya lo envié para su publicación.

_________________
Reglamento del foro | Temas más preguntados | Mi blog | Debian Tes

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Mié May 04, 2005 11:00 pm
Mensajes: 353
Ubicación: Bogotá

Nota Publicado: Lun Feb 02, 2009 5:32 pm 
Arriba  
Que buen script, gracias por el aporte.
Lo unico que cambiara, seria - En vez de crear otro archivo con los directorios, haria una variable.

Por ejemplo:
Código:
BACKUP="/home/pratt/1 hombre/pratt/2 /home/pratt/3 /home/pratt/5"

for directorio in $BACKUP; do
    echo "Estoy respaldando $directorio"
done


Felicitaciones Destructor!

Depronto me animo a publicar mi script de respaldo que hize a punta de 'dialog' :)

_________________
Mi Foro: http://www.hablarmierda.net
Mi Blog: http://www.michael-pratt.com/blog
Mis Distros: Slackware (Current)| Archlinux

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Jul 04, 2004 11:00 pm
Mensajes: 1672
Ubicación: México, Distrito Federal

Nota Publicado: Lun Feb 02, 2009 5:43 pm 
Arriba  
Gracias por el comentario Pratt, lo hice de esa forma para que no se tuviera necesidad de cambiar el script si se deseaban cambiar los directorios de respaldo, de esta forma se puede hacer una interfase gráfica que solo ejecutara el script y pidiera el resto de los parámetros sin modificar la programación.

Por otro lado respecto a tu script de respaldo, publícalo, siempre es bueno compartir las ideas.

Saludos

_________________
Reglamento del foro | Temas más preguntados | Mi blog | Debian Tes

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mar Jul 19, 2005 11:00 pm
Mensajes: 3752
Ubicación: /home/Peru/Lima/La Molina

Nota Publicado: Mié Feb 04, 2009 9:33 am 
Arriba  
Destructor, buen aporte, me gustaria pedirte permiso para poder publicarlo en mi blog.

Mas bien quiero hacerte la consulta siguiente:
si son backups incrementales, como harias para eliminar los que ya se ha backupeado, para no ocupar espacio en disco, ya que no es tanto meter un "rm -rf" y listo.

Saludos

_________________
"Quiero cambiar al mundo pero no me dan los RPM"
----------------------------
Tony Blair
Linux User # 433253
Ubuntu User # 9562
-----------------------------

 Perfil Email WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Jul 04, 2004 11:00 pm
Mensajes: 1672
Ubicación: México, Distrito Federal

Nota Publicado: Mié Feb 04, 2009 12:47 pm 
Arriba  
Citar:
Destructor, buen aporte, me gustaria pedirte permiso para poder publicarlo en mi blog.


Hola Kde_Tony, respecto a lo de publicarlo en tu blog, por supuesto, no hay problema.

Citar:
si son backups incrementales, como harias para eliminar los que ya se ha backupeado, para no ocupar espacio en disco, ya que no es tanto meter un "rm -rf" y listo.


Pues si, como lo que se generan son apuntadores, enlaces duros o hard links, con un simple
Citar:
find $1 -maxdepth 1 -name '2*' -mtime +$2 -print -exec rm -rf {} \;

Se borran los enlaces, hasta que ya no queda ninguno, eso si el script asume que no se estan guardando otros archivos en el directorio, ya que borra los que empiecen con 2, o sea que el script va a tener el problema del milenio, pero del 3000, espero que no dure tanto.

En estos artículos explica de forma completa la teoría, en ambos me basé para hacer el script:

“Mejorando mi estrategia de copias de seguridad”
“Easy automated snapshot-style backups“

_________________
Reglamento del foro | Temas más preguntados | Mi blog | Debian Tes

 Perfil  

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Lun May 30, 2005 11:00 pm
Mensajes: 61
Ubicación: Mèxico D.F.

Nota Publicado: Lun Abr 12, 2010 2:48 pm 
Arriba  
Que tal destructor, solo aqui para saludar y preguntar si quisiera respaldar en un NAS que tendria que hacer, e visto varios scripts y de hecho e trabajado con Backuppc y bacula y en ninguno e encontrado la forma de apuntar hacia el Nas no se si tu sepas como puedo hacerlo. Gracias y Saludos a toda la family

 Perfil  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Jul 04, 2004 11:00 pm
Mensajes: 1672
Ubicación: México, Distrito Federal

Nota Publicado: Lun Abr 12, 2010 5:35 pm 
Arriba  
Que tal slayer_666, ¿de nuevo en Linux?

No sé si se trate de un NAS corporativo, yo he trabajado con NAS basados en Linux, casi todos lo son, y casi todos tienen el servidor NFS; checa esos puntos, de ser así, montas con la IP del NAS el directorio del NAS como un directorio local, y ya está, no tendrías que ser nada más, para el equipo que lo use es como un directorio de su máquina.

Saludos a la familia

_________________
Reglamento del foro | Temas más preguntados | Mi blog | Debian Tes

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Sab Oct 15, 2005 11:00 pm
Mensajes: 243
Ubicación: Venezuela

Nota Publicado: Vie Jul 16, 2010 10:14 am 
Arriba  
Se que este post tiene tiempo, pero no podia dejar de pasar la oportunidad para felicitarte por tan excelente Script!!! Me gustaría probarlo en mi casa, pero me tocara inventar mas porque los desktops tienen Win7 y tengo un pequeño servidor con Debian 5.0 y un disco de 1.5Tb, me imagino que mapeando los directorios de Win, no debria tener problema. Lo vuelvo a felicitar amigo, por compartir esta información tan util.

_________________
- Linux Users #401352
- Desktop01: AMD Athlon 64 2.0Ghz, RAM 2Gb., ATI X1650 Pro 512Mb, HD 320Gb WD w/Win7Ult.
- Server01: Pentium III 933Mhz, RAM 1Gb, TNT2 32Mb, HD 40Gb y 1.5TbGb Seagate w/Debian Etch
- Portatil01: AMD Turionx2 1.9Ghz, RAM 3Gb., NVidia 6100M 763Mb, HD 160Gb Seagate w/Win7Ult.
- Celular: Motorola Milestone, Android 2.1 update w/Root, OC a 800Mhz, cache en /dalvik-cache

 Perfil Email  
Mostrar mensajes previos:  Ordenar por  
 [ 10 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO