Documentazione di Ubuntu → Ubuntu 10.04 → Guida a Ubuntu server → Backup → Script shell

## Script shell

Uno dei metodi più semplici per effettuare il backup del sistema è usare uno script shell. Per esempio, è possibile usare uno script per scegliere le directory da archiviare e usare queste directory come argomento per tar per creare un archivio, che può essere quindi spostato o copiato in un'altra posizione. L'archivio può anche essere creato su un disco remoto, come una condivisione NFS.

L'utilità tar crea un archivio di file a partire da molti file o directory. Con tar è possibile anche elaborare i file con utilità di compressione riducendo così la dimensione dell'archivio.

### Semplice script shell

Il seguente script utilizza tar per creare un archivio su un file system remoto NFS. Il nome dell'archivio è determinato utilizzando delle utilità a riga di comando aggiuntive.

    #!/bin/sh
    ####################################
    #
    # Backup to NFS mount script.
    #
    ####################################

    # What to backup.
    backup_files="/home /var/spool/mail /etc /root /boot /opt"

    # Where to backup to.
    dest="/mnt/backup"

    # Create archive filename.
    day=$(date +%A)
    hostname=$(hostname -s)
    archive_file="$hostname-$day.tgz"

    # Print start status message.
    echo "Backing up $backup_files to $dest/$archive_file"
    date
    echo

    # Backup the files using tar.
    tar czf $dest/$archive_file $backup_files

    # Print end status message.
    echo
    echo "Backup finished"
    date

    # Long listing of files in $dest to check file sizes.
    ls -lh $dest

- $backup_files: una variabile con le directory di cui si vuole fare una copia. L'elenco va modificato come desiderato.

- $day: una variabile contenente il giorno della settimana (lunedì, martedì, mercoledì, ecc...) viene usata per creare un archivio per ogni giorno della settimana, consentendo di avere una cronologia di archivi di sette giorni. Esistono altri metodi per fare questo, come l'uso dell'utilità date.

- $hostname: variabile contenente il nome host breve del sistema. Usare il nome dell'host nel nome dell'archivio, consente di avere backup giornalieri di diversi sistemi in una sola directory.

- $archive_file: il nome completo dell'archivio.

- $dest: destinazione dell'archivio. La directory deve essere creata e in questo caso anche montata prima di eseguire lo script. Per dettagli sull'uso di NFS, consultare la sezione chiamata «NFS (Network File System)».

- messaggi: messaggi opzionali stampati sulla console usando echo.

- tar czf $dest/$archive_file $backup_files: il comando tar usato per creare l'archivio.

  - c: crea l'archivio.

  - z: passa l'archivio attraverso l'utilità di compressione gzip.

  - f: usa un file archivio, altrimenti il comando tar invia l'output sullo STDOUT.

- ls -lh $dest: istruzione opzionale che stampa un elenco lungo (-l) in un formato leggibile (-h) della directory di destinazione. È utile per controllare la dimensione dell'archivo. Questa verifica non dovrebbe sostituire la verifica dell'archivio.

Questo è un semplice esempio di un backup eseguito con uno script shell ed è possibile aggiungere molte opzioni. Per maggiori informazioni sugli script shell, consultare la sezione chiamata «Riferimenti».

### Eseguire lo script

#### Esecuzione da terminale

Il metodo più facile per eseguire lo script di backup è quello di copiare il contenuto dello script in un file, `backup.sh` per esempio, ed eseguirlo in un terminale:

    sudo bash backup.sh

È un ottimo modo per provare lo script e assicurarsi che funzioni correttamente.

#### Esecuzione con cron

L'utilità cron può essere usata per automatizzare l'esecuzione dello script. Il demone cron consente l'esecuzione di script o comandi a un determinato orario e data.

L'applicazione cron è configurata attraverso delle voci in un file `crontab` file. I file `crontab` sono separati in campi:

    # m h dom mon dow   comando

- m: minuto di esecuzione del comando, tra 0 e 59.

- h: ora di esecuzione del comando, tra 0 e 23.

- dom: giorno del mese di esecuzione del comando.

- mon: il mese in cui viene eseguito il comando tra 1 e 12.

- dow: il giorno della settimana in cui viene eseguito il comando tra 0 e 7. La domenica può essere specificata usando sia 0 che 7.

- comando: il comando da eseguire.

Per aggiungere o modificare voci in un file `crontab`, dovrebbe essere usato il comando crontab -e, i contenuti di un file `crontab` possono essere visualizzati usando il comando crontab -l.

Per eseguire lo script backup.sh usando cron, in un terminale digitare quanto segue:

    sudo crontab -e

Usare sudo con il comando crontab -e, modifica il crontab dell'utente root. Questo è necessario nel caso in cui si stiano eseguendo copie di backup di file accessibili solo dall'utente root.

Aggiungere quanto segue al file `crontab`:

    # m h dom mon dow   command
    0 0 * * * bash /usr/local/bin/backup.sh

Lo script backup.sh verrà eseguito ogni giorno alle 12.00 AM.

Lo script backup.sh deve essere copiato nella directory `/usr/local/bin/` affinché possa essere eseguito correttamente. Lo script può essere posizionato ovunque nel file system, basta correggere il percorso di conseguenza.

Per maggiori informazioni riguardo crontab, consultare la sezione chiamata «Riferimenti».

### Ripristinare l'archivio

Una volta creato un archivio, è importante verificarlo, elencandone i contenuti oppure, ed è la scelta migliore, ripristinare un file dall'archivio.

- Per visualizzare il contenuto di un archivio, da un terminale, digitare:

      tar -tzvf /mnt/backup/host-lunedì.tgz

- Per ripristinare un file dall'archivio in una directory diversa, digitare:

      tar -xzvf /mnt/backup/host-lunedì.tgz -C /tmp etc/hosts

  L'opzione -C di tar redirige i file estratti nella directory specificata. L'esempio precedente estrarrà il file `/etc/hosts` in `/tmp/etc/hosts`. La struttura della directory viene quindi ricreata da tar.

  Notare anche che il simbolo "/" iniziale del percorso in cui ripristinare è stato tralasciato.

- Per ripristinare tutti i file presenti nell'archivio, digitare:

      cd /
      sudo tar -xzvf /mnt/backup/host-lunedì.tgz

In questo modo verranno sovrascritti i file attualmente presenti nel file system.

### Riferimenti

- Per maggiori informazioni riguardo lo script da shell, consultare la Advanced Bash-Scripting Guide

- Il libro Teach Yourself Shell Programming in 24 Hours è disponibile in linea ed è un'ottima risorsa per lo script da shell.

- La pagina della della documentazione in linea su cron contiene ulteriori dettagli sulle opzioni avanzate di cron.

- Per maggiori informazioni sulle opzioni del comando tar, consultare il manuale in linea di tar.

- La pagina inglese di Wikipedia Backup Rotation Scheme contiene informazioni sugli schemi di backup.

- Questo script utilizza tar per creare l'archivio, ma esistono diverse altre utilità a riga di comando che possono essere usate, per esempio:

  - cpio: usata per copiare file da e verso degli archivi.

  - dd: parte del pacchetto coreutils. Un'utilità a basso livello in grado di copiare dati da un formato a un altro.

  - rsnapshot: un'utilità per creare snapshot (istantanee) del file system usata per creare copie di un intero file system.

Capitolo 18. Backup |  | Rotazione degli archivi