logo titulo
anterior indice proximo

Estratégias de Backup


Por mais seguro que seja, nenhum sistema pode prescindir do uso de backups. Uma falha mecânica em um disco rígido, mesmo que seja extremamente rara, pode causar transtornos numa empresa comercial, pois significa a perda total dos dados armazenados. Ou um usuário pode descuidadamente remover todos os seus arquivos (rm -rf * é a forma mais simples de fazê-lo). Por esses motivos, um administrador de sistemas deve ter em suas atribuições um esquema de salvamento dos dados com várias periodicidades, de tal modo que ele consiga recuperar em todo ou em parte o conteúdo da hierarquia de arquivos, se não instantes antes, pelo menos dias antes da ocorrência do "sinistro".

O primeiro passo é desenvolver uma estratégia de backup, respondendo as seguintes questões:

Um full backup, ou seja, o que copia todos os discos "permanentes", é uma operação que se deve evitar fazer todos os dias, por exemplo. Um backup incremental, aonde somente os arquivos modificados são copiados podem e devem ser salvos com maior periodicidade. Os sistemas derivativos do Unix suportam uma estratégia de backup multi-nível, onde o nível zero representa um backup completo e os demais, backups adicionais (incrementais), de forma a ser possível recuperar todo o sistema a menos de um dia, no caso de falha total.

Quais arquivos precisam ser salvos? São óbvios arquivos de usuários, /home, os arquivos de configuração do sistema, /etc, e possivelmente alguns subdiretórios do /var, como diretórios de mail, news (para sistemas que usam muito usenet, já praticamente defunta), e possivelmente o diretório de resources do X11, /var/X11R6/lib/app-defaults ou /etc/X11/app-defaults. O que não salvar? Evidentemente não salvaremos /proc, pois contém "pseudo-arquivos" que serão gerados pelo kernel e realmente não são necessários ao funcionamento do sistema. Voce (administrador do sistema) terá que decidir o que é realmente importante.

ferramentas úteis para backup

Backups podem ser facilmente automatizados, usando o cron para isso. As ferramentas mais comuns para efetuar as cópias, com compressão, são o tar e o cpio. Entretanto, nem o tar nem o cpio comprimem os dados diretamente, Compressores como o compress (gera arquivos .Z), gzip (arquivos .gz) e bzip2 (arquivos .bz2) são os mais usados. O utilitário find é um "canivete suiço" para encontrar arquivos por datas, dispositivos, grupos, usuários (owner), ou mesmo por expressões regulares que definam o seu filename, com muitas opções que podem ser usadas combinadamente. Se voce pretende usar fitas magnéticas (cartuchos) o mt, utilitário para posicionar, escrever EOFs, rebobinar, apagar, retensionar, etc, pode ser útil. Finalmente, o dd é um copiador mais inteligente que o cp, permitindo realizar algumas operações nos arquivos enquanto copia, tais como criar pad-bytes (bytes nulos) a cada bloco, trocar bytes pares por ímpares (swab), converter ascii em ebcdic (código de caracteres usado somente pela IBM, a ex-toda-poderosa, para ser diferente do resto do mundo) e vice-versa, entre outras. Com o barateamento dos grvadores de CDROM e CD regraváveis, estas unidades podem servir maravilhosamente como substitutos de fitas magnéticas para fins de backup. Os programas mais usados para preparação da imagem e gravação são o mkisofs, o cdrecord e o cdwrite. Existem inúmeros front-ends para o cdrecord (alguns também para o cdwrite), mas um administrador de sistemas normalmente irá criar o seu próprio front-end, pois todos eles sofrem de algumas deficiências para este tipo de utilização.

backup tools

o programa tar


Voce encontrará muitos pacotes de software com denominações tipo nome-do-pacote.tar.gz , como forma mais comum de distribuir software para o Linux. Usuários do RedHat (distribuição mais popular do Linux) irão preferir contudo arquivos .rpm, pela simplicidade de instalação, mas um verdadeiro administrador de sistemas terá que conhecer detalhadamente o tar, pois este é a ferramenta de escolha para distribuição de software, além de servir como ferramenta padrão para backup dos dados no sistema.

O seu nome provém de tape-archiver, pois o tar nada mais é que um "colecionador" de arquivos, outrora mais usado em conexão com fitas magnéticas, mas que realmente independe do meio a ser utilizado. É um programa muito rico em opções (como a maioria das ferramentas do Linux), mas somente algumas são usadas com frequência, a ponto de podermos usar um sub-conjunto bem reduzido das suas opções. De maneira geral o utilizamos como tar <opcões> -f arquivo.tar [<lista de arquivos>], onde o arquivo.tar é o pacote que queremos administrar e <lista de arquivos> é usada somente nos comandos que adicionam novos arquivos ao pacote. As opcões devem ter uma e somente uma das seguintes:

Outra opção muito usada, que pode ser combinada com qualquer das acima, é o v (de verbose), para visualizar as operações que estão sendo realizadas. O termo -f no esqueleto geral do comando acima, na verdade é uma outra opcão para informar o nome do arquivo que será o pacote. Se não fosse dado com opcão, o tar geraria a saida em stdout. Outras opções interessantes incluem:

Alguns exemplos mostram o tipo de tarefas que pode ser realizada com o tar:

criando um pacote com o conteúdo de um diretório, e comprimindo "em võo" com o gzip. ~$ tar -cvzf documentos.tar.gz ~/documentos
tar: Removing leading / from absolute path names in the archive home/rildo

home/rildo/documentos/carta-OReilly.lyx

home/rildo/documentos/declaração-IR-1997.ps
listando o conteúdo de pacote ~$ tar -tzf documentos.tar.gz
home/rildo/documentos/carta-OReilly.lyx

home/rildo/documentos/declaração-IR-1997.ps

extraindo o pacote a partir do diretório corrente, criando toda a hierarquia de diretórios ~$ tar -xzvf documentos.tar.gz
home/rildo/documentos/carta-OReilly.lyx

home/rildo/documentos/declaração-IR-1997.ps

extraindo o pacote na sua localização original ~$ tar -xzvf documentos.tar.gz -C /
home/rildo/documentos/carta-OReilly.lyx

home/rildo/documentos/declaração-IR-1997.ps

criando um arquivo em disquete, com múltiplos volumes (não pode ser usada a compressão "em võo" nesse caso, comprimir antes os arquivos) ~$ tar -xvMf /dev/fd0 ~/documentos
Prepare volume #2 for /dev/fd0 and hit return:

Prepare volume #3 for /dev/fd0 and hit return:

criando um pacote a partir de uma relação de (nomes de) arquivos em um outro arquivo. Este não poderá conter abreviaturas como "~" para indicar o path dos arquivos. A opção P é usada para conservar o path absoluto. Usamos também a opção -N para indicar a data da última modificação dos arquivos. ~$ cat lista-de-arquivos
/etc
/var/spool/mail
/home/rildo/projetos

~$ tar -czPf backup-10Jan99.tar.gz -N 01/10/1999 -T lista-de-arquivos

A melhor forma de se usar o tar para realizar backups, todavia, é através de scripts (programas em shell, por exemplo), o que será estudado posteriormente. Assim, não somente poderemos automatizar toda essa tarefa tediosa e repetitiva (para que servem os programas, afinal?), bem como definir datas e horário para que os backups sejam realizados, e então a intervenção do operador será minimizada. Somente colocar ou trocar fitas, cdroms, etc, nas unidades, e relatar eventualidades que possam acontecer. Todos os relatórios de backup, além das operações, evidentemente, ficarão inteiramente automatizados.

compressores de dados


Como vimos, o tar pode "chamar" implicitamente um compressor, que é na verdad um outro programa, durante o "empacotamento" de arquivos. Podemos usar qualquer compressor diferente com o tar, através da opção --use-compress-program PROGRAMA, desde que o programa compressor suporte a opção -d para descomprimir. Todos os compressores usados com o Linux têm essa propriedade, evidentemente. A utilização de compressores é bastante simples: gzip, por exemplo usado na forma gzip arquivo, comprime o arquivo e adiciona no final o sufixo .gz, ou seja, gera o arquivo arquivo.gz. Para descomprimir o arquivo, usamos gzip -d arquivo.gz, ou através de um alias do programa (link simbólico com outro nome): gunzip arquivo.gz.

Os compressores mais populares, em ordem de idade (mais velho primeiro são): compress/uncompress, gzip/gunzip, bzip2/bunzip2. Eventualmente, bzip2 é bem melhor que gzip, que é melhor que compress. Para se ter uma idéia, o gzip é melhor que os conhecidos winzip e pkzip do MsDos/Window95/98, por um fator de 1.2 (20%). O bzip2 é melhor ainda que o gzip, por um fator de 1.3 (trinta porcento). Essa diferença é significativa quando armazenamos quantidade massivas de dados, ou durante a transferência via rede. Do ponto de vista de segurança, inclusive, o bzip2 é um pouco mais confiável que o gzip. Portanto, sugerimos que o administrador leia os arigos (geralmente acadêmicos) sobre estes formatadores, antes de decidir pela sua escolha. E jamais use um formato zip/arj/lharc para backup para manter compatibilidade com outros sistemas operacionais. O Linux (muito mais por herança do próprio Unix), tem o estado da arte em compressão de dados, com confiabilidade e desempenho. Ademais, alguns tipos de arquivos especiais, como links, por exemplo, não podem ser salvos nos compressores comerciais ou simflificados usados na maioria dos outros sistemas operacionais.

