Você está na página 1de 14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

#!/bin/bash
bash bits/random hacks

viernes, 20 de febrero de 2009

De como hacer buenos backups usando un simple script(o KISS bakcup)


Supongamos un server recin instalado, llev horas configurarlo, dejarlo afinado como un violn, pero cuando creemos haber terminado an hay como una sensacin, algo que no est bien, pero... que ser? "Puede fallar" deca Tusam, y todos comprobamos la verdad de estas sabias palabras alguna vez en la vida. Pero...qu pude fallar? short answer: " todo puede fallar" Lo bueno es que muchas de las cosas son reemplazables, mother, memorias, fuentes, discos se consiguen a buen precio hoy, pero que hay de las horas de configuracin?, los datos acumulados?, los emails?, las bases de datos? La posibilidad de que esa informacin valiosa se pierdan siempre ha sido un itch to scratch. -Indice 1- Objetivos 2- Requisitos 3- Desarrollo 3.1- Configuracin 3.2- Setup inicial 3.3- Creando el backup 3.4- A prueba de errores 3.5- Mirror remoto 3.6- Check final 3.7- El script completo(backup.sh) 4- Invocando el script desde crontab
bourneagainshell.blogspot.mx/2009/02/to-backup.html 1/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

5- Ejemplo de salida 6- Conclusin 1- Objetivos Hacer un script de backup que sea tan simple de usar como poner una linea en cron permita backup versionado en el tiempo optimice el espacio de los backups pueda hacer mirror remoto de los mismos borre automaticamente los viejos para hacer espacio a los nuevos salga limpiamente de los errores que se puedan producir y garantice la integridad avise a alguien del error enviandole un detalle del fallo que mientras funcione bien sea silencioso y pase desapercibido 2- Requisitos bash tar lftp 3- Desarrollo Tener un itch to scratch nunca es garanta de que llegar el scratch, ah es cuando el cliente exijente aparece y de alguna manera fuerza y/o financia el scratch: cliente- muy bueno como qued todo, ahora tengo una pregunta, de esto hay backup? geek- eh... s, naturalmente, como no va a haber backup! Todo comenz con un simple script para salir del paso, y a medida que pasaron los aos las necesidades de backup se volvieron cada vez ms complejas. Varios checkpoints en el tiempo, mirror remoto, aviso en caso de fallos, backups incremental fueron algunas de las exigencias, y el pequeo script fue creciendo y evolucionando cada vez ms.

3.1- Configuracin

La primera parte del script est dedicada la configuracin, esto es lo que da al script flexibilidad.
bourneagainshell.blogspot.mx/2009/02/to-backup.html 2/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

Lo primero es elegir el directorio en donde se van a guardar los backups, la ventaja de esto es que ese directorio puede caer en un disco diferente al principal, o incluso puede ser una unidad de red montada via smbfs o nfs por ejemplo.
view plain print ?

0 1 . 0 2 . 0 3 .

# ! / b i n / b a s h #d i r e c t o r i od o n d ev a nap a r a rl o sb a c k u p s b a c k u p _ d i r = " / b a c k u p "

Luego viene la parte de remote mirror de los bakcups, el script usa ftp para mantener en syncro el directorio de backups local con el remoto. Si dejamos en blanco estas variables el script realiza solo el backup en el directorio local.
view plain print ?

0 1 . 0 2 . 0 3 . 0 4 .

#d a t o sf t p ,s ie s t ne nb l a n c oe lb a c k u pe ss l ol o c a l f t p _ h o s t = 1 0 . 0 . 0 . 1 f t p _ u s e r = b a c k u p f t p _ p a s s = * * * * * *

La siguiente variable nos pide el nombre de un usuario o un email al cual enviar un aviso en caso de que el script falle en alguno de sus pasos.
view plain print ?

0 1 . 0 2 .

