Backups en GNU/Linux

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Intro

Les còpies de seguretat o backups són una part molt important del sistema, ja que permet recuperar-lo d'un desastre de fallada.

En planificar la política de backups cal que ens plantegem:

  • QUÈ guardem, és a dir, QUINS arxius cal guardar
    • Potser hi ha parts del sistema que no canvien o no val la pena guardar-les (per exemple, els arxius del sistema operatiu, ja que si cal recuperar el sistema potser podem reinstal·lar una nova versió).
  • ON els posem
    • backup local : ens permet recuperar desastres com fallades d'un disc
    • backup remot : ens permet recuperar desastres com incendis que acabin amb tot el CPD
  • QUAN i cada QUANT fem el backup
    • La operació de backup consumeix recursos, si la fem massa sovint podem alentir el sistema
    • Convé fer-los a la nit o quan el sistema estigui poc ocupat


Estratègies i Nivells

Per tal d'optimitzar el procés de backup convé plantejar-se QUINS arxius copiem:

  • Còpies de Nivell 0: copiem TOTS els arxius
  • Còpies incrementals: només copiem els arxius que hagin canviat des de la darrera còpia
    • Còpies de Nivell 1: copiem tots els arxius que hagin canviat des de la darrera còpia de Nivell 0
    • Còpies de Nivell 2: copiem tots els arxius que hagin canviat des de la darrera còpia de Nivell 1
    • etc...


Comandes

La comanda més habitual és tar, tot i que es poden fer servir d'altres:

  • tar: ens permet fer còpies incrementals de diferents nivells
  • cpio
  • dump/restore

En principi, aquestes comandes es van dissenyar per enregistrar en cintes magnètiques (TAR = Tape ARchiver) però ara tenen molta mes funcionalitat.

Són "empaquetadores", és a dir, només fan una unitat de un seguit d'arxius. Si, a més, volem comprimir, caldrà afegir la funcionalitat de GZIP o BZIP2 per minimitzar l'espai utilitzat.

TAR ja incorpora aquestes compressions i no cal utilitzar comandes addicionals.


TAR

Penseu que davant del dubte podeu mirar:

$ man tar

...per veure totes les opcions disponibles. Ens diu:

TAR(1)                                     BSD General Commands Manual                                     TAR(1) 

NAME
     tar — The GNU version of the tar archiving utility 

SYNOPSIS
     tar [-] A --catenate --concatenate | c --create | d --diff --compare | --delete | r --append | t --list |
         --test-label | u --update | x --extract --get [options] [pathname ...]

Opcions:

c → Crea un fitxer
x → eXtreu fitxers d'un fitxer contenidor
t → Testeja els fitxers emmagatzemats en un fitxer “contenidor” (mostra per stdout el contingut)
r → Afegeix fitxers al final d'un fitxer “contenidor”
v → Manera verbose
f → Permet especificar el nom del fitxer “contenidor”
Z → Comprimeix o descomprimeix mitjançant compress/uncompress
z → Comprimeix o descomprimeix mitjançant gzip
p → Conserva els permisos dels fitxers
P → Guarda els fitxers amb ruta absoluta

Backups incrementals

Pots fer backups totals i incrementals amb TAR.


Exemples amb tar

La típica utilització de tar per comprimir, per exemple, tots els arxius de conf d'Apache2:

$ tar cvfz arxiu.tar.gz /etc/apache2

.tar.gz és el mateix que .tgz

Per comprovar-ho:

$ tar tvfz arxiu.tar.gz

Per descomprimir-ho:

$ tar xvfz arxiu.tar.gz

Per comprimir-ho amb BZIP2 (més comprimit que GZIP però força més lent):

$ tar cvfj arxiu.bz2 /etc/apache2

Combinant amb find

Find és una comanda que ens permet filtrar els arxius que compleixin certes característiques. El típic és cercar per nom:

$ find /etc -name "*.txt"

Però també podem buscar els que han estats modificats posteriorment a la data de creació d'un arxiu, per exemple:

$ find /etc -cnewer a.bz2

...ens trobarà tots els arxius modificats amb posterioritat a "a.bz2". Ja podeu imaginar que això pot servir per controlar de què fem backups.

