[Linux-Biella] tutils per tape DAT SCSI (lungo)

LeOS linux@bilug.linux.it
Tue, 07 Jan 2003 19:35:32 +0100


da leggersi su un laptop appoggiato sulle ginocchia mentre si e' in bagno...



come gia' anticipato all'ultima riunione (a cui ho potuto partecipare) 
vi posto l'ultimo nato

mi son trovato tra le mani un DAT scsi e non sapendo bene che farmene mi 
son fatto un paio di cosine carine per utilizzarlo comodamente

pochi noiosi cenni su come funziona un DAT, o meglio un generico 
dispositivo sequenziale:

immaginate di trovarvi davanti ad un videoregistratore o anche solamente 
un lettore di audiocassette.
avete un natro, avete un contagiri.
beh dai sinceramente avete anche altre cose, tipo la comodita' di andare 
direttamente alla fine dei dati salvati, e pure la possibilita' di 
muovervi avanti e indietro per un determinano numero di "brani" e 
posizionarvi all'inizio o alla fine dei brani stessi :)

tutto questo serve perche' in realta', una volta voi avrete copiato un 
file (rigorosamente un .tar e non provate MAI a mettere qualunque altra 
cosa su un tape se non volete impazzire a cercar di capire perke' vi da' 
i/o error) dicevo, una volta copiato un file sul nastro, questo perdera' 
identita'...

nei termini, voi copiate il file pippo.tar con il semplice comando:

cp pippo.tar /dev/tape

(perche' preventivamente avrete fatto un bel link simbolico da /dev/nst0 
a /dev/tape) (altra cosa, so ke sono un disordinato mentale ma e' 
importantissimo: /dev/st0 esegue rewind dopo ogni operazione, usate 
sempre /dev/nst0 che non fa nulla, altrimenti diventerete pazzi :)))

ok torniamo a noi

con il comando cp avrete copiato il vostro file pippo.tar sul nastro
per recuperarlo semplicemente dovrete riavviare il nastro e posizionarvi 
all'inizio del file (come ve lo diro' dopo) e fare l'inverso di prima:

cp /dev/tape .

otterrete un bel file: tape

e ora? questo file non e' niente altro che il vecchio pippo.tar che 
avevamo copiato prima

esistono quindi una serie di parametri del comando mt-st che ci fanno 
fare tante cose belle

io che son pigro e non ho voglia ogni volta di scrivere mt-st -f 
/dev/tape cazzodicomando mi son fatto un alias mettendo tape = mt-st -f 
/dev/tape

e per comodita' e pigrizia continuo ad usarlo in questa email/documento

tape tell - restituisce la posizione in blocks del nastro (il nostro 
contagiri)

tape seek block - raggiunge il block definito (ffd e rew)

tape rewind - mi sembra ovvio

tape eject - vedi sopra

tape lock - e' ovvio ma lo dico, locka il tape, evita ke l'idiota di 
turno faccia eject della cassetta col pulsante... nei termini, se ci 
sono operazioni in corso, il tape e' lockato, ma se e' a riposo, questo 
puo' essere ejected

tape unlock - slocka il tape, l'idiota di turno puo' ejectare la cassetta :)

tape erase - prepara il caffe'... si certo e voi ci credete...

andiamo nel divertente!

tape eod - si posiziona alla fine dei dati scritti sul tape

tape eof - scrive un insignificante, microscopico, apparentemente 
inutile blocco vuoto...
a cosa serve? semplice: io NON posso assolutamente (almeno col mio DAT) 
posizionarmi al block Xesimo (col comando tape seek X) quando quello e' 
  pure l'ultimo block scritto, a tale scopo, dopo aver scritto l'ultimo 
file, io scrivo pure un block vuoto e cosi' l'ultimo valido sara' X+1

tape bsfm X - da dove sono, torno indietro di X posizioni e mi piazzo 
all'inizio del file successivo

qusti - a memoria - sono i comandi ke ho usato io per le utilities, se 
ho scritto stronzate non abbiatene a male...

-------------------------------------------------------------------------

ora vi spiego a grandi linee come funzionano i comandi, (tre per ora e 
li troverete tutti qui sotto):

tinit [label]: inizializza il nastro e ci mette pure un nome, altrimenti 
tinit senza nulla il nastro si chiamera' no-name

semplicissimo:
crea una dir "tinit" nella propria home (non mi piace aver merda sparsa 
per i FS)
memorizza la directory dove ci troviamo leggendo la variabile di sistema 
$PWD (per motivi di tar ci dovremo muovere nell'altra dir, quindi, onde 
evitare di perderci in giro per le directories me la memorizzo e ci 
torno dopo)
crea un file di testo (che diventera' l'header del catalog ovvero il log 
di tutte le operazioni) con dentro nome nastro e data (leggetevi il 
comando con vi)
poi crea il tar e lo copia sul nastro
fatto tutto cancella la directory temporanea e torna dove eravamo prima