#m a i lad o n d ea v i s a rs ia l g os a l em a l ,p u e d es e ru nu s u a r i od e ls i s t e m a m a i l _ f o r _ e r r o r s = " r o o t "

backup_days representa el numero de das de los cuales vamos a tener backups, a mayor cantidad de das, ms espacio en disco necesitaremos.
view plain print ?

0 1 . 0 2 .

#t i e m p oe nd i a sq u ec o n s e r v ac o p i ad el o sb a c k u p s b a c k u p _ d a y s = 1 5

A continuacin configuramos que cosas vamos a incluir y excluir dentro del bakcup. En un backup completo tradicional incluiremos el directorio raiz "/" y excluiremos cosas como /tmp,/proc y /sys entre otros. Hay que acordarse de excluir cualquier directorio que contenga mucha informacin que pueda inflar innecesariamente los backups, por ejemplo el cache de squid o el fuente de un kernel en /usr/src, en fin,cosas que no vale la pena tener por duplicado. Obviamente se excluye el $backup_dir para no crear una
bourneagainshell.blogspot.mx/2009/02/to-backup.html 3/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

recursividad tratando de backupear el propio directorio de backups.


view plain print ?

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 .

e x c l u d e = $ ( m k t e m p ) i n c l u d e = $ ( m k t e m p ) c a t>$ i n c l u d e< < E O F / E O F c a t>$ e x c l u d e< < E O F / t m p / * / s y s / * / p r o c / * / v a r / s p o o l / s q u i d / * $ b a c k u p _ d i r E O F

Despus de esto comienza realmente el script, as que llegamos a la linea divisoria, si ests buscando una solucin Copy and Paste, pods saltar todo esto y descargar el script completo
3.2- Setup inicial

Voy a explicar la solucin paso a paso, en el orden de ejecucin. Para esto me voy a tomar la libertad de explicar las funciones cuando son llamadas y no en el orden en que aparecen en el script original. Comenzamos creando un logfile donde redireccionar la stderr de los programas que usamos a lo largo del script, para poder recopilar los errores de los mismos y despues enviarlos por mail. Tambin creamos un directorio .tar, dentro de nuestro directorio de bakcups. Este directorio lo usaremos para guardar el archivo para backups incremental y unos lock que me aseguraran de que el script pueda recuperarse de un fallo.
view plain print ?

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 .

#S c r i p t sB e g i n sH e r e l o g f i l e = $ ( m k t e m p ) i n c _ d i r = " $ { b a c k u p _ d i r } / . t a r " i n c _ f i l e = " $ { i n c _ d i r } / i n c r e m e n t a l . i n f o " [d" $ b a c k u p _ d i r "]| |m k d i rp" $ b a c k u p _ d i r " [d" $ i n c _ d i r "]| |m k d i rp" $ i n c _ d i r "

El poximo paso es borrar los backups que ya son viejos segun $backup_days
view plain print ?

0 1 . 0 2 .

#b o r r ol o sb a c k u p sv e n c i d o s f i n d$ b a c k u p _ d i rn a m e" b a c k u p $ ( h o s t n a m e ) * "c t i m e+ $ b a c k u p _ d a y sat y p efe x e cr mf{ }\ ;

bourneagainshell.blogspot.mx/2009/02/to-backup.html

4/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

En esta linea hago la primera comprobacin de error. Cuando comienzo a crear un backup completo, creo un archivo .lock, que se borrar al final si todo sale exitosamente. Pero si algo falla, entonces el archivo .lock permanece creado hasta la prxima ejecucin del script. Si encuentro ese archivo es porque algo salo mal y s que debo hacer nuevamente el backup completo (full).
view plain print ?

0 1 . 0 2 .

#s ie n c u e n t r o. l o c ke sp o r q u ef a l l oe lf u l lb a c k u p ,b o r r oi n c _ f i l ep a r aq u es eh a g ad en u e v o [f" $ { i n c _ f i l e } . l o c k "af" $ i n c _ f i l e "]& &r mf" $ i n c _ f i l e "

