Parece Funcionar!
Para a versão 16.x, o cálculo do bloco é baseado na localização do arquivo
desejado enquanto que na versão 15.1 é baseado no final do arquivo anterior.
Tomamos esta localização, multiplicamos por 2 para obter o número de blocos para
aquela localização e subtraimos 4 para ter certeza que teremos um bloco anterior
ao arquivo que procuramos.
Note que os números NÃO combinam com o que está no catálogo, pois a contagem
inicia onde o BRU inicia a leitura.
Nós ainda precisamos das opções "-QV" para informar ao BRU que ignore o fato de
que ele não irá encontrar um bloco de cabeçalho e usamos o "non-rewinding
device" para os comandos mt/bru. Você ainda deve verificar que os dispositivos
"rewinding" e "non-rewinding" sejam configurados com o mesmo tamanho de buffer
(bufsize) em /etc/brutab.
E se não funcionar?
Há várias razões por que os passos descritos acima podem não funcionar.
Se o comando "mt seek" falhar, significa que o seu drive ou subsistema SCSI pode
não suportar QFA. Consulte a documentação da sua unidade de fita e da sua
placa SCSI.
Se você vir algo como:
bru: [A118] rerun with "-b ?k" argument
bru: [I117] don't know how to rewind archive device
Significa que o tamanho de buffer (bufsize) dos dispositivos "rewinding" e
"non-rewinding" está diferente. Verifique o arquivo /etc/brutab.
Se o BRU não apresentar os arquivos corretos, significa que:
- Seu backup não foi feito em modo de blocos fixos de 512 bytes
- Você pode ter a necessidade de desabilitar a compressão por hardware
- Seu drive ou subsistema SCSI pode não suportar QFA.
Restaurando com QFA:
Se os testes acima funcionarem do modo esperado, o próximo passo lógico é
restaurar um arquivo utilizando QFA com o BRU:
# mt -f /dev/nst0 seek `expr 22 \* 2 - 4`
# bru -xvvvvvf /dev/nst0 -QV /etc/passwd
Segue um exemplo de script para automatizar alguns dos passos anteriores.
Por default, este script trabalha com a versão 16.x do BRU.
Para a versão 15.1, certifique-se de trocar o parâmetro "LINE=" conforme indicado no script:
#!/bin/sh
#
# QFA recovery script for BRU (/bru/bruqfarestore)
#
# by Richard Fish
#
# Copyright 1998 by Enhanced Software Technologies, Inc.
# All Rights Reserved
#
# This script is provided without warranty, express or implied,
# for any purpose whatsoever. Use at your own risk.
#
# EDIT THESE FOR YOUR ENVIRONMENT
#
# (What else should be configurable here?)
#
# rewinding and non-rewinding devices
RDEV=/dev/st0
NRDEV=/dev/nst0
# END OF CONFIGURABLES
if [ $@missing = "missing" ] ; then
echo "Usage: bruqfarestore ..."
fi
AINFO=`bru -gf $RDEV`
if [ $? != 0 ] ; then
echo "Not a BRU tape!"
exit 1
fi
done=0
for x in $AINFO; do
if [ $done = 1 ]; then
AID=$x
break
fi
if [ $x = "archive_id:" ] ; then
done=1
fi
done
# trim extra spaces from archive id
AID=`echo $AID`
if [ ! -f /bru/logs/$AID.gz ] ; then
echo "Didn't find catalogue for archive id: $AID"
exit 1
fi
for arg in $@; do
######################################
# Code change needed for 16.x or 15.1
######################################
#
# This following line is for BRU 16.x
LINE=`zcat /bru/logs/$AID.gz | grep "] $arg"`
#
# Change this script to use the line below
# instead if using this script with BRU 15.1
#
#LINE=`zcat /bru/logs/$AID.gz | grep --before-context=1 "] $arg"`
#
if [ $? != 0 ] ; then
echo "$arg: not in catalog"
continue
fi
# trick to filter extra whitespace from LINE
LINE=`echo $LINE`
BLOCK=`echo $LINE | cut -f 4 -d " "`
# in compressed backups, we actually need field 5
if [ $BLOCK = "of" ]; then
BLOCK=`echo $LINE | cut -f 5 -d " "`
fi
# trim "k", and convert to 512-byte blocks
BLOCK=`echo $BLOCK | cut -f 1 -d "k"`
BLOCK=`expr $BLOCK \* 2 - 4`
echo "Extracting $arg at block $BLOCK..."
mt -f $NRDEV seek $BLOCK
if [ $? != 0 ] ; then
echo "failed command: mt -f $NRDEV seek $BLOCK"
continue
fi
bru -xvvf $NRDEV -QV $arg
done
mt -f $RDEV rewind