perche' questo?!?!?
semplice:
io potevo creare in current per gli amici "." ) i file temporanei, ma 
potrei trovarmi all'interno di una dir di cui ho solamente i diritti di 
lettura quindi non potrei mai creare i file, allo stesso tempo, se io 
devo creare in file .tar e vado a prendere il file /pippo/pluto/paperino 
quando apriro' il file.tar avro' il mio bel percorso completo (senza il 
primo slash) questo perke' io sono imbecille e non ho trovato l'opzione 
per ELIMINARE dai file .tar il percorso (sempre che sia possibile, cmq 
se e' possibile ormai ho fatto cosi' e non ho voglia di cambiare nulla!)

allora succede ke mi trovo a andare dentro la dir temporanea, creare il 
file .tar "pulito" e poi buono buono me ne torno dove ero prima ovvero 
nella variabile $currentdir



TDIR:
crea la solita dir
va in fondo al nastro
torna indietro fino a dove e' l'inizio del catalog
lo copia in locale nella dir temporanea
decomprime
e visualizza con un less
all'uscita elimina la porcheria


TSAVE:

il piu' divertente...

crea la dir temporanea
esattamente com tdir va a pigliare il catalog
dopo questo si va nuovamente a posizionare all'inizio di questo catalog 
in quanto ORA STIAMO PER SALVARE UN FILE, quindi il "vecchio" cataloho 
verra' sovrascritto e poi risalvato alla fine del nastro solamente DOPO 
aver salvato il file
il catalog viene quindi aggiornato dei seguenti dati:
nome file beckupato
posizione iniziale del nastro (prima della copia sul tape)
posizione finale del nastro (dopo averci copiato il file)
e data (semplice date >> catalog)

poi ke fa? semplice, sempre dentro la directory temporanea ricrea il 
catalog.tar, con il file catalog aggiornato e lo va a salvare dentro il 
nastro, in coda a quello che abbiamo precedentemente salvato


quindi noi inzialmente potevamo avere una situazione tipo:

I--------CE

I = Inizio nastro
I...C = spazio occupato dal catalog
E = marker di fine nastro

ora abbiamo:

I-----------------------------F1--------CE

I = Inizio nastro
I...F1 = spazio occupato dal file1
F1...C = spazio occupato dal catalog
E = marker di fine nastro

e cosi' via, sempre posizionandoci al punto evidenziato come Fx dove x 
e' l'ultimo file salvato, prima di iniziare l'operazione di copia


potete qui vedere un esempio di catalog che sicuramente vi schiarisce le 
idee, se come son sicuro non sono stato abbastanza chiaro...

============================
Tape "BaBau!" created on
Mon Dec 30 21:18:28 CET 2002
============================
----------------------------
.bash_profile
Begins:
At block 2.
Ends:
At block 23.
Mon Dec 30 21:23:00 CET 2002
----------------------------
httpd-start
Begins:
At block 23.
Ends:
At block 44.
Mon Jan  6 16:02:46 CET 2003
----------------------------
gpm-start
Begins:
At block 44.
Ends:
At block 65.
Mon Jan  6 16:03:05 CET 2003
----------------------------
clearlogs
Begins:
At block 65.
Ends:
At block 86.
Mon Jan  6 16:03:39 CET 2003
----------------------------
mail
Begins:
At block 86.
Ends:
At block 107.
Mon Jan  6 16:04:02 CET 2003
----------------------------


potete quindi vedere che .bash_profile inizia al block 2 e finisce al 
block 23
quindi la prima sessione di tsave avra' visto una situazione simile:

2-----------------23----CE

con I = 2
F1 = 23
F1...C = spazio del catalog

e cosi' via, a fronte di ogni salvataggio fino ad arrivare ad avere la 
situazione finale con:

2-------23-------44--------65---------86-------107-------CE

con tutti i file uno dopo l'altro, ed un bel catalog che chiude le danze


ma perke' ho fatto tutto questo?
semplice
ogni programma di backup che io conosca crea un database locale con 
dentro il contenuto del nastro
se io piglio il nastro e vado a casa di lucabert che pure lui ha un DAT, 
se non ho pure un duplicato del database, col nastro ci possiamo fare le 
stelle filanti...
semplicemente con questo sistema, l'intero "database" del contenuto del 
nastro sta sul nastro stesso
quindi per me e' semplicissimo recuperare i miei comandi idioti e li uso 
  sul suo pc, senza bisogno di altro

e se dimentico i comandi?
beh
mi ricordo di andare in fondo al nastro
torno indietro di tre punti
copio in locale
estraggo il catalog
e sono a cavallo: con tape seek mi vado a posizionare dove voglio e poi 
mi copio in locale quel ke serve!

-----------------------------------------------------------------------

COSA C'E' ancora da fare?