El script maneja dos tipos de backup, full e incremental. El backup full se realiza una vez a la semana, y es un backup de tar autocontenido, que contiene toda la informacin necesaria para ser usado y extraido en cualquier lugar. El backup incremental se realiza a diario, y se usa como referencia siempre el ltimo backup full. Esto quiere decir que el lunes se realiza un backup incremental teniendo en cuenta el ltimo backup full que es el del domingo. Y si quiciera restaurar el sistema al da lunes debera primero extraer el backup full del domingo y luego arriba de ese usar el del lunes. Los backups incrementales son independientes, esto quiere decir que estn siempre hechos contra el ltimo backup full, por lo que si tengo un backup incremental del viernes y quiero restaurar el sistema a ese da, entonces slo necesito el ltimo backup full (domingo) ms el incremental del viernes. Esto est hecho as para asegurar la efectividad de los backups, ya que si para poder recuperar el viernes dependiera de que el lunes, martes, mircoles y jueves se hayan realizado con xito estoy siendo muy optimista por default. Cada backup tiene su nombre, que incluye el hostname, indica si es full o incremental y la fecha a la cual corresponde. En el caso de los incrementales se usa unicamente el da de la semana para que se vayan pisando con los anteriores y as tener slo la ltima semana en formato incremental.
view plain print ?

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 .

# s e t u pf u l lo ri n c r e m e n t a l i f[$ ( d a t e+ % u )e q7o!f" $ i n c _ f i l e "] ; t h e n # b a c k u p f u l l b a c k u p _ n a m e = " $ { b a c k u p _ d i r } / b a c k u p $ ( h o s t n a m e ) f u l l $ ( d a t e+ % Y % m % d ) . t a r . g z " # b o r r oi n c _ f i l ep a r aq u ee lb a c k u ps e af u l l [f" $ i n c _ f i l e "]& &r mf" $ i n c _ f i l e " t o u c h" $ { i n c _ f i l e } . l o c k "
5/14

bourneagainshell.blogspot.mx/2009/02/to-backup.html

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 .

e l s e # b a c k u p i n c b a c k u p _ n a m e = " $ { b a c k u p _ d i r } / b a c k u p $ ( h o s t n a m e ) i n c $ ( d a t e+ % A ) . t a r . g z " c p$ i n c _ f i l e$ { i n c _ f i l e } . t e m p i n c _ f i l e = $ { i n c _ f i l e } . t e m p f i

3.3- Creando el backup

Finalmente una vez que todo est listo, hago el backup


view plain print ?

0 1 . 0 2 .

# f i n a l l y ,d ot h eb a c k u p t a r m e" $ i n c _ f i l e "" $ b a c k u p _ n a m e "

tarme es una funcin, veamosla en detalle, lo que hace es invocar a tar con ciertos parmetros especiales, como que archivos incluir y excluir del backup, que preserve owners y permisos o que enve stderr a logfile.
view plain print ?

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 .

t a r m e ( ){ l o c a li n c _ f i l e = $ 1f i l e = $ 2 t a rl i s t e d i n c r e m e n t a l = " $ i n c _ f i l e "\ f i l e s f r o m = " $ i n c l u d e "\ e x c l u d e f r o m = " $ e x c l u d e "\ i g n o r e f a i l e d r e a d\ a b s o l u t e n a m e s\ z p c f" $ f i l e " 2 > $ l o g f i l e| |d o _ e x i t" t a r "$ ?$ f i l e } r e t u r n0

3.4- A prueba de errores

