Per backup si intende un procedimento di salvataggio di files o directory (o addirittura interi filesystem) attraverso il quale e' possibile in caso di danni o altre svariate necessita' ripristinare le condizioni di funzionamento del sistema, da qui si capisce la sua fondamentale importanza.
In caso di mancato backup, la perdita di dati importanti puo essere una vera tragedia e un buon backup può fare la differenza fra un disastro e una scocciatura.
Ci sono svariate procedure e filosofie sul backup ma uno degli aspetti importanti e' che i dati salvatirisiedano in un luogo fisico differente rispetto a quello dei file originali (anche in un diverso supporto nella stessa macchina).
Per il backup di dati si possono utilizzare da floppy-disks (ne bastano 3 per backuppare /etc), fino ad interi raid di harddisks (arrivando cosi a dimensioni di svariati Terabyte). I supporti piu' comuni utilizzati sono floppydisks, Zipdisks, CDR, DVD, tapes e harddisks. La scelta del supporto dipende sia dalla quantita' di dati da backuppare
(a volte si preferisce salvare solo dati essenziali, a volte si opta per il backup di interi filesystem) sia dalla frequenza del backup (che comunque dipende dalla quantita', in quanto e' difficile che giornalmente si effettuino backup di 500Gb).
Generalmente le procedure di backup avvengono quando non ci sono users operanti sul sistema e quando il carico della rete e' basso, cosa che avviene spesso e volentieri la notte.
Fra le svariate utility per il backup nel mondo Unix troviamo Dump e Restore (con nomi diversi fra i vari
OS Unix-based, anche se di poco), comandi molto sofisticati con una semplice interfaccia ed opzioni essenziali che permettono di backuppare e restorare semplicemente (con la possibilita' di scieglierne il livello) interi devices e filesystems, anche da remoto.
Altro comando di rilievo e' cpio, non potente come dump ma con piu' features.
Tools importanti per il backup di filesystems sono AMANDA (performato dall'universita' del Maryland permette di settare un singolo master backup server in grado di backuppare piu hosts), BURT (altra utility, ottimizzata per il backup e restore da nastri) e CD backup Linux (performato per backup e restore automatici creando un CD-Rs bootabile mentre si lavora sul sistema).
Per il backup e' inoltre possibile utilizzare anche comandi di archiviazione (o compressione) come tar, gzip ecc...
Oltre alle opzioni elencate qui sopra vi sono anche un'infinita' di utility commerciali per backup e restore dei dati. Le case produttrici piu' importanti a livello commerciale di software per il backup sono VERITAS Software, FalconStor Software, BakBone Software, Arkeia.
Rsync e' un comando (ed un protocollo) che permette la copia di file via rete, ottimizzando i tempi di backup e ripristino dei dati.
L'host da backuppare (su cui si devono leggere o scrivere file) deve avere in esecuzione rsync in modalita' server (rsync --daemon
), e deve essere presente il file /etc/rsyncd.conf
dove sono contenute le informazioni relative alla condivisione necessaria per il backup.
Sull'host remoto che deve leggere o scrivere file sulla macchina dove rsync gira come daemon, viene eseguito il comando rsync con una logica simile a quella di cp.
I parametri da settare in /etc/rsyncd.conf
sono:
- [nomecondivisione] e' il nome della condivisione rsync;
- path e' il path locale a cui fa riferimento la condivisione;
- read only e' un opzione che protegge i file dalla scrittura (se settata = yes);
- uid e gid sono l'utente ed il gruppo con cui rsync accede al filesystem;
- host allow rappresenta gli IP da cui e' possibile collegarsi via rsync;
- list e' un opzione che prevede di poter impedire di elencare le condivisioni disponibili sul server rsync (se settata = false);
La prima volta che si esegue un backup da un certo host vengono copiati tutti i files specificati nella condivisione, le altre volte solo quelli modificati dall'ultimo backup.
Per un utilizzo sicuro di rsync (le password non vengono richieste!), e' consigliabile:
- Selezionare accuratamente gli IP degli host che possono accedere al server rsync;
- Consentire esclusivamente ingressi in sola lettura;
- Non utilizzare root come uid e gid ( a meno che non sia necessario per esigenze di backup).
La sintassi del client rsync è:
rsync [opzioni] [host da backuppare]::nomecondivisione/files /[directory host locale]
opzione spesso utile e' -av
, che specifica di copiare i file mantenendo ownership, permessi e in modalita' "directory recursive".
Il file di configurazione di rsync è simile ad un file .ini di un sistema Windows.
Le direttive di configurazione globali sono definite nella prima parte del file, mentre la seconda parte riguarda sezioni o moduli identificati da un nome racchiuso tra parentesi quadre. Il file può contentere linee vuote e commenti i quali devono iniziare con il carattere ; o con #.
Un esempio di rsyncd.conf
utilizzato per il backup, dove vengono configurati due moduli:
log file =
/var/log/rsyncd.log
definisce un file di log
motd file =
/etc/rsyncmotd
definisce un file per il MOTD (Message Of The Day)
[Apollo13]
tra parentesi quadre viene indicato il nome del modulo
path = /disco2/backup/Apollo13
percorso attraverso il quale vengono localizzati i file
comment = Backup Area Apollo13
commento visibile interrogando il server rsync
list = yes
permette di visualizzare il modulo tra la lista di quelli disponibili
read only = no
rende il modulo disponibile in scrittura, di default questo non è possibile
[Enigma]
path = /disco2/backup/Enigma
comment = Backup Area Enigma
list = yes
read only = no
Permette di visualizzare i moduli disponibili su un host in cui è in esecuzione rsync in modalità server.
Prima di trasferire da o verso un host dei dati, è necessario sapere quali sono i moduli messi a disposizione dal server rsync per l'operazione. Questo è possibile attraverso il comando:
[azitti@topolino azitti]$ rsync pluto.it::
ftp the whole ftp area
www the whole web site
ildp the ILDP web site
HOWTO-it Italian HOWTOs
In questo caso possiamo notare che il Pluto Linux Documentation Project pluto mette a disposizione quattro moduli da cui scaricare files: ftp, www, ildp e HOWTO-it
Se sul server si vuole evitare la possibilità da parte dei client di visualizzare la lista dei moduli disponibili (per sicurezza o riservatezza) va inserita, in /etc/rsyncd.conf
la voce:
list = false
Sebbene Rsync sia un tool sviluppato principalmente per sistemi Unix esiste la possibilità di utilizzarlo anche all'interno di sistemi Windows.
La possibilità di usare Rsync sotto Windows comporta il fatto di installare, almeno in parte, la suite Cygwin che implementa un sistema Posix compliant nell'ambiente Microsoft. In particolare e' necessario che durante l'installazione si selezioni dalla package list +Net la voce Rsync.
Per fare in modo che da una qualsiasi shell Windows sia possibile lanciare il comando, è necessario aggiungere al PATH di sistema la directory dove risiedono gli eseguibili di Cygwin, solitamente C:\Cygwin\bin
.
Un esempio:
C:\>rsync --version
rsync version 2.5.6 protocol version 26
Copyright (C) 1996-2002 by Andrew Tridgell and others
Capabilities: 64-bit files, socketpairs, hard links, symlinks, batchfiles,
no IPv6, 64-bit system inums, 64-bit internal inums
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
L'utilizzo tipico sotto Windows sarà lato client, verso un server Unix, ma è possibile utilizzarlo anche come demone.
Rsync è un ottimo tool per la replica dei dati, con ssh (ovvero con supporto cifrato) lo è ancora di più =)
rsync -avzlrt --exclude 'nothisdir' -e "ssh -p 4321" [email protected]:/'`find /my/secret -name '*$VAR*'`' /localbackup
Opzioni utilizzate:
a: archive mode;
v: abilito la modalità verbose per l'operazione in corso;
z: abilito la compressione;
l: mantiene i link;
r: modalità ricorsiva;
t: preserva data e ora dei file;
e: rsync si appoggia su un ssh server in ascolto sulla porta (-p) 4321
Nel pc remoto eseguo un find nel percorso /my/secret per tutti i file contenenti nel nome la variabile $VAR, dopodichè copio localmente su /localbackup.
L'operazione può essere schedulata per comodi (e sicuri) backup notturi con l'integrazione di chiavi dsa con passphrase blank, definendo un livello di security a mio parere accettabile per la maggior parte delle realtà di impiego.
Comando che riduce la dimensione dei file usando un algoritmo che offre generalmente una migliore compressione rispetto ai convenzionali compressori basati su codifiche LZ77/LZ78 (gzip e zip).
La command-line e' volutamente simile (ma non identica) a quella di gzip.
Come gzip il file compresso mantiene il nome, data, permessi del file origine (che verra' eliminato), ed avrà l'estersione '.bz2'.
-c --stdout --to-stdout
Scrive l'uscita nello standard output; mantiene il file originale intatto.
-d --decompress
Decomprime
-z --compress
Comprime
-t --test
Verifica l'integrita' del file compresso senza decomprimerlo.
-f --force
Forza la compressione (o la decompressione), anche se il file corrisponde ad un file gia esistente (di default non lo fa)
-k --keep
Non elimina i file originali durante la compressione o la decompressione.
-v --verbose
Mostra il nome e la percentuale di riduzione di ogni file compresso o decompresso.
-1 (o --fast), -2, ... , -9 (o --best)
Setta la dimensione dei blocchi di memoria da utilizzare (100k,...,900k) durante la compressione.
A differenza di gzip utilizzando l'opzione -1 ( o --fast) l'aumento di velocita' di compressione non e' molto precepibile. di default e' settata l'opzione -9 (--best).
Questa opzione non ha effetto in fase di decompressione.
Programma di archiviazione progettato per immagazzinare ed estrarre file da un archivio conosciuto come un tarfile.
Un tarfile può essere fatto su un'unità a nastro magnetico o su un file normale.
tar [opzioni] file1, file2, ... , fileN
-A, --catenate, --concatenate
aggiunge i file ad un archivio
-c, --create
crea un nuovo archivio
--delete
elimina dall'archivio (da non usare sui nastri magnetici!)
-r, --append
aggiunge i file alla fine di un archivio
-t, --list
elenca il contenuto di un archivio
-u, --update
aggiunge solamente i file che sono pi recenti della copia nell'archivio
-x, --extract, --get
estrae i file da un archivio
-f, --file [NOME_HOST:]F
usa il file di archivo o dispostivo F (default /dev/rmt0)
-L, --tape-length N
cambia il nastro dopo aver scritto N*1024 byte
-p, --same-permissions, --preserve-permissions
estrae tutte le informazioni relative ai permessi
-v, --verbose
elenco minuzioso dei file elaborati
-z, --gzip, --ungzip
filtra l'archivio attraverso gzip
zip e' un utility di archivio e compressione di file per Unix, VMS, MSDOS, OS/2, Windows NT, Minix, Atari and Macintosh, Amiga and Acorn RISC OS.
E' analogo alla combinazione dei comandi Unix 'tar' e 'compress' ma utilizza algoritmi diversi.
Per la decompressione a differenza di altri comandi di archivio e compressione (tar, gzip e bzip2), e' possibile utilizzare esclusivamente il comando unzip, in quanto zip non prevede alcuna opzione che permetta di decomprimere un file.
-A
Crea un archivio eseguibile auto-decompattante.
-b path
Utilizza il path specificato per allocare i file zip temporanei. una volta terminato il processo copia il file.zip nella directory corrente eliminando i file zip temporanei.
-c
Aggiunge una riga di commento per ogni file.
-d
Rimuove i file origine una volta archiviati.
-f
Sovrascrive un file contenuto nell'arichivio se viene inserito lo stesso file con data di modifica piu recente.
-i files
Include solo i files specificati.
-j
Mantiene solo il nome dei files archiviati senza salvare il nome delle directory. Di default zip salva il path completo.
-m
Sposta i files nell'archivio specificato eliminando gli originali.
-e
Assegna una password all'archivio creato.
-o
Setta come data di modifica dell'archivio la data di modifica piu recente dei files archiviati.
-r
Ricorsivo, se si comprime una directory, con questa opzione si archivieranno anche tutte le sue sottodirectory.
-t mmddyyyy (o yyyy-mm-dd)
non operera su file modificati prima della data specificata.
-tt mmddyyyy (o yyyy-mm-dd)
non operera su file modificati dopo la data specificata.
-T
testa l'integrita' del nuovo zip file. se il test fallisce un eventuale vecchio zip file non viene eliminato e vengono mantenuti i file di origine.
-v
Verbose, fornisce maggiori dettagli.
-#
Regola il rapporto tra qualita' e velocita' (-1=veloce, -9=migliore).
Con l'opzione -c, gzip scrive l'uscita nello standard output, lasciando il file originale intatto.
Percio' e' possibile concatenare piu file compressi con il comando gzip -c fileN >> gzfile.gz.
.
Quindi il comando gzip -cd gzfile.gz
equivale a cat file1 file2,..., fileN
.
Compressioni migliori si ottengono pero' con la riga cat file1,...,fileN | gzip > gzfile.gz
, che comprime cosi' tutti i membri assieme, anziche' con il comando il comando gzip -c file1,...,fileN > gzfile.gz
.
Se un file compresso e' formato da piu' membri, l'opzione --list fara' riferimento solo alla dimensione compressa, decompressa, rapporto di compressione ecc... dell'ultimo membro, nel caso interessi solo la dimensione decompressa per tutti i files membri si puo' usare gzip -cd file.gz | wc -c
.
Nel caso si voglia ricomprimere files concatenati per ottenere una migliore compressione si puo' eseguire gzip -cd old_gzfile.gz | gzip > new_gzfile.gz
.
Se si vuole pero' creare un archivio di piu' files compressi indipendenti bisogna utilizzare il tar, che con l'opzione -z filtra gli archivi con gzip, creando cosi' i .tar.gz.
Alcuni esempi di configurazione ed utilizzo di rsync, con uso di password su file esterni e pattern sui file da copiare
Configurazione server: /etc/rscynd.conf
log file = /var/log/rsyncd.log
# motd file = /etc/rsyncmotd
timeout = 300
max connections = 4
log format = "%o %h [%a] %m (%u) %f %l %b"
transfer logging = yes
secrets file = /etc/rsyncd.secrets
[bacco]
path = /
comment = Backup
list = no
read only = no
uid = root
auth users = ced
hosts allow = 172.16.1.9
Esempio di secret file: /etc/rsyncd.secrets (il path e' configurabile in modo arbitrario)
ced:password
Utilizzo lato client
rsync -avz --password-file=/etc/rsyncd.secrets.ced --delete --exclude-from=/etc/rsyncd.patterns [email protected]::bacco/var
/backup/
Copia in /backup la directory var remota, cancellando i file locali che non esistono piu' sul server, usando i pattern definiti nel file /etc/rsyncd.patterns e la password specificata (per l'utente ced) su /etc/rsyncd.secrests.ced
rsync -avz --password-file=/etc/rsyncd.secrets.ced [email protected]::bacco/var/tmp/bacco
Come sopra, senza esclusione di file e senza cancellazione dei file
locali non piu' presenti sul server.
Esempio di /etc/rsyncd.patterns (come invocato da comando rsync lato client)
(copia di file che finiscono con .log, .gif .jpg )
+ */
+ *.log
+ *.gif
+ *.jpg
- *
Esempio di /etc/rsyncd.secrets.ced (come invocato da comando rsync lato client)
password
Comando che riduce la dimensione dei file usando la codifica di Lempel-Ziv (lo stesso algoritmo di zip e PKZIP). Quando possibile, ogni file rimpiazzato da uno con l'estensione .gz, mantenendo le stesse proprietà, date d'accesso e di modifica. Se il nome del file compresso è troppo lungo per il file system, gzip lo tronchera'.
gzip [opzioni] file
-c --stdout --to-stdout
Scrive l'uscita nello standard output; mantiene il file originale intatto.
-d --decompress --uncompress
Decomprime.
-f --force
Forza la compressione o la decompressione anche se il file ha link multipli o corrisponde a un file che già esiste, o se i dati compressi sono letti da (o scritti in) un terminale.
-l --list
Per ogni file compresso, elenca dimensione del file compresso, dimensione del file decompresso, rapporto di compressione (0.0% se sconosciuto), nome del file decompresso.
-N --name
Quando comprime, salva sempre il nome di file e la time stamp originali; il comportamento di default. Quando decomprime, ripristina il nome di file e la time stamp se sono presenti.
-r --recursive
Attraversa ricorsivamente la struttura della directory.
-S .suf --suffix .suf
Usa il suffisso .suf invece di .gz. Può essere dato qualsiasi suffisso, ma suffissi diversi da .z e .gz dovrebbero essere evitati per evitare confusioni quando i file sono trasferiti su altri sistemi.
-t --test
Test. Verifica l'integrità del file compresso.
-v --verbose
Verbose. Mostra il nome e la percentuale di riduzione di ogni file compresso o decompresso.
-# --fast --best
Regola la velocità di compressione usando la cifra # specificata, dove -1 o --fast indicano il metodo di compressione più veloce (minore compressione) e -9 o --best indicano il metodo di compressione più lento (migliore compressione). Il livello di compressione di default è -6.
Su Unix sono disponibili degli strumenti di dump (copia) e restore su nastro (storicamente) di interi file system o parti di essi.
Su Solaris è possibile trovare analoghi comandi specificatamente dedicati al file system UFS di Sun.
Il comando ufsdump viene usato per eseguire un backup completo (full) o incrementale di un file-system UFS. La sua sintassi è:
ufsdump opzioni [argomenti] file_da_dumpare
Le Opzioni più comuni:
0-9
Specifica il livello di DUMP. 0 (zero) è quello più basso ed indica sempre un FULL DUMP, da 1 a 9 sono usati per dump incrementali e hanno significato solo relativo fra loro (un dump di livello 3, per esempio, include anche file dumpati con livelli superiori, ma non file dumpati con operazioni di livello inferiore).
f nome_device
Specifica il device in cui vengono scritti i file da dumpare.
v
Verifica dei dati copiati.
S
(senza altre opzioni) Visualizza il numero di byte previsti per il backup per il device o directory specificati.
u
Aggiorna il registro /etc/dumpdates con la data e il livello del backup che si sta eseguendo.
file_da_dumpare
Può riferirsi sia al nome di un file o directory (es: /export/home/al ) che al nome di un file system montato (es: /home ) che al nome completo di un device (es: /dev/dsk/c0t0d0s0 ).
I backup incrementali vengono gestiti con livelli di dump da 1 a 9. Questo permette di schedulare backup incrementali con flessibilità. Quando viene eseguito un backup incrementale, vegnono copiati solo i dati modificati dell'ultima volta in cui è stato eseguito un backup dello stesso livello o superiore. Lo storico dei backup eseguiti viene mantenuto sul file /etc/dumpdates
, per cui è sempre raccomandabile usare ufsdump con l'opzione u
.
E' raccomandabile eseguire il dump di un file system quando questo non è montato sul sistema e non può essere modificato durante l'operazione di copia (questa è infatti divisa in due diverse fasi: nella prima si raccolgono gli inode dei file da dumpare, nella seconda si copiano i dati effettivi).
Se non si può andare direttamente in maintenance mode (init S
), la procedura corretta per il dump di un intera partizione è:
- Umount della partizione (es: umount /home
) Questa operazione è ovviamente impossibile con la / o la /usr (dove risiedono tutti i comandi di sistema)
- File system check della partizione (es: fsck /dev/rdsk/c0t1d0s1
)
- Dump su nastro della partizione (es: ufsdump 0f /dev/rmt/0 /dev/rdsk/c0t1d0s1
)
- Mount della partizione precedentemente smontata (es: mount /home
)
Per conoscere esattamente mount point e relativi nomi completi di device fare riferimento a /etc/vfstab
.
Si può verificare la dimensione dei dati da backuppare con ufsdump S file_da_dumpare
.
Il restore dei dati salvati su nastro viene fatta con ufsrestore:
ufsrestore opzioni [argomenti] [file_da_riprestinare]
Le Opzioni più comuni:
i
Esegue un restore interattivo: si visualizza un prompt dedicato da cui è possibile browsare file e directory su nastro, selezionare quali ripristinare e fare un restore selettivo dei file scelti.
r
Esegue un restore completo dell'intero backup.
t
Visualizza l'elenco dei file backuppati senza fare un restore.
x
Esegue un restore solo dei file specificati come argomento.
f dump_file
Specifica un dump_file (tape device, dischetto o disk file) alternativo a quello di default (/dev/rmt/0).
v
Verbose mode: visualizza i nomi dei path mentre vengono restorati.
L'operazione di restore viene eseguita in riferimento alla directory corrente: se ci si trova in /tmp e si fa un restore di /etc/hosts (usfrestore xvf /dev/rmt/0 ./etc/hosts
), il file viene scritto in /tmp/etc/hosts.
Se si deve eseguire un restore di un intero sistema per un qualsiasi disastro (rm -rf /*, crash di un hard disk non mirrorato, formattazioni incaute ecc.) si devono eseguire le seguenti operazioni (fare riferimento alla documentazione SUN online per maggiori dettagli, qui viene fatto solo un sommario elenco):
1- Spegnimento del sistema, inserimento di un nuovo hard disk;
2- Boot del sistema da CDROM in maintenance mode (boot cdrom -r
da ok prompt);
3- Riconoscimento, partizionamento, formattazione e mount su una directory temporanea del nuovo hard disk.
4- Restore dei dati dal nastro al nuovo hard disk (ufsrestore rvf /dev/rmt/0
)
5- Eventuali restore successivi di dump incrementali (farlo dai livelli di dump inferiori a quelli superiori)
6- Verifica dell'integrità del file system restorato nell directory montata e rimozione di restoresymtable
.
7- Umount e fsck del nuovo file system.
8- Creazione dei settori di boot sulla partizione di root (installboot /usr/platform/'uname -i'/lib/fs/ufs/bootblk /dev/rdsk/nomedevice
)
9- Ripetizione dei punti da 4 a 8 per ogni mount point o partizioni separate
10- Verifica che /directorydimounttemporaneo/etc/vfstab abbia informazioni corrette per il nuovo hard disk aggiunto al sistema (va modificato se l'hard disk non è stato fisicamente sostituito al precente ed ha un device name diverso)
11- Reboot del sistema (con le dita incrociate).
Da Solaris 8 è disponibile il tool fssnap
che permette un corretto dump di un file system senza la necessità di doverlo smontare.