il comando di restore
ovvero
NON e' possibile fare un comando restore nomefile
perke' io posso pure non sapere cosa diavolo c'e' dentro il nastro
allora io conto di leggere il catalog, visualizzarlo similarmente al 
comando "tdir" pero' dare la possibilita' di selezionare il file, un po' 
alla midnight commander, quindi di ripristinare
ok c'e' da smanettare un po', ma tanto sono giovane e non ho un cazzo di 
meglio da fare (mi piace mentire pure a me stesso)
a parte gli skerzi, ho postato tutto 'sto rompimento di palle, perke' 
vorrei da voi qualche consiglio, nei termini: cosa vorresti avere tu 
come restore?

la mia idea e':


leos@patatina$ trestore

wait, reading catalog...

============================
Tape "BaBau!" created on
Mon Dec 30 21:18:28 CET 2002
============================

contains:

legend: filename | Begin | End | Date

.bash_profile | 2 | 23 | Mon Dec 30 21:23:00 CET 2002
httpd-start | 23 | 44 | Mon Jan  6 16:02:46 CET 2003
gpm-start | 44 | 65 | Mon Jan  6 16:03:05 CET 2003
clearlogs | 65 | 86 | Mon Jan  6 16:03:39 CET 2003
mail | 86 | 107 | Mon Jan  6 16:04:02 CET 2003

Commands: [i] move UP - [k] move down
[ENTER] - restore in current dir
[ESC] - exit

-----------------------------------------------------

bello vero? ed io seleziono quello ke mi serve e bon


qui sotto c'e' il codice di quello ke gia' ho scritto...

buona vita a tutti, LeOS




--- TINIT -----------------------------------------------------

# --- Create the temp dir in user home and memorize current ---
mkdir ~/tutils
currentdir=$PWD

# --- Check tapename ---
if [ "$1" = "" ] ; then
   tapename="no-name"
else
   tapename=$1
fi

echo
echo "Initializing tape..."
# --- Create the header of the catalog ---
echo "============================" > ~/tutils/catalog
echo "Tape \"$tapename\" created on" >> ~/tutils/catalog
date >> ~/tutils/catalog
echo "============================" >> ~/tutils/catalog
echo "----------------------------" >> ~/tutils/catalog

# --- go to temp dir to create a clean tar file and goback to current ---
cd ~/tutils
tar cf init.tar catalog
cd $currentdir

echo Rewinding Tape...
mt-st -f /dev/tape rewind
echo Erasing Tape...
mt-st -f /dev/tape erase
mt-st -f /dev/tape eof

echo "Copying catalog to Tape..."
cp ~/tutils/init.tar /dev/tape

echo "Writing EOF..."
mt-st -f /dev/tape eof
echo "Rewinding Tape..."
mt-st -f /dev/tape rewind
rm -Rf ~/tutils

echo Done!

---------------------------------------------------------------


--- TSAVE -----------------------------------------------------

echo "TSaving $1..."

# --- Create the temp dir in user home and memorize current ---
mkdir ~/tutils
currentdir=$PWD

# --- Reach End Of Data on Tape ---
mt-st -f /dev/tape eod

# --- Rewind the Tape to reach the begin of saved Catalog ---
mt-st -f /dev/tape bsfm 3

# --- Restore the Catalog for update ---
cp /dev/tape ~/tutils
tar xf ~/tutils/tape -C ~/tutils

# --- Reach End Of Data on Tape ---
mt-st -f /dev/tape eod

# --- Rewind the Tape to reach the begin of saved Catalog ---
mt-st -f /dev/tape bsfm 3

# --- compress file or directory  for backup ---
tar zcf ~/tutils/tempfile.tar.gz $1

# --- go to temp dir to create a clean tar file ---
cd ~/tutils
tar cf  tempfile.tar tempfile.tar.gz
echo $1 >> ~/tutils/catalog
echo "Begins:" >> ~/tutils/catalog
mt-st -f /dev/tape tell >> ~/tutils/catalog
cp tempfile.tar /dev/tape
echo "Ends:" >> ~/tutils/catalog
mt-st -f /dev/tape tell >> ~/tutils/catalog
date >> ~/tutils/catalog
echo "----------------------------" >> ~/tutils/catalog

tar cf init.tar catalog
cd $currentdir

# --- Update catalog on Tape ---
cp ~/tutils/init.tar /dev/tape

# --- Close the Tape ---
mt-st -f /dev/tape eof

rm -Rf ~/tutils

echo Done!

---------------------------------------------------------------


--- TDIR ------------------------------------------------------

# --- Create the temp dir in user home ---
mkdir ~/tutils

# --- Reach End Of Data on Tape ---
mt-st -f /dev/tape eod

# --- Rewind the Tape to reach the begin of saved Catalog ---
mt-st -f /dev/tape bsfm 3

# --- Restore the Catalog and view it ---
cp /dev/tape ~/tutils
tar xf ~/tutils/tape -C ~/tutils
less ~/tutils/catalog

# --- Clean temp dir ---
rm -Rf ~/tutils

---------------------------------------------------------------