Como se puede ver al final de la invocacin de tar, hay un "|| do_exit ..." do_exit es otra funcin, que la vamos a utlizar en caso de que algo salga mal, en bash cuando un comando devuelve 0 es que todo fue bien en su ejecucin, en cambio si el valor es != de cero es que algo sali mal. Al poner "|| do_exit" me estoy asegurando que si algo sale mal la funcin do_exit se ejecute. do_exit va a ser usado por tar pero tambin por otros comandos que fallen, la idea es que haga un clenaup si el backup qued inconsistente y que enve un mail al administrador avisando que algo salo mal.
view plain print ?

0 1 . 0 2 .

d o _ e x i t ( ){ l o c a la p p = $ 1e x i t _ s t a t u s = $ 2f i l e = $ 3
6/14

bourneagainshell.blogspot.mx/2009/02/to-backup.html

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 .

c a s e$ a p pi n t a r )# e x i ts t a t u s1e nt a rn oe su ne r r o rf a t a l : # I ft a rw a sg i v e n c r e a t e , a p p e n d o r u p d a t e o p t i o n , # t h i se x i tc o d em e a n st h a ts o m ef i l e sw e r ec h a n g e dw h i l eb e i n g # a r c h i v e da n ds ot h er e s u l t i n ga r c h i v ed o e s n o tc o n t a i nt h e # e x a c tc o p yo ft h ef i l es e t . [$ e x i t _ s t a t u se q1]& &r e t u r n # b o r r oe lb a c k u pq u ef a l l ox qe s t ai n c o m p l e t o [n" $ f i l e "af" $ f i l e "]& &r mf" $ f i l e " ; ; e s a c c a t$ l o g f i l e|m a i ls" B a c k u pe r r o rh o s t : $ ( h o s t n a m e )a p p : $ a p pe x i t _ s t a t u s : $ e x i t _ s t a t u sf i l e : $ f i l e "$ m a i l _ f o r _ e r r o r s e x i t1 }

3.5- Mirror remoto

Luego de que tar corrio exitosamente, hacemos el upload remoto si es que corresponde
view plain print ?

0 1 .

[n" $ f t p _ h o s t "]& &u p l o a d m e" $ b a c k u p _ n a m e "

uploadme es otra funcin, lo que hace es hacer un mirror del directorio local de backups contra un ftp remoto, en este sentido el comando mirror de lftp es de gran ayuda. Lo bueno de esto es que la sincrona puede fallar un da, pero en cuanto el script vuelva a correr el directorio local y remoto de backups terminaran perfectamente sincronizados.
view plain print ?

0 1 . 0 2 . 0 3 .

0 4 . 0 5 .

u p l o a d m e ( ){ l o c a lf i l e = $ 1 l f t pc" o p e nf t p : / / $ f t p _ u s e r : $ f t p _ p a s s @ $ f t p _ h o s t ; m i r r o r Rd e l e t e f i r s t$ b a c k u p _ d i r( h o s t n a m e ) " 2 > > $ l o g f i l e| |d o _ e x i t" l f t p "$ ?$ f i l e r e t u r n0 }

3.6- Check final

Una vez subido el backup, entonces estamos en condices de borrar el .lock file, si es que lo habiamos creado (slo se usa para los full backups)
view plain print ?

bourneagainshell.blogspot.mx/2009/02/to-backup.html

7/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

0 1 . 0 2 .

#s it o d of u eb i e nb o r r oe l. l o c k [f" $ { i n c _ f i l e } . l o c k "]& &r mf" $ { i n c _ f i l e } . l o c k "

3.7- El script completo(backup.sh)

Descargar el script completo: backup.sh 4- Invocando el script desde crontab Generalmente coloco el script en /usr/local/bin/backu.sh y luego agrego esta linea a alguan crontab, puede ser la de root(crontab e) o en /etc/cron.d/ en alguan crontab personal. La linea de cron es simplemente para ejecutarlo una vez al da preferentemente en un horario de poco impacto para el servidor, como son las horas de la madrugada
view plain print ?

0 1 .

02***r o o t/ u s r / l o c a l / b i n / b a c k u p . s h