Similarment, tenim aquests arguments:

  • -amin +n : arxius accedits (llegits) fa més de n minuts
  • -amin -n : arxius accedits (llegits) fa menys de n minuts
  • -amin n : arxius accedits (llegits) fa exactament n minuts
  • -anewer <arxiu> : arxius accedits (llegits) amb posterioritat a la darrera modificació de <arxiu>
  • -atime +n : arxius accedits fa més de n dies

Hi ha un joc complert igual a aquest amb cmin, cnewer, ctime que miren la data de modificació (change), no la d'accés.

Per exemple, per esborrar arxius que ningú es mira des de fa més d'1 any:

$ find <carpeta> -atime 365 -exec rm {} \;

Ja que -exec executa la comanda per cadascun dels arxius trobats ({} es substitueix per la ruta de cada arxiu). El \; és per separar les comandes (s'ha de posar sempre per fer comandes independents).

Ja sabeu que per sortir de dubtes sempre tenim a mà el manual:

$ man find

Per comprimir els arxius que torna un find (en aquest cas, els arxius .txt continguts a la carpeta src):

$ find src -name "*.txt" | tar cfvz arxiustxt.tgz -T -

Aquest darrer cas és interessant. Fixa't en què fem servir la directiva -T (comprimeix els arxius llistats al següent argument) i enlloc d'un arxiu a -T li passem "-", que significat stdin

El mateix es pot aconseguir amb aquesta comanda:

$ find src -name "*.txt" -exec tar -rvf arxiustxt.tgz {} \;

Només que en aquest cas el què fem és una comanda tar per cada arxiu trobat per find i l'afegim (-r=append) a arxiustxt.tgz


CRON

El CRON és un dimoni per executar tasques (comandes) programades.

Com sempre, per saber tot sobre CRON, podem fer

$ man cron

Crontab d'usuari

Els fitxer de configuració global del CRON és /etc/crontab. El podríem editar directament, però la manera oficial de treballar amb CRON és aquesta:

$ crontab -e

...i entrareu a editar-ho amb el nostre editor favorit: el VI ;)

Amb aquesta comanda editarem el CRON de l'usuari actual. OJU: quan programem una tasca CRON cal tenir clar quin usuari l'executarà per tal que tingui els permisos adients per resoldre la tasca a fer.

Anacron

Si editem /etc/crontab manualment (fes-li un cop d'ull per veure com funciona CRON), veurem que hi ha diverses entrades que s'executen regularment. Executen el què hi ha a les següents carpetes:

  • /etc/crontab.hourly : s'executa cada hora
  • /etc/crontab.daily : s'executa cada dia
  • /etc/crontab.weekly : s'executa cada setmana
  • /etc/crontab.monthly : s'executa cada mes

Per activar-ho calda instal·lar el paquet anacron.


Exercicis

Backups:

  1. Fes un script que monti un sistema d'arxius extern (per exemple, a sdb o sdc) i realitzi una còpia dels arxius .txt que hi ha a /etc.
    • A l'acabar cal desmuntar el sistema d'arxius extern.
    • Si no pot muntar el sistema extern el script s'aturarà donant un missatge per stderr sense fer cap backup.
  2. Fes un script que tregui un backup de les bases de dades MySQL del sistema en arxius separats i finalment les empaqueti en un sol arxiu .tgz
  3. TAR està preparat per realitzar còpies de seguretat de nivell 0 i incrementals.
    • Com utilitzar TAR per backups incrementals.
    • Fes un script que faci un backup de /etc
    • Si li passem la opció -0 farà un backup de nivell 0 (total). Per fer un de nivell 1 li passarem -1 com a argument.
    • Ha de dir quants arxius ha processat

Cron:

  1. Programa el CRON perquè a cada minut afegeixi la data actual a l'arxiu /tmp/dates.txt (sense esborrar el què hi ha).
  2. Programa el CRON per executar un script que faci un backup de nivell 0 cada 5 minuts i un backup incremental cada minut.
    • Fes abans l'exercici 3 de backups.
    • Els backups de nivell 0 han de dir-se bkp.<data>.level0.tgz , on <data> és la data amb format aaaa-mm-dd-HH-MM
    • Els backups incrementals han de dir-se bkp.<data>.inc.tgz
    • Els errors s'han de volcar sobre l'arxiu /tmp/etcerr.txt