<- SL: Teoria del firewall - Archivio Generale - Copertina - SL: Il Mio "Personal Firewall" -> |
Sistemi Liberi
L'articolo...Descrizione dell'installazione di un'unita di backup con autoloader su un server Linux, della sua configurazione e dell'automazione del processo di backup. |
Dopo una piacevole avventura con un file server GNU/Linux :-), abbiamo deciso di upgradare il sistema, che era divenuto un poco stretto per le nostre necessità. Abbiamo incontrato non poche difficoltà a gestire il backup, così ho deciso di evitare ad altri una simile avventura spiegando come siamo arrivati alla fine dei nostri guai.
Viste le nostre necessità e ciò che offriva il mercato, si è deciso l'acquisto di un server IBM Netfinity 5000, con controller SCSI Hot-Swap e 4 dischi da 36Gb riuniti in un disco logico da 80Gb. La scelta è stata motivata da una dichiarata conformità a GNU/Linux da parte di IBM.
Si prevedeva di dover eseguire il backup di almeno 30Gb di dati, e quindi abbiamo acquistato un autoloader (previsto come opzione dalla IBM). Un autoloader è un unità a nastro che al posto del nastro accetta un apposito contenitore ('magazine') dotato di guide per ospitare 6 nastri da 20Gb (40Gb compressi) per un totale max di 240Gb di backup. I nastri vengono posizionati sulla testina dalla meccanica dell'unità. Il singolo nastro si intende 'caricato' solo quando viene portato in posizione di lettura/scrittura.
Sul suddetto server è stata installata una distribuzione Red Hat 6.2 (per mere ragioni di competenza del sottoscritto, come illustrato anche in un altro articolo sul backup).
L'unità è stata riconosciuta senza difficoltà ;-) dal sistema; scorrendo i messaggi di avvio del PC, infatti, si scopre che essa viene identificata come Seagate DAT 06241-xxx, ed indirizzata tramite un device /dev/st0 che, per comodità, è stato linkato con un nome più significativo tramite il comando seguente:
ln -s /etc/st0 /etc/tape |
Abbiamo, quindi, caricato un magazine di nastri e poi un nastro (tramite i comandi sul pannello frontale), ed eseguito una copia di test sul dispositivo /dev/tape con il comando
tar -cvf /dev/tape testfile |
Il tutto ha funzionato alla perfezione, e ci siamo ritrovati un backup del file testfile a velocità record.
Nasceva quindi la necessità di sfruttare l'autoloader per il caricamento automatico dei nastri ed il cambio degli stessi. Dopo molte ricerche in internet ho scoperto (da un newsgroup) l'esistenza del programma mtx (rif. mtx.sourceforge.net ). Questo programma viene definito come "tape changer control program", ovvero un programma in grado di gestire la parte robotica di un autoloader. Infatti, leggendo attentamente il file delle FAQ che accompagna i sorgenti di tale comando, si comprende che una unità autoloader è composta da due devices:
le due unità vengono interpretate come dispositivi di tipologia differente, uno sequenziale e uno a blocchi, e devono venire associate a due differenti device.
Il problema era che il kernel individuava in automatico solo il device per il backup; infatti dando un comando:
cat /proc/scsi/scsi |
l'output risultante non mostrava nessuna unità "Media changer" o similari.
La risposta ancora una volta nelle FAQ: il controller scsi
installato nel server ha uno SCSI ID unico ma 2 LUN's (Logical
Units) differenti. Per risolvere il problema bisogna ricompilare
il kernel o aggiungere la seguente linea al file /etc/lilo.conf :
append="max_scsi_luns=2"
Eseguire poi: /sbin/lilo
e riavviare il
pc.
Vi assicuro che a tale punto l'unità è stata individuata immediatamente dal sistema (come device /dev/sge). Come suggerito dalle istruzioni di mtx il device è stato linkato ad un nome che viene individuato come dispositivo di default dal comando:
ln -s /dev/sge /dev/changer |
Il comando mtx permette il caricamento dei nastri con comandi tipo
mtx load n (ove n è il numero del nastro) |
o di scaricare il magazine completo con
mtx eject |
Per automatizzare le procedure di backup ho quindi modificato degli script che ho preso dal "Backup how-to", e che sono disponibili al link seguente:
ftp:web.tiscalinet.it/rgnet/files/backupfunctions.tar.gz
Spero di essere stato esauriente e di avere evitato a qualcuno la fatica da noi compiuta per far funzionare il tutto. Scrivetemi pure per segnalare errori o richiedere aiuto:
#!/bin/sh # # backup.sh - Backup control script # # Usage: backup.sh LEVEL # # where LEVEL = 0, 1 # # Variables #manda un e-mail del risultato a: EMAILTO=" <rudig@mercury>" #nome del device di backup DESTFILE="/dev/tape" #directory o singoli files da backuppare (separati da uno spazio) BACKUPFILES="/root /etc /home " #directory dove stanno le funzioni di backup BACKUPDIR="/usr/local/bin" #livello del backup (atteso come parametro) LEVEL="${1}" #block factor del nastro modificare come di convenienza BLOCKS=512 #device del autoloader MEDIACHANGER="/dev/changer" # Load backup functions cd ${BACKUPDIR} . backup-functions TAPE_N=$(date '+%w') if [ $TAPE_N = 7 ] then #domenica unload_tape eject_magazine exit fi if [ $TAPE_N = 6 ] then #pulizia unload_tape load_tape exit fi |
# This is not a shell script; it provides functions for the backup.sh script # that sources it. # Variables L0DATESTAMP="${BACKUPDIR}/.level0_datestamp" NOW=`date` #activate dat compression compression_on () { echo "Activating compression..." mt -f ${DESTFILE} datcompression wait $! } #unload the tape from autoloader unload_tape () { echo "Unloading tape..." mt -f ${DESTFILE} offline wait $! } #load tape (tape_n) load_tape () { echo "Loading tape..." $TAPE_N mtx -f $MEDIACHANGER load $TAPE_N wait $! } #eject magazine from autoloader eject_magazine () { mtx -f $MEDIACHANGER eject } # tar_backup function: does the archiving tar_backup () { echo "Level-${LEVEL} Backup ${NOW}" if [ "${LEVEL}" = "0" ]; then # make Level-0 datestamp echo ${NOW} > ${L0DATESTAMP} # Level-0 backup tar --create --verbose --file ${DESTFILE} \ --blocking-factor ${BLOCKS} --label "Level-${LEVEL} Backup ${NOW}" ${BACKUPFILES} elif [ "${LEVEL}" = "1" ]; then # get last Level-0 datestamp LAST=`cat ${L0DATESTAMP}` # Level-1 backup tar --create --verbose --file ${DESTFILE} --blocking-factor ${BLOCKS} \ --after-date "${LAST}" --label "Level-${LEVEL} Backup from ${LAST} \ to ${NOW}" ${BACKUPFILES} else # Backup level error echo "Error: Level-${LEVEL} unknown" exit fi echo "Level-${LEVEL} Backup END" } # tar_verify function: test the archive for errors tar_verify () { echo "Level-${LEVEL} Backup Verify ${NOW}" # Backup verify test tar --list --verbose --file ${DESTFILE} --blocking-factor ${BLOCKS} echo "Level-${LEVEL} Backup Verify END" } #tar_list function: List files from archive tar_list () { tar --list --verbose --file ${DESTFILE} --blocking-factor ${BLOCKS} } # mail_report function: sends backup report mail_report () { # Email backup report mail -s "${HOSTNAME} - Level-${LEVEL} Backup" "${EMAILTO}" << EOF ########################################################### Level-${LEVEL} Backup ########################################################### Host: ${HOSTNAME} Files: ${BACKUPFILES} Destination: ${DESTFILE} Tape: ${TAPE_N} ########################################################### Started: ${NOW} Completed: `date` ########################################################### EOF } |
L'autoreRudi Giacomini Pilon, programmatore dall'età di 14 anni, ex progettista elettronico, ex hardwarista e sistemista presso un Microsoft Solution Provider, ex esperto di reti e programmatore in una concessionaria IBM, incontra Linux nel 1994 e da allora vede pinguini ovunque. Dal 1999 è responsabile EDP in una SpA ove affronta l'informatica a 538 gradi (360 erano pochi). |
<- SL: Teoria del firewall - Archivio Generale - Copertina - SL: Il Mio "Personal Firewall" -> |