5- Ejemplo de salida Pego la salida de ls sobre un directorio de bakcups, en donde se han acumlado tres semanas. Como se puede observar hay una gran diferencia de tamao entre un backup full y uno incremental. Tambin se ve como los incrementales solo cubren la primer semana y luego quedan slo full 3 semanas hacia atras.
view plain print ?

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 .

r w r r -1r o o tr o o t1 . 4 G2 0 0 9 0 4 1 90 3 : 1 6b a c k u p s e q u r e 0 0 0 1 f u l l 2 0 0 9 0 4 1 9 . t a r . g z r w r r -1r o o tr o o t1 . 3 G2 0 0 9 0 4 2 60 3 : 1 5b a c k u p s e q u r e 0 0 0 1 f u l l 2 0 0 9 0 4 2 6 . t a r . g z r w r r -1r o o tr o o t 1 6 M2 0 0 9 0 4 2 70 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c M o n d a y . t a r . g z r w r r -1r o o tr o o t 1 6 M2 0 0 9 0 4 2 80 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c T u e s d a y . t a r . g z r w r r -1r o o tr o o t 3 0 M2 0 0 9 0 4 2 90 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c W e d n e s d a y . t a r . g z r w r r -1r o o tr o o t 3 0 M2 0 0 9 0 4 3 00 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c T h u r s d a y . t a r . g z r w r r -1r o o tr o o t 3 0 M2 0 0 9 0 5 0 10 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c F r i d a y . t a r . g z r w r r -1r o o tr o o t 5 0 M2 0 0 9 0 5 0 20 3 : 0 2b a c k u p s e q u r e 0 0 0 1 i n c S a t u r d a y . t a r . g z r w r r -1r o o tr o o t1 . 3 G2 0 0 9 0 5 0 30 3 : 1 6b a c k u p s e q u r e 0 0 0 1 f u l l 2 0 0 9 0 5 0 3 . t a r . g z

6- Conclusin Tener backups es garanta de buen sueo para un sys-admin y, es adems, una marca de calidad en lo que a infraestructura respecta.
bourneagainshell.blogspot.mx/2009/02/to-backup.html 8/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

Si bien hay soluciones de backup muy interesantes como bacula o backuppc, hay escenarios en donde no se justifica hacer semejante despliegue de configuracin e infraestructura. Escenarios donde lo nico que necesitamos es tener una copia fresca y con archivo de un servidor, en donde dedicar ms de 5 miutos de setup sera perder tiempo y dinero. Este script hace que tener backups sea algo sencillo de implementar, sin descuidar la calidad de los resultados, as que ya no hay ms excusas para tener un slo server sin backup. Good luck and good backups :)
Etiquetas: backup , incremental , linux , mirror , script , tar Publicadas por luciano This entry was posted on viernes, 20 de febrero de 2009 a la/s 12:38 You can skip to the end and leave a response.

13 comentarios: Alejandro L dijo... 14 de junio de 2009 19:28 Hola Amigo.. muy bune post.. voy a implementarlo te cuento

Modemhead dijo... 23 de junio de 2009 12:36 Muy bueno! Es mas de lo que estaba buscando :O Segui as con el blog q esta muy groso! saludos

Eduard4D dijo... 6 de julio de 2009 07:32 Buenas , primero de todo, muchas gracias, era exactamente lo que buscaba, pero me aguarda
bourneagainshell.blogspot.mx/2009/02/to-backup.html 9/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

una duda, la primera vez q he ejecutado el script, este me hace uno completo. SI quiero q vaya haciendome incrementales como debo llamar al script? Gracias Eduard

luciano dijo... 8 de julio de 2009 10:35 @Eduard4D la primera vez siempre hace un backup full porque es imposible hacer incrementales si no hay uno completo de referencia. El script se llama siempre igual, sin ningun parametro especial. La inteligencia interna del mismo har backups incrementales hasta llegar al da 7 de la semana(domingo) donde realizara un nuevo backup completo y as empezar de nuevo.