arquivamento em cdrom


O custo decrescente dos gravadores de CDROM (tanto o tipo worm, como o regravável) e também da mídia, torna essa tecnologia atraente para sua utilização como meio de backup. O filesystem iso9660, entretanto, tem algumas características que os programas tipo tar ou cpio não se prestam à geração de imagens para gravação nesses dispositivos. O gravador deve ser alimentado com um fluxo contínuo de dados, ou toda a gravação será inutilizada, por isso precisamos preparar antecipadamente uma imagem do disco, ou parte dele, que será gravada numa operação posterior. Devido a problemas de compatibilidade com o MsDos (que definiu o padrão usados para nomes dos arquivos no formato iso9660), os nomes de arquivos precisam ser traduzidos via tabelas, para comportar nomes de arquivos maiores que os limitados por esse padrão. Dessa forma surgiu a especificação Rock-Ridge, que mapeia os nomes de arquivos Unix em arquivos com 11 caracteres (8+3), que são os gravados no disco. Com o formato RR (Rock-Ridge), os arquivos conservam os seus nomes transparentemente.

Para criar a imagem do disco, usamods um programa chamado mkisofs. Ele cria arquivos RR, salvando nomes longos, atributos como UID, GID e permissões de acesso dos arquivos, bem como arquivos especiais como dispositivos (como os que ficam normalmente no diretório /dev, por exemplo). Opcionalmente, pode gerar arquivos com o nome TRANS.TBL para realizar a tradução de nomes de arquivos longos, para sistemas operacionais que não suportem as extensões RR. Ele pode também ser usado para gerar imagens incrementais de arquivos, permitindo a gravação "parcelada" do disco, conhecida como "multi-sessão".

Criada a imagem num arquivo, podemos então montá-lo com o dispositivo loop, mostrado anteriormente, e verificar se a imagem é realmente o que desejávamos. Existem algumas ferramentas que podem ser usadas para testar a consistência da image, mas isso foge ao escopo dessa apresentação.

Finalmente, utilizamos o cdwrite ou cdrecord para gravar essa imagem no disco. Automaticamente, estes programas executam com prioridade aumentada, para evitar que outras tarefas no sistema possam tomar tempo excessivo da CPU e assim prejudicar o trabalho de gravação. É aconselhável, entretanto, que a máquina fique relativamente "light" durante essa gravação, com menos de 10% da CPU ocupada, e especialmente, com a unidade de disco de onde está sendo lida a imagem, sem muitos acessos, exceto para o próprio cdwrite ou cdrecord. Estes dois programas (cdwrite, cdrecord) são semelhantes, exceto que o cdrecord é mais recente, e como tal, suporta maior número de gravadores de cdroms.


Vejamos um exemplo de como preparar e gravar tais imagens: (para simplicidade, estamos assumindo que a variável ARQS contém uma lista dos arquivos e diretórios que queremos incluir na imagem)

     ~$ mkisofs -o cd_img -R -M /dev/scd0 -C `cdwrite -D /dev/sga -m` $ARQS
     Total extents scheduled to be written = 2312 
     Total extents actually written = 2312
     Total translation table size: 0
     Total rockridge attributes bytes: 2851
     Total directory bytes: 0
     Path table size(bytes): 10
     Max brk space used 6000
     2312 extents written (4 Mb)

     ~$ cd_write -e -v -P cd_img
     cdwrite 2.0 Track 01: data 4 Mb   pad 
     Manufacturer:  HP Model:   CD-Writer 6020 Revision: 1.07 
     Using mode:    HP 
     Using speed:   maximum
    ~$ 

Foram comandos semelhantes a estes que produziram este manual do curso em cdrom, apesar de nesse caso, não terem sidos gravados multi-sessão, mas toda a imagem de uma vez só, o que é bem mais eficiente pois perde menos espaço com os gaps entre gravações.

o canivete suiço do administrador: find


Muitas vezes estamos perdidos (ou "clueless", como se diz em inglês), com relação a quais arquivos e aonde estão, mas queremos efetuar um backup para proteger arquivos importantes e assim assegurar a nossa boa reputação. Um comando que vem nos socorrer nesse e em muitos outros casos é o find.

