Backup dei dati tra i server
Questa guida spiega come copiare e creare backup dei dati tra server Linux utilizzando rsync, nonché come eseguire la clonazione a basso livello dei dischi con dd.
Prima di iniziare
I comandi descritti in questa guida vengono eseguiti sul server di origine, ovvero il server da cui vengono copiati i dati. Il server di destinazione deve essere accessibile tramite SSH e l'utente specificato nel comando deve avere accesso in lettura al percorso di origine e accesso in scrittura al percorso di destinazione.
Per verificare l'accesso SSH al server di destinazione prima di eseguire un backup:
ssh user@destination_host
Sostituire user con il nome utente remoto e destination_host con l'indirizzo IP o il nome host del server di destinazione.
Per i backup automatizzati o pianificati, configurare l'autenticazione SSH tramite chiavi invece di utilizzare le password.
Copiare una directory su un server remoto
Si noti che la barra finale nel percorso di origine influisce sul comportamento di rsync: /source/ copia il contenuto della directory, mentre /source copia la directory stessa.
Utilizzare sempre --dry-run prima di eseguire comandi con --delete per evitare perdite accidentali di dati. Per visualizzare in anteprima ciò che verrà trasferito senza apportare modifiche:
rsync -a --delete --dry-run -e ssh /path/to/source/ user@destination_host:/path/to/backup/
Dopo aver verificato l'output, eseguire lo stesso comando senza --dry-run. Aggiungere -P per consentire la ripresa di un trasferimento interrotto e visualizzare l'avanzamento:
rsync -a --delete -e ssh -P /path/to/source/ user@destination_host:/path/to/backup/
L'opzione -a preserva permessi, timestamp e collegamenti simbolici. L'opzione --delete garantisce che la destinazione sia un mirror esatto dell'origine rimuovendo i file che non esistono nell'origine. Aggiungere -v per visualizzare informazioni dettagliate.
L'opzione --delete rimuoverà dalla destinazione i file che non sono presenti nell'origine. Non utilizzarla se la destinazione contiene file che devono essere conservati indipendentemente.
Copiare la maggior parte dei file di sistema
Per copiare la maggior parte del filesystem escludendo le directory virtuali e temporanee:
rsync -aAXv --delete --one-file-system --numeric-ids \ --exclude={/dev/,/proc/,/sys/,/tmp/,/run/,/mnt/,/media/,/lost+found,/swapfi le} \ / user@destination_host:/path/to/backup/
Le opzioni utilizzate sono: -a preserva permessi, timestamp, collegamenti simbolici ed esegue la copia ricorsiva; -A preserva le ACL; -X preserva gli attributi estesi; -v mostra informazioni dettagliate. L'opzione -H per gli hard link viene omessa intenzionalmente: gli hard link di sistema non devono essere replicati in un backup remoto e la loro conservazione aumenta il tempo e la complessità del trasferimento. L'opzione --one-file-system impedisce a rsync di attraversare altri filesystem montati. L'opzione --numeric-ids preserva i valori UID e GID senza associarli ai nomi degli utenti, cosa importante quando i server di origine e destinazione hanno configurazioni utenti diverse.
La maggior parte dei percorsi esclusi utilizza una barra finale per escludere il contenuto della directory mantenendo la directory stessa. /lost+found non ha una barra finale perché deve essere esclusa l'intera directory e non solo il suo contenuto. La stessa regola della barra finale si applica al percorso di origine: /source/ copia il contenuto della directory, mentre /source copia la directory stessa.
Questo metodo non crea un'immagine di sistema avviabile e non deve essere utilizzato come sostituto di un backup completo del sistema. Per backup coerenti di sistemi attivi, prendere in considerazione l'arresto dei servizi critici o l'utilizzo di snapshot del filesystem, come gli snapshot LVM, prima di eseguire il comando.
Clonazione completa di una directory con rsync
Per eseguire una clonazione completa di un albero di directory preservando hard link, ACL e attributi estesi:
rsync -aAHXv /source/dir/ user@destination_host:/destination/dir/
Le opzioni utilizzate sono: -a preserva permessi, timestamp, collegamenti simbolici ed esegue la copia ricorsiva; -A preserva le ACL; -H preserva gli hard link, importante per una clonazione esatta della directory; -X preserva gli attributi estesi; -v mostra informazioni dettagliate.
Clonare un disco con dd
Per clonare un intero disco su un altro disco dello stesso server:
dd if=/dev/sdX of=/dev/sdY bs=1M conv=noerror,sync status=progress
Sostituire sdX con il disco di origine e sdY con il disco di destinazione. Le opzioni conv=noerror,sync consentono di continuare la copia dopo gli errori di lettura riempiendo i blocchi danneggiati con zeri. Se l'integrità dei dati è critica, omettere queste opzioni affinché dd si arresti al primo errore invece di sostituire silenziosamente i blocchi danneggiati con zeri.
Per clonare un disco su un server remoto tramite SSH:
dd if=/dev/sdX bs=1M status=progress | ssh user@destination_host 'dd of=/dev/sdY bs=1M'
La destinazione può essere anche un percorso di file anziché un dispositivo a blocchi.
dd scrive direttamente sul dispositivo o sul file di destinazione senza richiedere conferma. Controllare attentamente origine e destinazione prima di eseguire il comando. Sui sistemi attivi, se possibile, smontare tutte le partizioni del disco di origine oppure rimontarle in sola lettura. Per backup coerenti dei filesystem montati, utilizzare snapshot LVM oppure avviare il sistema da un ambiente di ripristino.
Verificare il backup
Dopo il trasferimento, collegarsi al server di destinazione e controllare le dimensioni del backup e la struttura di base:
ssh user@destination_host du -sh /path/to/backup/ ls /path/to/backup/
Per un controllo completo dell'integrità, eseguire rsync con --checksum e --dry-run. Questo confronta il contenuto dei file anziché i timestamp e segnala eventuali differenze:
rsync -av --checksum --dry-run /path/to/source/ user@destination_host:/path/to/backup/
Si noti che questa procedura può richiedere molto più tempo rispetto a una normale esecuzione di rsync su grandi quantità di dati.