Visão Geral
Visão
Ficha Técnica
Ficha
Preços
Telas
Tutorial
Tutorial
FAQ
FAQ
Preços
Preços
Download
Download


 

"Implementando QFA - Quick File Access (Acesso Rápido a Arquivos) no BRU"

O que precisamos:

Há certos pré-requisitos que precisamos atender. Em primeiro lugar, a unidade de fita deve suportar o comando SEEK para posicionar a fita. Muitos drives SCSI-II satisfazem este requisito. Em seguida, necessitamos de um subsistema SCSI e um comando de manipulação de fita que nos permita utilizar o SEEK. Um exemplo em Linux para verificar se é possível usar o SEEK/TELL em um determinado drive:

# bru -cf /dev/st0 /etc
# mt -f /dev/nst0 seek 200
# mt -f /dev/nst0 tell
At block 200.

Lembre-se de utilizar o dispositivo "non-rewinding" (veja em /etc/brutab) para os comandos mt.

Note também que é necessário utilizar o BRU em linha de comando para criar backups compatíveis com QFA. A interface gráfica do BRU atualmente não é capaz de criar backups compatíveis com QFA.

Fazendo o Backup:

Segue um exemplo de script de como produzir um backup que pode ser utilizado com QFA. Atente para a mudança do tamanho de bloco (block size) para 512 bytes:

#!/bin/sh
# Script to perform backup of entire system
# and create a compressed index file
#
BRUEXECLOG=/tmp/bruexeclog.$$ ; export BRUEXECLOG
MAILTO=you@yourhost.yourdomain
DATE=`date "+%m/%d/%Y %H:%M:%p"`
mt -f /dev/st0 setblk 512
# This command must contain the "V" and at least 2 "v"'s
bru -cZVvvf /dev/st0 / | gzip >/tmp/bruindex.$$
id=`zcat /tmp/bruindex.$$ | grep "Archive id:" | cut -f 2 -d :`
# trick to remove leading/trailing spaces from id
id=`echo $id`
mv /tmp/bruindex.$$ /bru/logs/$id.gz
mail -s "Backup results for `hostname` on $DATE" $MAILTO < $BRUEXECLOG

Testando:

Existe uma leve diferença na maneira que o BRU 15.1 e 16.x reportam a localização do arquivo. Apesar de que a maioria da lógica é a mesma, o BRU 16.x é mais fácil, na medida em que o número necessário para calcular a posição está na mesma linha que o arquivo que você procura e na versão 15.1 o número está na linha anterior. Exemplos para ambos são mostrados a seguir:

Asseguremo-nos que tudo está funcionando. Este exemplo é um backup de /etc:

# bru -gf /dev/st0
    
[stuff deleted...]
archive_id: 366839d0021b
    
[stuff deleted...]

Por exemplo, vamos tentar extrair /etc/passwd. Por causa das diferenças entre as versões 16.x and 15.1, precisamos utilizar comandos diferentes:

Para a versão 16.x, use:

# zcat /bru/logs/366839d0021b.gz | grep /etc/passwd
c 22k [1] /etc/passwd
c 2792k [1] /etc/passwd-

Para a versão 15.1, use:

# zcat /bru/logs/366839d0021b.gz | grep -1 /etc/passwd
c 2k of 22k [1] /etc/motd
c 2k of 24k [1] /etc/passwd
c 2k of 26k [1] /etc/printcap
--
c 2k of 2792k [1] /etc/issue.net
c 2k of 2794k [1] /etc/passwd-
c 2k of 2796k [1] /etc/redhat-release

Vamos tentar ambos os arquivos. A extração pode variar mostramos a da versão 15.1:

# mt -f /dev/nst0 seek `expr 22 \* 2 - 4`
# bru -ivvf /dev/nst0 -QV | head -5
buffer size = 32k bytes
media size = 11718720 Kilobytes (11.71 Gigabytes) usable
i 2k of 4k [1] /etc/passwd
i 2k of 6k [1] /etc/printcap
i 2k of 8k [1] /etc/profile
# mt -f /dev/nst0 seek `expr 2792 \* 2 - 4`
# bru -ivvf /dev/nst0 -QV | head -5
buffer size = 32k bytes
media size = 11718720 Kilobytes (11.71 Gigabytes) usable
i 2k of 4k [1] /etc/passwd-
i 2k of 6k [1] /etc/redhat-release
i 2k of 8k [1] /etc/backuptab

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