O comando find tem o formato geral: find <lista de diretórios> <expressão>, onde a <lista de diretórios> são nomes de diretórios separados por espaços (sem vírgulas), e a <expressão> pode conter várias opções com operadores para formar condições mais complexas, ou ser simplesmente uma opção suportada. Este é, decididamente, o comando mais complexo que vimos até o presente momento. Opcionalmente, find pode ter ações, que serão realizadas em cada arquivo (após filtragem, se fizer parte de uma expressão). A tabela abaixo mostra todos testes e ações que podem ser usados em expressões.

testes

-amin

-anewer <arquivo>

-atime n

-cmin n

-cnewer <arquivo>

-ctime n

-empty

-false

-fstype <tipo>

-gid n

-group <grupo>

-ilname <padrão>

-iname <padrão>

-inum n

-ipath <padrão>

-iregex <padrão>

-links n

-lname <padrão>

-mmin n

-mtime n

-name <padrão>

-newer <arquivo>

-nouser

-nogroup

-path <padrão>

-perm <modo>

-regex <padrão>

-size n[bckw]

-true

-type c

-uid n

-used n

-user <usuário>

-xtype c

ações

-exec <cmd>

-fls <arquivo>

-fprint <arquivo>

-fprint0 <arquivo>

-fprintf <arquivo> <fmt>

-ok <cmd>

-print

-print0

-printf <fmt>

- prune

-ls

especificações de formato (fmt)

\a (alarme), \b (backspace), \c (stop printing),
\f (form feed), \n (newline), \r (return),
\t (tab), \v (vertical tab), \\ (barra invertida),
%% (porcento), %a (tempo do último acesso no arquivo),
%Ak (tempo do último acesso, com formato especial, vide man page),
%b (tamanho do arquivo em blocos), %c (última mudança de status),
%Ck (como %Ak, para mudança no arquivo),
%d (profundidade do arquivo na árvore de diretório),
%f (nome do arquivo), %F (filesystem aonde está o arquivo),
%g (grupo do arquivo), %G (GID), %h (diretório do arquivo),
%H (argumento que foi usado p/encontrar o arquivo),
%i (i-node do arquivo), %k (tamanho em Kb do arquivo),
%l (objeto do link simbólico, se couber),
%m (permissão em octal), %n (número de hard links do arquivo),
%p (nome do arquivo), %P (nome do arquivo, com remoção do
argumento que foi usado para encontrá-lo), %s (tamanho em bytes),
%t (tempo da última modificação), %Tk ( o mesmo, formatado como
em %Ak), %u (nome do usuário), %U (UID)

Os testes podem ser combinados na forma de expressões mais complexas (1) simplesmente concatenando-os (AND), (2) com um operador "!" (NOT) para inverter o teste, (3) prefixando-o com -o ou -or (OR), (3) reagrupando vários deles com parênteses para alterar a ordem de precedência da combinação lógica destes.
Nos testes -cmin, -amin, -mmin, -ctime, -atime e -mtime, o tempo é dado como um número (n) para especificar o varlo exato do tempo, -n para indicar antes de n, +n para indicar depois de n. O mesmo é valido para o comando -size, em relação ao tamanho. O tamanho pode ter um sufixo indicando a unidade b (clocos), c (bytes, caracteres), k (kilobytes), w (words, de 2 bytes).

Alguns exemplos ilustram o uso do find:

encontrar todos os arquivos pertencentes a um usuário find / -user julius
encontrar arquivos do diretório /etc com tamanho maior ou igual a 1200 blocos find /etc -size +1200b
encontrar todos os arquivos modificados há menos que 30 dias, no diretório /home e seus subdiretórios

find /home -mtime -30
todos os arquivos *.c e *.h acessados há mais de 7 dias

os caracteres que têm interpretação especial no shell deve ser prefixados por \ para evitar a modificação feita neles pelo shell

find / \( -name \*.c -o -name \*.h \) -atime +7
um comando mais sofisticado: queremos encontrar todos os .html usados para escrever esse manual. Mas só queremos visualizar o nome do arquivo e seus tamanhos em kbytes. (a saida foi truncada, pois é muito grande!).
Veja o uso do -printf (uma ação) para realizar nossa tarefa.
find /home/rildo/Curso -name \*.html -printf "%P %k\n"

notas.html 21
intro.html 8
cap02.html 25
indice.html 3
cap01.html 20

Finalmente, o find suporta algumas opções extras, que devem ser colocadas antes dos testes, como -maxdepth <níveis> para indicar quantos níveis ele deve "descer" na hierarquia de diretórios; -mount, para não mudar de filesystem na procura (outros discos); -daystart, para medir o tempo a partir do início do dia (hoje) e não 24 horas atrás, e outras opções. Imprima o manual (com man -t find |lpr) do find e consulte-o. Ele pode salvar o seu trabalho de administrador de sistemas!


rpragana
Sat Jan 9 19:16:36 EDT 1999