kbs dijo... 20 de julio de 2009 16:27 muy buen script amigo una pregunta, el backup incremental se basa solamente en si el archivo existe o no? se da cuenta si yo modifico el archivo para meterlo en el nuevo backup? Por ejemplo, yo tengo un directorio con el archivo "hola" est vacio, el dia 1 hago un backup full, el segundo dia yo escribo algo en el archivo "hola", el backup incremental se da cuenta que el archivo es diferente?

Ing. Sabas Medina Morales dijo... 13 de diciembre de 2011 14:19 Excelente el script. Me gustaria saber que
bourneagainshell.blogspot.mx/2009/02/to-backup.html 10/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

variaciones debo hacerle si quiero hacer backups de los switches cisco de la empresa donde trabajo. De antemano gracias

luciano dijo... 13 de diciembre de 2011 17:05 @Sabas Es muy distinto hacer backups de switchs o routers ya que cada uno tendr una manera distinta de acceder al dump. Para cisco especificamente google siempre te dara una mano

Annimo dijo... 22 de junio de 2012 00:28 buenas noches. la verdad me gusto el codigo preo tengo 2 pregunta : una es que no me envia notificaciones a mi correo}y la otra es que quisiera saver si se puede reducir la comprencion mas

Javier Lleo Toms dijo... 28 de septiembre de 2012 06:11 Estaba buscando algo sencillo y efectivo, este script encaja a la perfeccin. Muchas gracias por el articulo y las explicaciones, muy bueno. un saludo.

Daniel Diaz dijo... 29 de noviembre de 2012 21:15


bourneagainshell.blogspot.mx/2009/02/to-backup.html 11/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

Muy bueno lo implemente y me va de maravillas. Ahora soy muy limitado en linux, mi duda es. Como restauro uno de estos backups?? ejemplo, tengo como el ls que muestras, estoy en el dia viernes y quiero restaurar el backup del dia miercoles, como hago eso? Saludos a la distancia!

luciano dijo... 29 de noviembre de 2012 22:03 Para resutaurar usas el comando tar. Siempre debes restaurar primero uno de los backup full, y luego basta con un nico incremental del da al que quieras llegar. El comando sera algo as tar --numeric-owner -zxpvf backup.tar.gz

Daniel Diaz dijo... 4 de diciembre de 2012 17:50 sigo sin entender perdon, podrias ser mas grafico? tengo estos archivos: backup-mdh-full2012-12-02.tar.gz backup-mdh-inc-sbado.tar.gz backup-mdh-inc-lunes.tar.gz backup-mdh-inc-martes.tar.gz backup-mdh-inc-miercoles.tar.gz Supongamos que estoy a viernes y quiero restaurar el incremental del dia martes. Como hago esta operacion? Gracias y disculpa las molestias.

Annimo dijo... 11 de marzo de 2013 18:55 hola como puedo hacer un scrips linux, que me permita copiar el contenido de varios archivos logs. y ubicarlos en uno solo ....automaticamente cada 5 minutos ......
bourneagainshell.blogspot.mx/2009/02/to-backup.html 12/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

tomando en cuent que los archivos se modifican constantemente ....

Publicar un comentario

Entrada ms reciente

Pgina Principal

Entrada antigua

Suscribirse a: Comentarios de la entrada (Atom)

Twitter

Facebook
Luciano Ruete's Profile

Create Your Badge

Work

Labels
linux (2) adsl (1) backup (1) failover (1) incremental (1) load balancing (1) mirror (1)
bourneagainshell.blogspot.mx/2009/02/to-backup.html 13/14

06/09/13

#!/bin/bash: De como hacer buenos backups usando un simple script(o KISS bakcup)

multipath (1) script (1) tar (1)

bourneagainshell.blogspot.mx/2009/02/to-backup.html

14/14

Você também pode gostar