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 |
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:
c
(cria novo arquivo)
r
(adiciona arquivos no final do pacote)
u
(adiciona arquivos somente mais novos que os do pacote)
x
(extrai arquivos contidos no pacote)
t
(lista o conteúdo do pacote, semelhante a um ls)
d
(compara conteúdo do pacote com os arquivos no sistema)
A
(concatena vários tar-files criando um pacote maior)
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:
T
(para obter a lista dos arquivos de um outro arquivo.
Interessante para preparar quais arquivos necessitam de backups)
N
(para armazenar somente arquivos mais novos que uma determinada
data)
M
(para criar/restaurar arquivos em múltiplos volumes)
P
(para manter o path absoluto nos arquivos, ou seja, não
eliminar o / inicial)
W
(para verificar após a escrita)
C
(mude para o diretório dado antes de realizar a
operação)
z
(para filtrar o arquivo gerado pelo gzip, comprimindo-o)
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
|
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.
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): |
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.
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> -print0 -printf <fmt> - prune -ls
especificações de formato (fmt)
\a (alarme), \b (backspace), \c (stop printing),
|
|
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"
|
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!