Capítulo 10. Gestão de dados

Índice

10.1. Partilhar, copiar e arquivar
10.1.1. Ferramentas de arquivo e compressão
10.1.2. Ferramentas de cópia de sincronização
10.1.3. Idiomas para o arquivo
10.1.4. Idiomas para a cópia
10.1.5. Idiomas para a selecção de ficheiros
10.1.6. Salvaguarda (backup) e recuperação
10.1.7. Suites de utilitários de backup
10.1.8. Um script de exemplo para salvaguarda ao sistema
10.1.9. Um script de cópia para a salvaguarda de dados
10.1.10. Dispositivo de armazenamento amovível
10.1.11. Escolha de sistema de ficheiros para partilhar dados
10.1.12. Partilhando dados via rede
10.1.13. Meio de arquivo
10.2. A imagem de disco
10.2.1. Criando o ficheiro de imagem de disco
10.2.2. Escrever directamente no disco
10.2.3. Montar o ficheiro de imagem de disco
10.2.4. Limpar um ficheiro de imagem de disco
10.2.5. Criar um ficheiro de imagem de disco vazio
10.2.6. Criar o ficheiro de imagem ISO9660
10.2.7. Escrever directamente para o CD/DVD-R/RW
10.2.8. Montar o ficheiro de imagem ISO9660
10.3. Os dados binários
10.3.1. Ver e editar dados binários
10.3.2. Manipular ficheiros sem montar o disco
10.3.3. Redundância de dados
10.3.4. Recuperação de ficheiros e dados e análise forense
10.3.5. Dividir um ficheiro grande em ficheiros pequenos
10.3.6. Limpar conteúdo de ficheiro
10.3.7. Ficheiros dummy
10.3.8. apagar um disco rígido inteiro
10.3.9. Apagar uma área não utilizada do disco rígido
10.3.10. Recuperar ficheiros apagados mas ainda abertos
10.3.11. Procurar todos os hardlinks
10.3.12. Consumo invisível do espaço do disco
10.4. Infraestrutura da segurança de dados
10.4.1. Gestão de chaves para GnuPG
10.4.2. Usa GnuPG em ficheiros
10.4.3. Usar GnuPG com o Mutt
10.4.4. Usar GnuPG com o Vim
10.4.5. O valor de controlo MD5
10.5. Ferramentas de fusão de código fonte
10.5.1. Extrair as diferenças para ficheiros fonte
10.5.2. Fundir actualizações para ficheiros de fonte
10.5.3. Actualizar via fusão-de-3-vias
10.6. Sistemas de controle de versão
10.6.1. Comparação dos comandos VCS
10.7. CVS
10.7.1. Configuração de repositório CVS
10.7.2. Acesso local ao CVS
10.7.3. Acesso remoto ao CVS com pserver
10.7.4. Acesso remoto ao CVS com ssh
10.7.5. Importar uma nova fonte para o CVS
10.7.6. Permissões de ficheiros no repositório CVS
10.7.7. Fluxo de trabalho do CVS
10.7.8. Ficheiros mais recentes do CVS
10.7.9. Administração do CVS
10.7.10. Bit de execução para verificação do CVS
10.8. Subversion
10.8.1. Configuração do repositório Subversion
10.8.2. Acesso ao Subversion via servidor Apache2
10.8.3. Acesso local ao Subversion pelo grupo
10.8.4. Acesso remoto ao Subversion via SSH
10.8.5. Estrutura de directórios do Subversion
10.8.6. importar uma nova fonte para o Subversion
10.8.7. Fluxo de trabalho do Subversion
10.9. Git
10.9.1. Configuração do cliente Git
10.9.2. Referências do Git
10.9.3. Comandos do Git
10.9.4. Git para o repositório Subversion
10.9.5. Git para gravar o histórico de configuração

São descritas ferramentas e dicas para gerir dados binários e de texto no sistema Debian.

[Atenção] Atenção

O acesso de escrita descoordenado a dispositivos acedidos activamente e a ficheiros a partir de múltiplos processos não deve ser feito para evitar a condição de competição. Devem ser usados mecanismos de bloqueio de ficheiro que usem o flock(1) para o evitar.

10.1. Partilhar, copiar e arquivar

A segurança dos dados e a sua partilha controlada têm vários aspectos.

  • A criação de um arquivo de dados

  • O acesso a armazenamento remoto

  • A duplicação

  • O acompanhar do histórico de modificação

  • A facilitação da partilha de dados

  • A prevenção de acessos não autorizados a ficheiros

  • A detecção de modificação não autorizada de ficheiros

Estas podem ser realizadas usando a combinação de algumas ferramentas

  • Ferramentas de arquivo e compressão

  • Ferramentas de cópia de sincronização

  • Sistemas de ficheiros de rede

  • Media de armazenamento amovível

  • A shell segura

  • O sistema de autenticação

  • Ferramentas de sistema de controle de versão

  • Ferramentas de hash e encriptação criptográfica

10.1.1. Ferramentas de arquivo e compressão

Aqui está um sumário das ferramentas de arquivo e compressão disponíveis no sistema Debian.

Tabela 10.1. Lista de ferramentas de arquivo e compressão

pacote popcon tamanho extensão comando comentário
tar V:568, I:999 2464 .tar tar(1) o arquivador standard (de facto standard)
cpio V:508, I:998 855 .cpio cpio(1) arquivador estilo Unix System V, usar com o find(1)
binutils V:550, I:741 14618 .ar ar(1) arquivador para a criação de bibliotecas estáticas
fastjar V:13, I:130 191 .jar fastjar(1) arquivador para Java (estilo zip)
pax V:23, I:82 181 .pax pax(1) novo arquivador standard do POSIX, um compromisso entre tar e cpio
gzip V:901, I:999 202 .gz gzip(1), zcat(1), … LZ77 utilitário de compressão do GNU (o standard de facto)
bzip2 V:491, I:812 91 .bz2 bzip2(1), bzcat(1), … Compressão de organização de blocos de Burrows-Wheeler utilitário com um rácio de compressão mais alto que o gzip(1) (mais lento que o gzip com sintaxe semelhante)
lzma V:27, I:304 144 .lzma lzma(1) LZMA utilitário de compressão com rácio de compressão mais alto que o gzip(1) (descontinuado)
xz-utils V:196, I:831 470 .xz xz(1), xzdec(1), … XZ utilitário de compressão com rácio de compressão mais alto que o bzip2(1) (mais lento que o gzip mas mais rápido que o bzip2; substituto para o utilitário de compressão LZMA)
p7zip V:11, I:101 986 .7z 7zr(1), p7zip(1) 7-Zip arquivador de ficheiros com alta taxa de compressão (compressão LZMA)
p7zip-full V:256, I:449 3895 .7z 7z(1), 7za(1) 7-Zip arquivador de ficheiros com rácio de compressão alto (LZMA compressão e outros)
lzop V:4, I:42 112 .lzo lzop(1) LZO utilitário de compressão com mais alta compressão e mais rápida descompressão que o gzip(1) (rácio de compressão mais baixo que o gzip com sintaxe semelhante)
zip V:63, I:388 597 .zip zip(1) InfoZIP: ferramenta de compressão e arquivo do DOS
unzip V:287, I:714 377 .zip unzip(1) InfoZIP: ferramenta de descompressão e de desarquivar do DOS

[Atenção] Atenção

Não defina a variável "$TAPE" a menos que saiba com o que esperar. Altera o comportamento do tar(1).

[Nota] Nota

O arquivo tar(1) gzipado usa a extensão de ficheiro ".tgz" ou ".tar.gz".

[Nota] Nota

O arquivo tar(1) comprimido em xz usa a extensão de ficheiro ".txz" ou ".tar.xz".

[Nota] Nota

Método de compressão popular em ferramentas FOSS tal como o tar(1) têm se movido como se segue: gzipbzip2xz

[Nota] Nota

cp(1), scp(1) e tar(1) podem ter algumas limitações para ficheiros especiais. cpio(1) é o mais versátil.

[Nota] Nota

O cpio(1) é desenhado para ser utilizado com o find(1) e outros comandos e apropriado para criar scripts de backup pois a parte de selecção de ficheiros do script pode ser testada independentemente.

[Nota] Nota

A estrutura interna dos ficheiros de dados do OpenOffice são ficheiros ".jar".

10.1.2. Ferramentas de cópia de sincronização

Aqui está um sumário de ferramentas de cópia simples e salvaguarda disponíveis no sistema Debian.

Tabela 10.2. Lista de ferramentas de cópia e sincronização

pacote popcon tamanho ferramenta função
coreutils V:901, I:999 14184 GNU cp copia localmente ficheiros e directórios ("-a" para ser recursivo)
openssh-client V:563, I:995 2276 scp copia remotamente ficheiros e directórios (cliente, "-r" para ser recursivo)
openssh-server V:683, I:843 708 sshd copia ficheiros e directórios remotamente (servidor remoto)
rsync V:198, I:612 638 - sincronização remota a salvaguarda de 1 via
unison V:8, I:29 1987 - sincronização remota a salvaguarda de 2 vias

Copiar ficheiros com o rsync(8) oferece funcionalidades mais ricas que os outros.

  • algoritmo de transferência delta que envia apenas as diferenças entre os ficheiros da fonte e os ficheiros existentes no destino

  • algoritmo de verificação rápida (predefinido) que procura ficheiros que alteraram no tamanho ou hora da última modificação

  • opções "--exclude" e "--exclude-from" semelhantes ao tar(1)

  • sintaxe de "uma barra final no directório fonte" que evita a criação de um nível de directório adicional no destino.

[Dica] Dica

A execução do script bkup mencionado em Secção 10.1.9, “Um script de cópia para a salvaguarda de dados” com a opção "-gl" sob cron(8) deverá disponibilizar uma funcionalidade muito semelhante como o dumpfs do Plan9 para o arquivo de dados estático.

[Dica] Dica

Ferramentas de sistema de controlo de versão (VCS) em Tabela 10.15, “lista de ferramentas de sistemas de controle de versão” podem funcionar como a copia de multi-modos e ferramentas de sincronização.

10.1.3. Idiomas para o arquivo

Aqui estão várias maneiras de arquivar e "desarquivar" o conteúdo completo do directório "./source" usando diferentes ferramentas.

GNU tar(1):

$ tar cvzf archive.tar.gz ./source
$ tar xvzf archive.tar.gz

cpio(1):

$ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; gzip archive.cpio
$ zcat archive.cpio.gz | cpio -i

10.1.4. Idiomas para a cópia

Aqui estão algumas maneiras de copiar o conteúdo inteiro do directório "./source" usando diferentes ferramentas.

  • Cópia local: directório "./source" → directório "/dest"

  • Cópia remota: directório "./source" em máquina local → directório "/dest" na máquina "utilizador@máquina.domínio"

rsync(8):

# cd ./source; rsync -av . /dest
# cd ./source; rsync -av . utilizador@máquina.domínio:/dest

Você pode alternativamente usar a sintaxe de "uma barra à direita no directório fonte".

# rsync -av ./source/ /dest
# rsync -av ./source/ utilizador@máquina.domínio:/dest

cp(1) de GNU e scp(1) de openSSH:

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . utilizador@máquina.domínio:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh utilizador@máquina.domínio '(cd /dest && tar xvfp - )'

cpio(1):

# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

Pode substituir "." por "foo" para todos os exemplos que contenham "." para copiar ficheiros do directório "./source/foo" para o directório "/dest/foo".

Pode substituir "." pelo caminho absoluto "/caminho/para/fonte/foo" para todos os exemplos que contenham "." para abandonar "cd ./source;". Estes copiam ficheiros para localizações diferentes dependendo das ferramentas utilizadas conforme se segue.

  • "/dest/foo": rsync(8), cp(1) do GNU, e scp(1)

  • "/path/to/source/foo": GNU tar(1), e cpio(1)

[Dica] Dica

rsync(8) e cp(1) do GNU têm a opção "-u" para saltar ficheiros que são mais recentes no receptor.

10.1.5. Idiomas para a selecção de ficheiros

O find(1) é usado para seleccionar ficheiros para o arquivo e copiar comandos (veja Secção 10.1.3, “Idiomas para o arquivo” e Secção 10.1.4, “Idiomas para a cópia”) ou para xargs(1) (veja Secção 9.5.9, “Repetindo um ciclo de comandos sobre ficheiros”). Isto pode ser melhorado ao usar os seus argumentos de comando.

A sintaxe básica de find(1) pode ser sumariada no seguinte.

  • Os seus argumentos condicionais são avaliados da esquerda para a direita.

  • Esta avaliação pára assim que o seu resultado é determinado.

  • O "OU lógico" (especificado por "-o" entre condicionais) tem precedência mais baixa que o "E lógico" (especificado por "-a" ou nada entre condicionais).

  • O "NÃO lógico" (especificado por "!" antes duma condicional) tem precedência mas alta que o "E lógico".

  • "-prune" retorna sempre o VERDADEIRO lógico e, se for um directório, a busca de ficheiro é parada para além deste ponto.

  • "-name" corresponde à base do nome de ficheiro com glob de shell (veja Secção 1.5.6, “Glob da shell”) mas também corresponde ao seu "." inicial com meta-caracteres como o "*" e o "?". (Nova funcionalidade do POSIX)

  • "-regex" corresponde ao caminho completo com estilo emacs BRE (veja Secção 1.6.2, “Expressões regulares”) como predefinição.

  • "-size" corresponde ao ficheiro baseado no tamanho do ficheiro (valor precedido de "+" para maior, precedido de "-" para menor)

  • "-newer" corresponde ao ficheiro mais recente que aquele especificado no seu argumento.

  • "-print0" retorna sempre o TRUE lógico e escreve o nome de ficheiro completo (terminado em nulo) na saída standard.

O find(1) é usado geralmente com um estilo idiomático como se segue.

# find /caminho/para \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /caminho/para/timestamp -print0

Isto significa fazer as seguintes acções.

  1. Procurar todos os ficheiros que começam por "/caminho/para"

  2. Limitar globalmente a sua busca dentro do sistema de ficheiros inicial e usa ERE (veja antes Secção 1.6.2, “Expressões regulares”)

  3. Excluir da busca os ficheiros que correspondem à expressão regular ".*\.cpio" ou ".*~" ao parar o processamento

  4. Excluir da busca os directórios que correspondem à expressão regular ".*/\.git" ao parar o processamento

  5. Exclui da busca os ficheiros maiores que 99 Mb (unidades de 1048576 bytes) ao parar o processamento

  6. Escrever os nomes de ficheiros que satisfazem as condições de busca em cima e são mais recentes que "/caminho/para/timestamp"

Por favor note a utilização idiomática de "-prune -o" para excluir ficheiros no exemplo em cima.

[Nota] Nota

Para um sistema não-Debian tipo Unix, algumas opções podem não ser suportadas pelo find(1). Em tal caso, por favor considere ajustar os métodos de correspondência e substitua "-print0" por "-print". Você poderá ter que ajustar também os comandos relacionados.

10.1.6. Salvaguarda (backup) e recuperação

Todos nós sabemos que os computadores avariam ou que erros humanos causam danos no sistema e nos dados. As operações de salvaguarda e recuperação são a parte essencial sucesso do administrador de sistemas. Todos os modos de falha possíveis irão atingi-lo um dia.

[Dica] Dica

Mantenha o seu sistema de backup simples e faça backups periódicos. Ter cópias de segurança dos dados é mais importante do que quão bom é tecnicamente o seu método de backup.

Existem 3 factores chave que determinam a política actual de salvaguarda e recuperação.

  1. Saber o que salvaguardar e recuperar.

    • Ficheiros de dados criados directamente por si: dados em "~/"

    • Ficheiros de dados criados por aplicações usadas por si: dados em "/var/" (excepto "/var/cache/", "/var/run/", e "/var/tmp/")

    • Ficheiros de configuração do sistema: dados em "/etc/"

    • Softwares locais: dados em "/usr/local/" ou "/opt/"

    • Informação da instalação do sistema: um memo em texto simples em passos chave (partição, ...)

    • Conjunto de dados de prova: confirmado com antecedência por operações de recuperação experimentais

  2. Saber como salvaguardar e recuperar

    • Armazenamento de dados seguro: protecção contra reescrita e falha do sistema

    • Salvaguarda frequente: salvaguarda agendada

    • Backup redundante: usar mirror de dados

    • Processo à prova de tolos: backup fácil de comando único

  3. Avaliar os riscos e custos envolvidos.

    • O valor dos dados quando perdidos

    • Recursos necessários para o backup: humano, hardware, software, ...

    • Modo de falha e a sua possibilidade

Para o armazenamento seguro de dados, os dados devem estar pelo menos em partições de disco diferentes de preferência em discos e máquinas diferentes para sobreviverem à corrupção do sistema de ficheiros. Os dados importantes ficam melhor armazenados em medias onde só se escreve uma vez, como os CD/DVD-R para prevenir serem sobrescritos por acidente. (veja Secção 10.3, “Os dados binários” para como escrever na media de armazenamento a partir da linha de comandos shell. O ambiente gráfico de trabalho GNOME dá-lhe acesso fácil via menu: "Acessórios→Criador de CD/DVD".)

[Nota] Nota

Você pode desejar parar alguns daemons de aplicação como o MTA (veja Secção 6.3, “Agente de transporte de mail (MTA)”) enquanto faz cópias de segurança (backups) dos dados.

[Nota] Nota

Você deve ter cuidados extra com o backup e restauro de ficheiros de dados relacionados com identidade como os "/etc/ssh/ssh_host_dsa_key", "/etc/ssh/ssh_host_rsa_key", "~/.gnupg/*", "~/.ssh/*", "/etc/passwd", "/etc/shadow", "/etc/fetchmailrc", "popularity-contest.conf", "/etc/ppp/pap-secrets", e "/etc/exim4/passwd.client". Alguns destes dados não podem ser regenerados ao inserir a mesma string de entrada ao sistema.

[Nota] Nota

Se você correr uma tarefa cron como um processo de utilizador, você tem de restaurar os ficheiros no directório "/var/spool/cron/crontabs" e reiniciar o cron(8). Veja Secção 9.5.14, “Agendar tarefas regularmente” para cron(8) e crontab(1).

10.1.7. Suites de utilitários de backup

Aqui está uma lista seleccionada de suites de utilitários de backup notáveis disponíveis no sistema Debian.

Tabela 10.3. Lista de suites utilitárias de salvaguarda

pacote popcon tamanho descrição
obnam V:0, I:1 409 salvaguarda incremental (remoto)
rdiff-backup V:13, I:29 704 salvaguarda incremental (remoto)
dump V:3, I:12 716 4.4 BSD dump(8) e restore(8) para sistemas de ficheiros ext2/ext3
xfsdump V:1, I:20 595 dump e restore com xfsdump(8) e xfsrestore(8) para sistema de ficheiros XFS em GNU/Linux e IRIX
backupninja V:4, I:5 277 sistema de meta-backup leve e extensível
sbackup V:0, I:0 488 suite de salvaguarda simples para o ambiente GNOME
bacula-common V:12, I:25 1148 Bacula: salvaguarda, recuperação e verificação em rede - ficheiros de suporte comum
bacula-client I:8 102 Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote cliente
bacula-console V:3, I:11 162 Bacula: salvaguarda, recuperação e verificação em rede - consola de texto
bacula-server I:4 102 Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote servidor
amanda-common V:3, I:6 6825 Amanda: Advanced Maryland Automatic Network Disk Archiver (Bibliotecas)
amanda-client V:3, I:6 718 Amanda: Advanced Maryland Automatic Network Disk Archiver (Cliente)
amanda-server V:0, I:2 845 Amanda: Advanced Maryland Automatic Network Disk Archiver (Servidor)
backuppc V:7, I:9 1956 BackupPC é um sistema de grau empresarial de alta performance para fazer salvaguardas a PCs (baseado em disco)
backup-manager V:3, I:5 615 ferramenta de salvaguarda de linha de comandos
backup2l V:1, I:2 86 ferramenta de baixa manutenção para salvaguarda/restauro para medias montáveis (baseado em disco)

As ferramentas de salvaguarda têm os seus objectivos especializados.

  • Mondo Rescue é um sistema de backup para facilitar o restauro de um sistema completo rapidamente a partir de CD/DVD, etc de backup, sem se passar por todo o processo normal de instalação do sistema.

  • Os pacotes sbackup e keep disponibilizam frontends GUI para utilizadores de ambiente de trabalho para fazerem cópias de segurança regulares dos dados do utilizador. Uma função equivalente pode ser realizada por um único script (Secção 10.1.8, “Um script de exemplo para salvaguarda ao sistema”) e o cron(8).

  • Bacula, Amanda, e BackupPC são suites utilitárias de salvaguarda cheias de funcionalidades que se destinam a salvaguardas regulares em rede.

Ferramentas básicas descritas em Secção 10.1.1, “Ferramentas de arquivo e compressão” e Secção 10.1.2, “Ferramentas de cópia de sincronização” podem ser usadas facilitar o backup do sistema via scripts personalizados. Tal script pode ser melhorado com o seguinte.

  • O pacote rdiff-backup permite salvaguardas incrementais (remotas).

  • O pacote dump ajuda a arquivar e restaurar o sistema de ficheiros completo de modo incremental e eficiente.

[Dica] Dica

Veja os ficheiros em "/usr/share/doc/dump/" e "está o dump mesmo obsoleto?" para aprender acerca do pacote dump.

10.1.8. Um script de exemplo para salvaguarda ao sistema

Para um sistema de ambiente de trabalho Debian pessoal que corre a suite unstable, Eu apenas preciso de proteger os dados pessoais e críticos. Eu reinstalo o sistema uma vez por ano de qualquer maneira. Assim não vejo razão para fazer backup ao sistema completo ou para instalar um utilitário de backup cheio de funcionalidades.

Eu uso um script simples para fazer um arquivo salvaguarda e gravá-lo em CD/DVD usando uma GUI. Aqui está um script exemplo para tal.

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
BUUID=1000; USER=osamu # UID and name of a user who accesses backup files
BUDIR="/var/backups"
XDIR0=".+/Mail|.+/Desktop"
XDIR1=".+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions"
XDIR2=".+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp"
XSFX=".+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.cpio|.+\.tmp|.+\.swp|.+~"
SIZE="+99M"
DATE=$(date --utc +"%Y%m%d-%H%M")
[ -d "$BUDIR" ] || mkdir -p "BUDIR"
umask 077
dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list
debconf-get-selections > /var/cache/debconf/debconf-selections

{
find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \
     /var/cache/debconf/debconf-selections -xdev -print0
find /home/$USER /root -xdev -regextype posix-extended \
  -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0
find /home/$USER/Desktop  -xdev -regextype posix-extended \
  -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
} | cpio -ov --null -O $BUDIR/BU$DATE.cpio
chown $BUUID $BUDIR/BU$DATE.cpio
touch $BUDIR/backup.stamp

Este é suposto ser um script de exemplo executado pelo root.

Eu espero que você altere e execute isto conforme o seguinte.

Mantenha a coisa simples!

[Dica] Dica

Você pode recuperar dados configuração debconf com "debconf-set-selections debconf-selections" e dados de selecção do dpkg com "dpkg --set-selection <dpkg-selections.list".

10.1.9. Um script de cópia para a salvaguarda de dados

Para o conjunto de dados sob uma árvore de directórios, a cópia com "cp -a" disponibiliza um backup normal.

Para o conjunto de grandes dados estáticos não-sobrescritos sob uma árvore de directórios como aquela sob o directório "/var/cache/apt/packages/", os hardlinks com "cp -al" disponibilizam uma alternativa ao backup normal com uso eficiente do espaço do disco.

Aqui está um script de cópia, que Eu chamei de bkup, para o backup de dados. O script copia todos os ficheiro (não-VCS) sob o directório actual para o directório datado no directório pai ou numa máquina remota.

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;}
fall(){ find . -print0;}
mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;}
FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)"
BKUP="$(basename $(pwd)).bkup";TIME="$(date  +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME"
while getopts gcCsStrlLaAxe:h:T f; do case $f in
g)  MODE="GNUCP";; # cp (GNU)
c)  MODE="CPIOP";; # cpio -p
C)  MODE="CPIOI";; # cpio -i
s)  MODE="CPIOSSH";; # cpio/ssh
t)  MODE="TARSSH";; # tar/ssh
r)  MODE="RSYNCSSH";; # rsync/ssh
l)  OPT="-alv";; # hardlink (GNU cp)
L)  OPT="-av";;  # copy (GNU cp)
a)  FIND="fall";; # find all
A)  FIND="fdot";; # find non CVS/ .???/
x)  set -x;; # trace
e)  EXTP="${OPTARG}";; # hostname -f
h)  HOST="${OPTARG}";; # user@remotehost.example.com
T)  MODE="TEST";; # test find mode
\?) echo "use -x for trace."
esac; done
shift $(expr $OPTIND - 1)
if [ $# -gt 0 ]; then
  for x in $@; do cp $OPT $x $x.$TIME; done
elif [ $MODE = GNUCP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/"
elif [ $MODE = CPIOP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU"
  $FIND|cpio --null --sparse -pvd ../$BU
elif [ $MODE = CPIOI ]; then
  $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i )
elif [ $MODE = CPIOSSH ]; then
  $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )"
elif [ $MODE = TARSSH ]; then
  (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )"
elif [ $MODE = RSYNCSSH ]; then
  rsync -rlpt ./ "${HOST}:${EXTP}-${BKUP}-${TIME}"
else
  echo "Any other idea to backup?"
  $FIND |xargs -0 -n 1 echo
fi

Isto é suposto ser exemplos de comandos. Por favor, leia o script e edite-o à sua necessidade antes de o usar.

[Dica] Dica

Eu tenho este bkup no meu directório "/usr/local/bin/". Eu chamo este comando bkup sem nenhuma opção no directório de trabalho sempre que preciso duma imagem de backup temporária.

[Dica] Dica

Para fazer um histórico de imagens de uma árvore de ficheiros fonte ou duma árvore de ficheiros de configuração, é mais fácil e eficiente em espaço usar o git(7) (veja Secção 10.9.5, “Git para gravar o histórico de configuração”).

10.1.10. Dispositivo de armazenamento amovível

Dispositivos de armazenamento amovível podem ser qualquer um dos seguintes.

Podem ser ligados por qualquer um dos seguintes:

Os ambientes de trabalho modernos tais como o GNOME e KDE podem montar automaticamente estes dispositivos amovíveis sem uma entrada correspondente no "/etc/fstab"

  • O pacote udisks disponibiliza um daemon e utilitários associados para (des)montar esses dispositivos.

  • D-bus cria eventos para iniciar processos automáticos.

  • PolicyKit disponibiliza os privilégios necessários.

[Dica] Dica

Os dispositivos auto-montados podem ter a opção de montagem "uhelper=" que é utilizada por umount(8).

[Dica] Dica

A auto-montagem em ambientes de trabalho modernos apenas acontece quando esses dispositivos amovíveis não estão listados em "/etc/fstab".

O ponto de montagem num ambiente de trabalho moderno é escolhido como "/media/<disk_label>", o qual pode ser personalizado conforme o seguinte:

  • mlabel(1) para o sistema de ficheiros FAT

  • genisoimage(1) com a opção "-V" para o sistema de ficheiros ISO9660

  • tune2fs(1) com a opção "-L" para sistemas de ficheiros ext2/ext3/ext4

[Dica] Dica

A escolha de codificação pode necessitar de ser disponibilizada como opção de montagem (veja Secção 8.3.6, “Codificação de nomes de ficheiros”).

10.1.11. Escolha de sistema de ficheiros para partilhar dados

Quando partilha dados com outros sistemas via dispositivos de armazenamento amovível, você deve formatá-lo num sistema de ficheiros comum que seja suportado pelos dois sistemas. Aqui está uma lista de escolhas de sistemas de ficheiros.

Tabela 10.4. Lista de hipóteses de sistemas de ficheiros para dispositivos de armazenamento amovíveis com cenários de utilização típica

sistema de ficheiros descrição do cenário de utilização típico
FAT12 partilha de dados em várias plataformas em disquetes (<32MiB)
FAT16 partilha de dados em várias plataformas em dispositivos como pequenos discos rígidos (<2GiB)
FAT32 partilha de dados em várias plataformas em dispositivos como grandes discos rígidos (<8TiB, suportado por mais recente que MS Windows95 OSR2)
NTFS partilha de dados em várias plataformas em dispositivos como grandes discos rígidos (suportado nativamente no MS Windows NT e versões posteriores, e suportado pelo NTFS-3G via FUSE em Linux)
ISO9660 partilha de dados estáticos em várias plataformas em CD-R e DVD+/-R
UDF escrita de dados incremental em CD-R e DVD+/-R (novo)
sistema de ficheiros MINIX armazenamento de dados em ficheiros unix eficiente em espaço em disquetes
sistema de ficheiros ext2 partilha de dados em dispositivos tipo disco rígido com sistemas Linux mais antigos
sistema de ficheiros ext3 partilha de dados em dispositivos tipo disco rígido com sistemas Linux mais antigos
sistema de ficheiros ext4 partilha de dados em dispositivos de tipo disco rígido com sistemas Linux actuais

[Dica] Dica

Veja Secção 9.4.1, “Encriptação de discos amovíveis com dm-crypt/LUKS” para partilha de dados em várias plataformas usando encriptação ao nível do dispositivo.

O sistema de ficheiros FAT é suportado pela maioria dos sistemas operativos modernos e é bastante útil para objectivos de trocas de dados via dispositivos tipo disco rígido.

Quando formatar dispositivos tipo disco rígido amovíveis para partilha de dados em multi-plataformas com o sistema de ficheiros FAT, as seguintes deverão ser escolhas seguras.

  • Particioná-los com o fdisk(8), cfdisk(8) ou parted(8) (veja Secção 9.3.2, “Configuração das partições do disco”) numa única partição primária e marcá-la como se segue.

    • Tipo "6" para FAT16 para médias inferiores a 2GB

    • Tipo "c" para FAT32 (LBA) para médias maiores

  • Formatar a partição primária com o mkfs.vfat(8) com o seguinte.

    • Apenas o seu nome de dispositivo, ex. "/dev/sda1" para FAT16

    • A opção explícita e o seu nome de dispositivo, ex. "-F 32 /dev/sda1" para FAT32

Quando se usa sistemas de ficheiros FAT ou ISO9660 para partilhar dados, as considerações de segurança deverão ser as seguintes.

  • Arquivar ficheiros para um ficheiro de arquivo primeiro utilizando o tar(1), ou cpio(1) para reter o nome longo do ficheiro, o link simbólico, as permissões originais de ficheiro Unix e a informação do dono.

  • Dividir o ficheiro de arquivo em fatias com menos de 2 GiB com o comando split(1) para o proteger contra limites de tamanho de ficheiro.

  • Encriptar o ficheiro de arquivo para tornar seguro o seu conteúdo contra acesso não autorizado.

[Nota] Nota

Para o sistema de ficheiros FAT pelo seu desenho, o tamanho máximo de ficheiro é (2^32 - 1) bytes = (4GiB - 1 byte). Para algumas aplicações do antigo SO de 32 bits, o tamanho máximo de ficheiro é mais pequeno (2^31 - 1) bytes = (2GiB - 1 byte). O Debian não sofre do segundo problema.

[Nota] Nota

A própria Microsoft não recomenda o uso de FAT para discos ou partições maiores que 200 MB. A Microsoft destaca as suas deficiências como sendo a utilização ineficiente do espaço do disco na sua "Visão geral dos sistemas de ficheiros FAT, HPFS, e NTFS". Claro que, nós devemos normalmente usar o sistema de ficheiros ext4 para Linux.

[Dica] Dica

Para mais sistemas de ficheiros e acesso a sistemas de ficheiros, por favor leia "HOWTO dos Sistemas de Ficheiros".

10.1.12. Partilhando dados via rede

Quando se partilha dados com outro sistema via rede, você deve usar serviços comuns. Aqui estão algumas dicas.

Tabela 10.5. Lista de serviços de rede para escolher com o cenário de utilização típico

serviço de rede descrição do cenário de utilização típico
SMB/CIFS sistema de ficheiros montado em rede com o Samba partilha ficheiros via "Rede Microsoft Windows", veja smb.conf(5) e O HOWTO Oficial do Samba 3.2.x e Guia de Referência ou o pacote samba-doc
NFS sistema de ficheiros montado em rede com o kernel do Linux. partilhar ficheiros via "Rede Unix/Linux", veja exports(5) e Linux NFS-HOWTO
serviço HTTP partilhando ficheiros entre o servidor/cliente web
serviço HTTPS partilhar ficheiros entre o servidor/cliente web com Secure Sockets Layer encriptado (SSL) ou Transport Layer Security (TLS)
serviço FTP partilhando ficheiros entre o servidor/cliente FTP

Apesar de estes sistemas de ficheiros montados sobre rede e métodos de transferência de ficheiros em rede serem bastante convenientes para partilhar dados, estes podem ser inseguros. A sua ligação de rede tem de ser segurada com o seguinte.

  • Encriptar com SSL/TLS

  • Ligue-o em túnel via SSH

  • Ligue-o em túnel via VPN

  • Limitar por detrás da firewall segura

Veja também Secção 6.10, “Outras aplicações de servidor de rede” e Secção 6.11, “Outros clientes de aplicação de rede”.

10.1.13. Meio de arquivo

Quando escolher o meio de armazenamento de dados de computador para arquivar dados importantes, deverá ter cuidado com as suas limitações. Para os pequenos backups de dados pessoais, Eu uso CD-R e DVD-R de uma boa marca e guardo-os num ambiente fresco, à sombra, seco e limpo. (O meio de cassete de fita magnética parece ser popular para uso profissional.)

[Nota] Nota

A segurança de resistência ao fogo destina-se a documentos de papel. A maioria dos meios de armazenamento de dados de computador têm menos tolerância à temperatura que o papel. Geralmente Eu confio em múltiplas cópias de segurança encriptadas em múltiplas localizações seguras.

A duração de vida optimista de meios de arquivo vista na net (a maioria é informação do fabricante).

  • + de 100 anos : Papel livre de ácidos com tinta

  • 100 anos : Armazenamento óptico (CD/DVD, CD/DVD-R)

  • 30 anos : Armazenamento magnético (fita, disquete)

  • 20 anos : Armazenamento óptico de mudança de fase (CD-RW)

Estes não contam com falhas mecânicas devido a manuseamento e etc.

Ciclos de escrita optimistas dos meios de arquivo vistos na net (a maioria é informação do fabricante).

  • + de 250,000 ciclos : Disco rígido

  • + de 10,000 ciclos : Memória Flash

  • 1,000 ciclos : CD/DVD-RW

  • 1 ciclo : CD/DVD-R, papel

[Cuidado] Cuidado

As figuras de vida de armazenamento e ciclos de escrita mostradas aqui não devem ser usadas para decisões em qualquer armazenamento de dados crítico. Por favor consulte a informação específica do produto disponibilizada pelo fabricante.

[Dica] Dica

Como os CD/DVD-R e o papel têm apenas 1 ciclo de escrita, eles previnem perdas de dados acidentais ao sobrescrever. Isto é uma vantagem!

[Dica] Dica

Se você precisa dum backup rápido e frequente de grandes quantidades de dados, um disco rígido numa máquina remota ligada por uma ligação de rede rápida, pode ser a única opção realista.

10.2. A imagem de disco

Aqui discutimos manipulações da imagem do disco. Veja também Secção 9.3, “Dicas de armazenamento de dados”.

10.2.1. Criando o ficheiro de imagem de disco

O ficheiro de imagem de disco, "disco.img", de um dispositivo não montado, ex., a segunda drive SCSI "/dev/sdb", pode ser feito usando o cp(1) ou o dd(1) com o seguinte.

# cp /dev/sdb disco.img
# dd if=/dev/sdb of=disco.img

O master boot record (MBR) da imagem de disco dos PC's tradicionais (veja Secção 9.3.2, “Configuração das partições do disco”) que reside no primeiro sector no disco IDE primário pode ser feito usando o dd(1) com o seguinte.

# dd if=/dev/hda of=mbr.img bs=512 count=1
# dd if=/dev/hda of=mbr-nopart.img bs=446 count=1
# dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
  • "mbr.img": O MBR com a tabela de partições

  • "mbr-nopart.img": O MBR sem a tabela de partições

  • "part.img": A tabela de partições apenas do MBR

Se você tem um dispositivo SCSI (incluindo a nova drive serial ATA) como o disco de arranque, substitua "/dev/hda" por "/dev/sda".

Se você está a criar uma imagem de uma partição de disco do disco original, substitua "/dev/hda" por "/dev/hda1" etc.

10.2.2. Escrever directamente no disco

O ficheiro de imagem de disco "disk.img" pode ser escrito para um dispositivo desmontado, ex. a segunda drive SCSI "/dev/sdb" como tamanho correspondente, com o seguinte.

# dd if=disk.img of=/dev/sdb

Se modo semelhante, o ficheiro de imagem de partição de disco, "partition.img" pode ser escrito para uma partição desmontada, ex., a primeira partição do segundo disco SCSI "/dev/sdb1" com tamanho correspondente, com o seguinte.

# dd if=partition.img of=/dev/sdb1

10.2.3. Montar o ficheiro de imagem de disco

A imagem de disco "partition.img" que contém uma partição única pode ser montada e desmontada ao usar o dispositivo loop como se segue.

# losetup -v -f partition.img
Loop device is /dev/loop0
# mkdir -p /mnt/loop0
# mount -t auto /dev/loop0 /mnt/loop0
...hack...hack...hack
# umount /dev/loop0
# losetup -d /dev/loop0

Isto pode ser simplificado como se segue.

# mkdir -p /mnt/loop0
# mount -t auto -o loop partition.img /mnt/loop0
...hack...hack...hack
# umount partition.img

Cada partição da imagem de disco "disk.img" que contém múltiplas partições pode ser montada usando o dispositivo loop. Como o dispositivo loop não gere partições por predefinição, temos que o redefinir como se segue.

# modinfo -p loop # verify kernel capability
max_part:Maximum number of partitions per loop device
max_loop:Maximum number of loop devices
# losetup -a # verify nothing using the loop device
# rmmod loop
# modprobe loop max_part=16

Agora, o dispositivo loop pode lidar com 16 partições (máximo).

# losetup -v -f disk.img
Loop device is /dev/loop0
# fdisk -l /dev/loop0

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x452b6464

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1         600     4819468+  83  Linux
/dev/loop0p2             601         652      417690   83  Linux
# mkdir -p /mnt/loop0p1
# mount -t ext3 /dev/loop0p1 /mnt/loop0p1
# mkdir -p /mnt/loop0p2
# mount -t ext3 /dev/loop0p2 /mnt/loop0p2
...hack...hack...hack
# umount /dev/loop0p1
# umount /dev/loop0p2
# losetup -d /dev/loop0

Alternativamente, podem-se fazer efeitos semelhantes ao usar os dispositivos device mapper criados pelo kpartx(8) do pacote kpartx como se segue.

# kpartx -a -v disk.img
...
# mkdir -p /mnt/loop0p2
# mount -t ext3 /dev/mapper/loop0p2 /mnt/loop0p2
...
...hack...hack...hack
# umount /dev/mapper/loop0p2
...
# kpartx -d /mnt/loop0
[Nota] Nota

Você também pode montar uma única partição de tal imagem de disco com o dispositivo loop usando um offset para saltar o MBR etc. Mas isto é mais inclinado a erros.

10.2.4. Limpar um ficheiro de imagem de disco

Um ficheiro de imagem de disco, "disk.img" pode ser limpo de todos os ficheiros removidos em uma imagem limpa "new.img" com o seguinte.

# mkdir old; mkdir new
# mount -t auto -o loop disk.img old
# dd bs=1 count=0 if=/dev/zero of=new.img seek=5G
# mount -t auto -o loop new.img new
# cd old
# cp -a --sparse=always ./ ../new/
# cd ..
# umount new.img
# umount disk.img

Se o "disk.img" está em ext2 ou ext3, você também pode usar o zerofree(8) do pacote zerofree como se segue.

# losetup -f -v disk.img
Loop device is /dev/loop3
# zerofree /dev/loop3
# cp --sparse=always disco.img novo.img

10.2.5. Criar um ficheiro de imagem de disco vazio

A imagem de disco vazia "disk.img" que pode crescer até aos 5GiB pode ser feita usando o dd(1) como se segue.

$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

Você pode criar um sistema de ficheiros ext3 nesta imagem de disco "disk.img" usando o dispositivo loop como se segue.

# losetup -f -v disk.img
Loop device is /dev/loop1
# mkfs.ext3 /dev/loop1
...hack...hack...hack
# losetup -d /dev/loop1
$ du  --apparent-size -h disk.img
5.0G  disk.img
$ du -h disk.img
83M disk.img

Para "disk.img", o seu tamanho de ficheiro é 5.0 Gb e a sua utilização real do disco é apenas 83 Mb. Esta discrepância é possível porque o ext2fs ponde manter o ficheiro sparse.

[Dica] Dica

A utilização de disco real do ficheiro sparse cresce com os dados que são escritos nele.

Usando uma operação semelhante em dispositivos criados pelo dispositivo loop ou o mapeador de dispositivos como Secção 10.2.3, “Montar o ficheiro de imagem de disco”, você pode particionar esta imagem de disco "disk.img" usando o parted(8) ou o fdisk(8), e pode criar um sistema de ficheiros nela usando mkfs.ext3(8), mkswap(8), etc.

10.2.6. Criar o ficheiro de imagem ISO9660

O ficheiro de imagem ISO9660, "cd.iso", a partir da árvore de directórios fonte em "source_directory" pode ser feito usando o genisoimage(1) disponibilizado pelo cdrkit com o seguinte.

#  genisoimage -r -J -T -V volume_id -o cd.iso directório_fonte

De modo semelhante, o ficheiro de imagem ISO9660 de arranque, "cdboot.iso", pode ser feito a partir do instalador-debian como árvore de directórios em "source_directory" com o seguinte.

#  genisoimage -r -o cdboot.iso -V volume_id \
   -b isolinux/isolinux.bin -c isolinux/boot.cat \
   -no-emul-boot -boot-load-size 4 -boot-info-table directório_fonte

Aqui é usado para arranque o boot loader Isolinux (veja Secção 3.3, “Estágio 2: o gestor de arranque”).

Você pode calcular o valor md5sum e fazer a imagem ISO9660 directamente a partir do dispositivo CD-ROM como se segue.

$ isoinfo -d -i /dev/cdrom
CD-ROM is in ISO 9660 format
...
Logical block size is: 2048
Volume size is: 23150592
...
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
[Atenção] Atenção

Você tem de ter o cuidado de evitar o bug de leitura antecipada do sistema de ficheiros ISO9660 do Linux como em cima para obter o resultado correcto.

10.2.7. Escrever directamente para o CD/DVD-R/RW

[Dica] Dica

Um DVD é apenas um CD grande para o wodim(1) disponibilizado pelo cdrkit.

Você pode procurar um dispositivo utilizável com o seguinte.

# wodim --devices

Então o CD-R vazio é inserido na drive de CD, e o ficheiro de imagem ISO9660, "cd.iso" é escrito neste dispositivo, ex. "/dev/hda", usando o wodim(1) com o seguinte.

# wodim -v -eject dev=/dev/hda cd.iso

Se for usado um CD-RW em vez de um CD-R, faça antes o seguinte.

# wodim -v -eject blank=fast dev=/dev/hda cd.iso
[Dica] Dica

Se o seu ambiente montar CDs automaticamente, desmonte-o com "sudo unmount /dev/hda" antes de usar o wodim(1).

10.2.8. Montar o ficheiro de imagem ISO9660

Se "cd.iso" conter uma imagem ISO9660, então o seguinte monta-o manualmente em "/cdrom".

# mount -t iso9660 -o ro,loop cd.iso /cdrom
[Dica] Dica

Os sistemas de ambiente de trabalho modernos montam medias amovíveis automaticamente (veja Secção 10.1.10, “Dispositivo de armazenamento amovível”).

10.3. Os dados binários

Aqui, discutimos manipulação directa de dados binários em meios de armazenamento. Veja também Secção 9.3, “Dicas de armazenamento de dados”.

10.3.1. Ver e editar dados binários

o método de visualização mais básico de dados binários é usar o comando "od -t x1".

Tabela 10.6. Lista de pacote para ver e editar dados binários

pacote popcon tamanho descrição
coreutils V:901, I:999 14184 pacote básico que tem od(1) para despejar ficheiros (HEX, ASCII, OCTAL, …)
bsdmainutils V:867, I:999 558 pacote utilitário que tem hd(1) para despejar ficheiros (HEX, ASCII, OCTAL, …)
hexedit V:2, I:17 108 editor binário e visualizador (HEX, ASCII)
bless V:0, I:4 991 editor hexadecimal cheiro de funcionalidades (GNOME)
okteta V:5, I:44 321 editor hexadecimal cheiro de funcionalidades (KDE4)
ncurses-hexedit V:0, I:4 192 editor binário e visualizador (HEX, ASCII, EBCDIC)
beav V:0, I:2 164 editor binário e visualizador (HEX, ASCII, EBCDIC, OCTAL, …)

[Dica] Dica

HEX é usado como um acrónimo para o formato hexadecimal com radix 16. OCTAL é para formato octal com radix 8. ASCII é para American Standard Code for Information Interchange, isto é, código de texto Inglês normal. EBCDIC é para Extended Binary Coded Decimal Interchange Code usado em sistemas operativos com infraestrutura da IBM.

10.3.2. Manipular ficheiros sem montar o disco

Existem ferramentas para ler e escrever ficheiros sem montar o disco.

Tabela 10.7. Lista de pacotes para ler e escrever ficheiros sem montar o disco.

pacote popcon tamanho descrição
mtools V:50, I:483 341 utilitários para sistemas de ficheiros MSDOS sem os montar
hfsutils V:1, I:15 236 utilitários para sistemas de ficheiros HFS e HFS+ sem os montar

10.3.3. Redundância de dados

Os sistemas RAID por software oferecidos pelo kernel Linux oferecem redundância de dados ao nível do sistema de ficheiros do kernel, para se conseguir altos níveis de fiabilidade de armazenamento.

Também existem ferramentas para adicionar redundância a ficheiros ao nível de programa aplicação, para se conseguir altos níveis de fiabilidade de armazenamento.

Tabela 10.8. Lista de ferramentas para adicionar redundância de dados a ficheiros

pacote popcon tamanho descrição
par2 V:5, I:17 272 Parity Archive Volume Set, para verificação e reparação de ficheiros
dvdisaster V:0, I:5 1481 protecção de dados contra percas/riscos/envelhecimento para medias CD/DVD
dvbackup V:0, I:0 392 ferramenta de backup que usa câmaras de filmar MiniDV (disponibilizando rsbep(1))
vdmfec V:0, I:0 88 recuperar blocos perdidos usando o Forward Error Correction

10.3.4. Recuperação de ficheiros e dados e análise forense

Existem ferramentas para recuperação de ficheiros e dados e análise forense.

Tabela 10.9. Lista de pacotes para recuperação de ficheiros e dados e análise forense

pacote popcon tamanho descrição
testdisk V:4, I:40 1153 utilitários para sondagem de partições e recuperação de discos
magicrescue V:0, I:4 344 utilitário para recuperar ficheiros ao procurar por bytes mágicos
scalpel V:0, I:3 124 frugal, entalhador de ficheiros de alta performance
myrescue V:0, I:1 84 recuperar dados de discos rígidos danificados
recover V:0, I:4 104 utilitários para recuperar ficheiros apagados no sistema de ficheiros ext2
e2undel V:0, I:4 244 utilitários para recuperar ficheiros apagados no sistema de ficheiros ext2
ext3grep V:0, I:5 286 ferramenta para ajudar a recuperar ficheiros apagados no sistema de ficheiros ext3
scrounge-ntfs V:0, I:3 80 programa de recuperação de dados para sistemas de ficheiros NTFS
gzrt V:0, I:0 56 conjunto de ferramentas de recuperação gzip
sleuthkit V:0, I:5 750 ferramentas para análise forense. (Sleuthkit)
autopsy V:0, I:3 1372 interface gráfica para o SleuthKit
foremost V:1, I:8 83 aplicação forense para recuperar dados
guymager V:0, I:0 949 ferramenta de imagem forense baseada em Qt
dcfldd V:0, I:2 109 versão melhorada do dd para forenses e segurança
rdd V:0, I:0 200 programa de cópia forense

10.3.5. Dividir um ficheiro grande em ficheiros pequenos

Quando os dados são muito grandes para fazer backup num ficheiro único, você pode fazer backup ao seu conteúdo após dividi-lo em fatias de, por exemplo, 2000Mb e mais tarde fundir essas fatias de volta para o ficheiro original.

$ split -b 2000m ficheiro_grande
$ cat x* >ficheiro_grande
[Cuidado] Cuidado

Por favor certifique-se que não tem nenhuns ficheiros que começam com "x" para evitar crashes com nomes.

10.3.6. Limpar conteúdo de ficheiro

De modo a limpar o conteúdo de um ficheiro como um ficheiro log, não use o rm(1) para apagar o ficheiro e depois crie um ficheiro vazio, porque o ficheiro pode ainda estar a ser acedido no intervalo entre comandos. O seguinte é o modo seguro de limpar o conteúdo do ficheiro.

$ :>ficheiro_a_ser_limpo

10.3.7. Ficheiros dummy

Os seguintes comandos criam ficheiros dummy ou vazios.

$ dd if=/dev/zero    of=5kb.file bs=1k count=5
$ dd if=/dev/urandom of=7mb.file bs=1M count=7
$ touch zero.file
$ : > alwayszero.file

Você deve encontrar os seguintes ficheiros.

  • "5kb.file" é 5KB de zeros.

  • "7mb.file" são 7MB de dados aleatórios.

  • "zero.file" pode ser um ficheiro de 0 bytes. Se existir, o seu mtime é actualizado enquanto o seu conteúdo e tamanho são mantidos.

  • "alwayszero.file" é sempre um ficheiro de 0 bytes. Se existir, o seu mtime é actualizado e o seu conteúdo é reposto.

10.3.8. apagar um disco rígido inteiro

Existem várias maneiras de apagar completamente os dados de um dispositivo inteiro tipo disco rígido, ex., pen de memória USB em "/dev/sda".

[Cuidado] Cuidado

Primeiro verifique a localização da sua pen de memória USB com o mount(8) antes de executar os comandos aqui. O dispositivo apontado por "/dev/sda" pode ser um disco rígido SCSI ou SATA onde pode residir todo o seu sistema.

Apagar todo o conteúdo do disco ao repor os dados a 0 com o seguinte.

# dd if=/dev/zero of=/dev/sda

Apagar tudo ao sobrescrever dados aleatórios com o seguinte.

# dd if=/dev/urandom of=/dev/sda

Apagar tudo ao sobrescrever dados aleatórios muito eficientemente com o seguinte.

# shred -v -n 1 /dev/sda

Como o dd(1) está disponível a partir da shell de muitos CDs de arranque de Linux como o CD de instalação de Debian, você pode apagar completamente o seu sistema instalado no disco rígido, por exemplo, "/dev/hda", "/dev/sda", etc., ao correr um comando de limpeza a partir de tal media de arranque.

10.3.9. Apagar uma área não utilizada do disco rígido

A área não utilizada de um disco rígido (ou duma pen USB ), por exemplo "/dev/sdb1" pode ainda conter os próprios dados apagados pois eles são apenas 'desligados' do sistema de ficheiros. Estes podem ser limpos ao sobrescrever a área onde estão.

# mount -t auto /dev/sdb1 /mnt/foo
# cd /mnt/foo
# dd if=/dev/zero of=junk
dd: writing to `junk': No space left on device
...
# sync
# umount /dev/sdb1
[Atenção] Atenção

Normalmente isto é suficientemente bom para a sua pen de memória USB. Mas não é perfeito. A maioria das partes dos nomes de ficheiros apagados e os seus atributos podem ficar escondidos e permanecerem no sistema de ficheiros.

10.3.10. Recuperar ficheiros apagados mas ainda abertos

Mesmo que tenha acidentalmente apagado um ficheiro, desde que esse ficheiro esteja ainda a ser usado por alguma aplicação (em modo de leitura ou escrita), é possível recuperar tal ficheiro.

Por exemplo, tente o seguinte:

$ echo foo > bar
$ less bar
$ ps aux | grep ' less[ ]'
bozo    4775  0.0  0.0  92200   884 pts/8    S+   00:18   0:00 less bar
$ rm bar
$ ls -l /proc/4775/fd | grep bar
lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> /home/bozo/bar (apagado)
$ cat /proc/4775/fd/4 >bar
$ ls -l
-rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar
$ cat bar
foo

Execute em outro terminal (quando tem o pacote lsof instalado) o seguinte.

$ ls -li bar
2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar
$ lsof |grep bar|grep less
less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar
$ rm bar
$ lsof |grep bar|grep less
less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (apagado)
$ cat /proc/4775/fd/4 >bar
$ ls -li bar
2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar
$ cat bar
foo

10.3.11. Procurar todos os hardlinks

Os ficheiros com hardlinks podem ser identificados com "ls -li".

$ ls -li
total 0
2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz
2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo

Ambos "baz" e "foo" têm contagens de link de "2" (>1) mostrando que têm hardlinks. Os números de inode deles são comuns "2738404". Isto significa que eles são o mesmo ficheiro em hardlink. Se você não encontrar todos os ficheiros em hardlink por acaso, pode procurá-los pelo inode, ex., "2738404" com o seguinte.

# find /caminho/para/ponto/de/montagem -xdev -inum 2738404

10.3.12. Consumo invisível do espaço do disco

Todos os ficheiros apagadas mas abertos consomem espaço no disco apesar de não estarem visíveis ao du(1) normal. Eles podem ser listados com o seu tamanho com o seguinte.

# lsof -s -X / |grep deleted

10.4. Infraestrutura da segurança de dados

A infraestrutura de segurança dos dados é disponibilizada pela combinação de uma ferramenta de encriptação de dados, ferramenta de resumo de mensagens, e ferramenta de assinaturas.

Tabela 10.10. Lista de ferramentas de infraestrutura da segurança de dados

pacote popcon tamanho comando descrição
gnupg V:482, I:998 4957 gpg(1) GNU Privacy Guard - ferramenta de encriptação e assinatura OpenPGP
gnupg-doc I:8 4124 N/D Documentação do GNU Privacy Guard
gpgv V:568, I:997 433 gpgv(1) GNU Privacy Guard - ferramenta de verificação de assinaturas
paperkey V:0, I:0 88 paperkey(1) extrai apenas a informação secreta de chaves secretas OpenPGP
cryptsetup V:46, I:63 295 cryptsetup(8), … utilitários para encriptação de dispositivos de bloco do dm-crypto que suportam LUKS
ecryptfs-utils V:4, I:6 308 ecryptfs(7), … utilitários para encriptação de sistemas de ficheiros empilhados do ecryptfs
coreutils V:901, I:999 14184 md5sum(1) computa e verifica o resumo da mensagem MD5
coreutils V:901, I:999 14184 sha1sum(1) computa e verifica o resumo da mensagem SHA1
openssl V:752, I:969 1080 openssl(1ssl) computa o resumo da mensagem com "openssl dgst" (OpenSSL)

Veja Secção 9.4, “Dicas de encriptação de dados” em dm-crypto e ecryptfs os quais implementam infraestruturas de encriptação de dados automática via módulos do kernel Linux.

10.4.1. Gestão de chaves para GnuPG

Aqui estão comandos do GNU Privacy Guard para gestão de chaves básica.

Tabela 10.11. Lista de comandos do GNU Privacy Guard para gestão de chaves

comando descrição
gpg --gen-key gerar uma chave nova
gpg --gen-revoke meu_ID_utilizador gera chave de revogação para meu_ID_utilizador
gpg --edit-key ID_utilizador edita chave interactivamente, "help" para ajuda
gpg -o ficheiro --exports exporta todas as chaves para ficheiro
gpg --imports ficheiro importa todas as chaves de ficheiro
gpg --send-keys ID_utilizador envia chave de ID_utilizador para servidor de chaves
gpg --recv-keys ID_utilizador recupera chave de ID_utilizador do servidor de chaves
gpg --list-keys ID_utilizador lista chaves de ID_utilizador
gpg --list-sigs ID_utilizador lista assinaturas de ID_utilizador
gpg --check-sigs ID_utilizador verifica assinaturas de ID_utilizador
gpg --fingerprint ID_utilizador verifica a impressão digital de ID_utilizador
gpg --refresh-keys actualiza o chaveiro local

Aqui está o significado do código de confiança

Tabela 10.12. Lista do significado do código de confiança

código descrição de confiança
- nenhuma confiança de dono atribuída / ainda não calculado
e falha no cálculo da confiança
q não existe informação suficiente para o cálculo
n nunca confiar nesta chave
m marginalmente confiável
f totalmente confiável
u de confiança absoluta

O seguinte envia a minha chave "1DD8D791" para o popular servidor de chaves "hkp://keys.gnupg.net".

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

Um bom servidor de chaves predefinido configurado em "~/.gnupg/gpg.conf" (ou na antiga localização "~/.gnupg/options") contém o seguinte.

keyserver hkp://keys.gnupg.net

O seguinte obtém chaves desconhecidas do servidor de chaves.

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
  cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

Existiu um bug no OpenPGP Public Key Server (versão anterior a 0.9.6) que corrompeu as chaves com mais de 2 sub-chaves. O novo pacote gnupg (>1.2.1-2) consegue lidar com estas chaves corrompidas. Veja gpg(1) sob a opção "--repair-pks-subkey-bug".

10.4.2. Usa GnuPG em ficheiros

Aqui estão exemplos para usar comandos do GNU Privacy Guard em ficheiros.

Tabela 10.13. Lista de comandos do GNU Privacy Guard em ficheiros

comando descrição
gpg -a -s ficheiro assina ficheiro em ficheiro.asc blindado de ASCII
gpg --armor --sign ficheiro , ,
gpg --clearsign ficheiro mensagem com assinatura clara
gpg --clearsign file|mail foo@example.org envia por mail uma mensagem com assinatura clara para foo@example.org
gpg --clearsign --not-dash-escaped patchfile ficheiro patch com assinatura clara
gpg --verify ficheiro verifica ficheiro com assinatura clara
gpg -o ficheiro.sig -b ficheiro cria assinatura separada
gpg -o ficheiro.sig --detach-sig ficheiro , ,
gpg --verify ficheiro.sig ficheiro verifica ficheiro com file.sig
gpg -o crypt_file.gpg -r nome -e ficheiro encriptação de chave pública destinada a nome a partir de ficheiro para crypt_file.gpg binário
gpg -o crypt_file.gpg --recipient nome --encrypt ficheiro , ,
gpg -o crypt_file.asc -a -r nome -e ficheiro encriptação de chave pública destinada a nome a partir de ficheiro para crypt_file.asc blindado de ASCII
gpg -o crypt_file.gpg -c ficheiro encriptação simétrica a partir de ficheiro para crypt_file.gpg
gpg -o crypt_file.gpg --symmetric ficheiro , ,
gpg -o crypt_file.asc -a -c ficheiro encriptação simétrica destinada a nome a partir de ficheiro para crypt_file.asc blindado de ASCII
gpg -o ficheiro -d crypt_file.gpg -r nome desencriptação
gpg -o ficheiro --decrypt crypt_file.gpg , ,

10.4.3. Usar GnuPG com o Mutt

Adicione o seguinte a "~/.muttrc" para impedir o GnuPG lento de arrancar automaticamente, enquanto permite que seja usado ao escrever "S" no menu de índice.

macro index S ":toggle pgp_verify_sig\n"
set pgp_verify_sig=no

10.4.4. Usar GnuPG com o Vim

O plugin do gnupg permite-lhe correr o GnuPG transparentemente para ficheiros com extensão ".gpg", ".asc", e ".ppg".

# aptitude install vim-scripts vim-addon-manager
$ vim-addons install gnupg

10.4.5. O valor de controlo MD5

O md5sum(1) disponibiliza um utilitário para fazer um ficheiro de sumário usando o método em rfc1321 e verificar cada ficheiro com ele.

$ md5sum foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: OK
[Nota] Nota

O cálculo do sumário MD5 é menos intensivo para a CPU que o da assinatura criptográfica do GNU Privacy Guard (GnuPG). Normalmente, apenas o ficheiro de digestão do nível de topo é assinado criptograficamente para assegurar a integridade dos dados.

10.5. Ferramentas de fusão de código fonte

Existem muitas ferramentas de fusão para código fonte. Os seguinte comandos chamaram a minha atenção.

Tabela 10.14. Lista de ferramentas de fusão de código fonte

pacote popcon tamanho comando descrição
diffutils V:735, I:826 1114 diff(1) compara ficheiros linha a linha
diffutils V:735, I:826 1114 diff3(1) compara e junta três ficheiros linha a linha
vim V:167, I:399 1877 vimdiff(1) compara dois ficheiros lado a lado no vim
patch V:144, I:943 218 patch(1) aplica ficheiro diff a um original
dpatch V:6, I:65 237 dpatch(1) gere séries de patches para pacote Debian
diffstat V:19, I:144 45 diffstat(1) produz um histograma de alterações feitas pelo diff
patchutils V:15, I:119 221 combinediff(1) cria uma patch cumulativa de duas patches incrementais
patchutils V:15, I:119 221 dehtmldiff(1) extrai um diff de uma página HTML
patchutils V:15, I:119 221 filterdiff(1) extrai ou executa diffs de um ficheiro diff
patchutils V:15, I:119 221 fixcvsdiff(1) corrige ficheiros diff criados pelo CVS que o patch(1) interpreta mal
patchutils V:15, I:119 221 flipdiff(1) troca a ordem de duas patches
patchutils V:15, I:119 221 grepdiff(1) mostra que ficheiros são modificados por uma patch que corresponde a um regex
patchutils V:15, I:119 221 interdiff(1) mostra as diferenças entre dois ficheiros diff unificados
patchutils V:15, I:119 221 lsdiff(1) mostra quais ficheiros são modificados por uma patch
patchutils V:15, I:119 221 recountdiff(1) recalcula contagens e offsets em diffs de contexto unificado
patchutils V:15, I:119 221 rediff(1) corrige os offsets e as contagens de um diff editado manualmente
patchutils V:15, I:119 221 splitdiff(1) separa patches incrementais
patchutils V:15, I:119 221 unwrapdiff(1) desembaralha patches cujas linhas foram alteradas para arrumação de palavras
wiggle V:0, I:0 203 wiggle(1) aplica patches rejeitadas
quilt V:12, I:92 814 quilt(1) gere séries de patches
meld V:9, I:38 2023 meld(1) compara e funde ficheiros (GTK)
dirdiff V:0, I:5 224 dirdiff(1) mostra diferenças e funde alterações entre árvores de directórios
docdiff V:0, I:0 543 docdiff(1) compara dois ficheiros palavra a palavra / caractere a caractere
imediff2 V:0, I:0 76 imediff2(1) ferramenta de fusão de 2 vias interactiva de écran completo
makepatch V:0, I:0 148 makepatch(1) gera ficheiros de patch extensos
makepatch V:0, I:0 148 applypatch(1) aplica ficheiros de patch extensos
wdiff V:15, I:141 902 wdiff(1) mostra diferenças de palavras entre ficheiros de texto

10.5.1. Extrair as diferenças para ficheiros fonte

Um dos seguintes procedimentos extrai as diferenças entre dois ficheiros de fonte e cria os ficheiros diff unificados "file.patch0" ou "file.patch1" dependendo da localização do ficheiro.

$ diff -u ficheiro.antigo ficheiro.novo > ficheiro.patch0
$ diff -u antigo/ficheiro novo/ficheiro > ficheiro.patch1

10.5.2. Fundir actualizações para ficheiros de fonte

O ficheiro diff (alternativamente chamado ficheiro patch) é usado para enviar uma actualização de um programa. A parte receptora aplica esta actualização a outro ficheiro com o seguinte.

$ patch -p0 ficheiro < ficheiro.patch0
$ patch -p1 ficheiro < ficheiro.patch1

10.5.3. Actualizar via fusão-de-3-vias

Se você tiver três versões de um código fonte, você pode executar uma fusão-de-3-vias efectiva usando o diff3(1) com o seguinte.

$ diff3 -m meu.ficheiro ficheiro.antigo teu.ficheiro > ficheiro

10.6. Sistemas de controle de versão

Aqui está um sumário dos sistemas de controle de versão (VCS) no sistema Debian.

[Nota] Nota

Se você é novato nos sistemas VCS, deverá começar a aprender com o Git, o qual está a crescer rapidamente na popularidade.

Tabela 10.15. lista de ferramentas de sistemas de controle de versão

pacote popcon tamanho ferramenta Tipo VCS comentário
cssc V:0, I:0 2240 CSSC local clone do SCCS do Unix (descontinuado)
rcs V:8, I:44 1211 RCS local "SCCS do Unix bem feito"
cvs V:19, I:130 4059 CVS remoto VCS remoto standard anterior
subversion V:81, I:283 3899 Subversion remoto "CVS bem feito", o novo VCS remoto standard "de facto"
git V:130, I:414 13134 Git distribuído DVCS rápido em C (usado pelo kernel Linux e outros)
mercurial V:20, I:79 371 Mercurial distribuído DVCS em Python e algum C
bzr V:9, I:39 98 Bazaar distribuído DVCS influenciado por tla escrito em Python (usado pelo Ubuntu)
darcs V:1, I:10 13424 Darcs distribuído DVCS com álgebra inteligente de patches (lento)
tla V:1, I:11 881 GNU arch distribuído DVCS principalmente por Tom Lord (Histórico)
monotone V:0, I:2 5150 Monotone distribuído DVCS em C++
tkcvs V:0, I:3 1400 CVS, … remoto Mostrador GUI de árvores de repositório VCS (CVS, Subversion, RCS)
gitk V:11, I:52 1048 Git distribuído Mostrador GUI de árvores de repositório VCS (Git)

O VCS é por vezes conhecido como um sistema de controle de revisão (RCS), ou gestão de configuração de software (SCM).

O VCS distribuído como o Git é a ferramenta escolhida nos dias de hoje. O CVS e Subversion podem ainda ser úteis para juntar algumas actividades de programas de código aberto existentes.

O Debian disponibiliza serviços VCS livres via serviço Debian Alioth. Suporta praticamente todos os VCSs. A sua documentação pode ser encontrada em http://wiki.debian.org/Alioth.

Existem algumas bases para criar um arquivo VCS de acesso partilhado.

10.6.1. Comparação dos comandos VCS

Aqui está uma comparação muito simplificada dos comandos VCS nativos para disponibilizar a ideia geral. A sequência de comandos típica pode requerer opções e argumentos.

Tabela 10.16. Comparação dos comandos VCS nativos

CVS Subversion Git função
cvs init svn create git init cria o repositório (local)
cvs login - - login ao repositório remoto
cvs co svn co git clone faz check out ao repositório remoto como a árvore de trabalho
cvs up svn up git pull actualiza a árvore de trabalho ao fundir o repositório remoto
cvs add svn add git add . adiciona ficheiro(s) na árvore de trabalho do VCS
cvs rm svn rm git rm remove ficheiro(s) na árvore de trabalho do VCS
cvs ci svn ci - comete alterações para o repositório remoto
- - git commit -a comete alterações para o repositório local
- - git push actualiza o repositório remoto pelo repositório local
cvs status svn status git status mostra o estado da árvore de trabalho do VCS
cvs diff svn diff git diff diff <repositório_referência> <árvore_de_trabalho>
- - git repack -a -d; git prune re-empacota o repositório local em um único pacote
tkcvs tkcvs gitk Mostrador GUI de árvore de repositório VCS

[Cuidado] Cuidado

Invocar um sub-comando git directamente como "git-xyz" a partir da linha de comandos foi descontinuado desde o inicio de 2006.

[Dica] Dica

Ferramentas GUI como o tkcvs(1) e gitk(1) ajudam-no realmente com o acompanhamento do histórico de revisão dos ficheiros. A interface web disponibiliza por muitos arquivos públicos para exploração dos seus repositórios é também muito útil.

[Dica] Dica

O git pode trabalhar directamente com diferentes repositórios CVS como aqueles disponibilizados pelo CVS e Subversion, e disponibiliza o repositório local para alterações locais com os pacotes git-cvs e git-svn. Veja git para utilizadores de CVS, e Secção 10.9.4, “Git para o repositório Subversion”.

[Dica] Dica

Git tem comandos que não têm equivalentes em CVS e Subversion: "fetch", "rebase", "cherry-pick", …

10.7. CVS

Veja o seguinte.

  • cvs(1)

  • "/usr/share/doc/cvs/html-cvsclient"

  • "/usr/share/doc/cvs/html-info"

  • "/usr/share/doc/cvsbook"

  • "info cvs"

10.7.1. Configuração de repositório CVS

A seguinte configuração permite submissões para o repositório CVS apenas por um membro do grupo "src", e administração do CVS apenas por um membro do grupo "staff", assim reduzindo as hipóteses de dar um tiro em si próprio.

# cd /var/lib; umask 002; mkdir cvs
# export CVSROOT=/srv/cvs/project
# cd $CVSROOT
# chown root:src .
# chmod 2775 .
# cvs -d $CVSROOT init
# cd CVSROOT
# chown -R root:staff .
# chmod 2775 .
# touch val-tags
# chmod 664 history val-tags
# chown root:src history val-tags
[Dica] Dica

Você pode restringir a criação de novo projecto ao alterar o dono do directório "$CVSROOT" para "root:staff" e as suas permissões para "3775".

10.7.2. Acesso local ao CVS

O repositório CVS predefinido é apontado por "$CVSROOT". O seguinte define "$CVSROOT" para o acesso local.

$ export CVSROOT=/srv/cvs/project

10.7.3. Acesso remoto ao CVS com pserver

Muitos servidores CVS públicos disponibilizam acesso remoto apenas de leitura a eles com o nome de conta "anonymous" via serviço pserver. Por exemplo, os conteúdos do site web de Debian são mantidos pelo projecto webwml via CVS no serviço alioth de Debian. O seguinte configura "$CVSROOT" para o acesso remoto a este repositório CVS.

$ export CVSROOT=:pserver:anonymous@cvs.alioth.debian.org:/cvsroot/webwml
$ cvs login
[Nota] Nota

Como o pserver é inclinado a ataques de escutas e inseguro, o acesso de escrita geralmente é desactivado pelos administradores do servidor.

10.7.4. Acesso remoto ao CVS com ssh

O seguinte configura "$CVS_RSH" e "$CVSROOT" para o acesso remoto ao repositório CVS pelo projecto webwml com SSH.

$ export CVS_RSH=ssh
$ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml

Você também pode usar autenticação de chave pública para SSH o que elimina o pedido remoto de palavra-passe.

10.7.5. Importar uma nova fonte para o CVS

Crie uma nova localização de árvore fonte local em "~/caminho/para/module1" com o seguinte.

$ mkdir -p ~/caminho/para/module1; cd ~/caminho/para/module1

Povoa uma nova árvore fonte local sob "~/caminho/para/module1" como ficheiros.

Importe-o para o CVS com os seguintes parâmetros.

  • Module name: "module1"

  • Vendor tag: "Main-branch" (etiqueta para o branch completo)

  • Release tag: "Release-initial" (etiqueta para um lançamento específico)

$ cd ~/caminho/para/module1
$ cvs import -m "Start module1" module1 Main-branch Release-initial
$ rm -Rf . # opcional

10.7.6. Permissões de ficheiros no repositório CVS

O CVS não sobrescreve o ficheiro do repositório actual mas substitui-o por outros. Assim, a permissão de escrita no directório do repositório é crítica. Para cada novo módulo para "module1" no repositório em "/srv/cvs/project", corra o seguinte para assegurar esta condição se necessário.

# cd /srv/cvs/project
# chown -R root:src module1
# chmod -R ug+rwX   module1
# chmod    2775     module1

10.7.7. Fluxo de trabalho do CVS

Aqui está um exemplo de um fluxo de trabalho típico usando CVS

Verifique todos os módulos disponíveis do projecto CVS apontados por "$CVSROOT" com o seguinte.

$ cvs rls
CVSROOT
module1
module2
...

Faça o checkout a "module1" para o seu directório predefinido "./module1" com o seguinte.

$ cd ~/caminho/para
$ cvs co module1
$ cd module1

Faça as alterações necessárias ao conteúdo.

Verifique alterações ao fazer "diff -u [repositório] [local]" equivalente ao seguinte.

$ cvs diff -u

Você descobre que danificou o ficheiro "ficheiro-a-desfazer" severamente mas os outros ficheiros estão bem.

Sobrescreva o ficheiro "ficheiro-a-desfazer" com uma cópia limpa do CVS com o seguinte.

$ cvs up -C ficheiro-a-desfazer

Salva a árvore de fonte local actualizada para o CVS com o seguinte.

$ cvs ci -m "Descreve alteração"

Crie e adicione o ficheiro "ficheiro-a-adicionar" ao CVS com o seguinte.

$ vi ficheiro-a-adicionar
$ cvs add ficheiro-a-adicionar
$ cvs ci -m "ficheiro-a-adicionar adicionado"

Funda a versão mais recente do CVS com o seguinte.

$ cvs up -d

Procure por linhas que comecem com "C filename" as quais indicam alterações em conflito.

Procura código não modificado em ".#nome-ficheiro.versão".

Procura por "<<<<<<<" e ">>>>>>>" em ficheiros por alterações em conflito.

Edite os ficheiros para corrigir os conflitos como necessário.

Adicione uma etiqueta de lançamento "Release-1" com o seguinte.

$ cvs ci -m "última submissão para Release-1"
$ cvs tag Release-1

Continuar a editar.

Remova a etiqueta de lançamento "Release-1" com o seguinte.

$ cvs tag -d Release-1

Verifique as alterações no CVS com o seguinte.

$ cvs ci -m "última submissão real para Release-1"

Re-adicione a etiqueta de lançamento "Release-1" para o CABEÇALHO CVS actualizado de main com o seguinte.

$ cvs tag Release-1

Crie um branch com uma etiqueta autocolante de branch "Release-initial-bugfixes" a partir da versão original apontada pela etiqueta "Release-initial" e faça o check out para o directório "~/path/to/old" com o seguinte.

$ cvs rtag -b -r Release-initial Release-initial-bugfixes module1
$ cd ~/path/to
$ cvs co -r Release-initial-bugfixes -d old module1
$ cd old
[Dica] Dica

Use "-D 2005-12-20" (formato de data ISO 8601) em vez de "-r Release-initial" para especificar uma data particular como o ponto do branch.

Trabalhe nesta árvore de fonte local tendo a etiqueta autocolante "Release-initial-bugfixes" a qual é baseada na versão original.

Trabalhe neste branch por si … até que alguém se junte a este branch "Release-initial-bugfixes".

Sincronize com ficheiros modificados por outros neste branch enquanto cria novos directórios se necessário com o seguinte.

$ cvs up -d

Edite os ficheiros para corrigir os conflitos como necessário.

Verifique as alterações no CVS com o seguinte.

$ cvs ci -m "check feito para este branch"

Actualize a árvore local pelo CABEÇALHO do main enquanto remove a etiqueta autocolante ("-A") e sem a extensão de palavra chave ("-kk") com o seguinte.

$ cvs up -d -kk -A

Actualize a árvore local (conteúdo = CABEÇALHO de main) ao fundir do branch "Release-initial-bugfixes" e sem a expansão palavra chave com o seguinte.

$ cvs up -d -kk -j Release-initial-bugfixes

Corrigir conflitos com o editor.

Verifique as alterações no CVS com o seguinte.

$ cvs ci -m "Juntei Release-initial-bugfixes"

Criar arquivo com o seguinte.

$ cd ..
$ mv old old-module1-bugfixes
$ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes
$ rm -rf old-module1-bugfixes
[Dica] Dica

O comando "cvs up" pode receber a opção "-d" para criar novos directórios e a opção "-P" para suprimir os directórios vazios.

[Dica] Dica

Você pode fazer checkout apenas a um sub directório de "module1" ao fornecer o seu nome como "cvs co module1/subdir".

Tabela 10.17. Opções notáveis para comandos CVS (use como primeiro argumento(s) para o cvs(1))

opção significado
-n simulação, nenhum efeito
-t mostra mensagens que mostram os passos da actividade do cvs

10.7.8. Ficheiros mais recentes do CVS

Para obter os ficheiros mais recentes do CVS, use "tomorrow" com o seguinte.

$ cvs ex -D tomorrow nome-do-módulo

10.7.9. Administração do CVS

Adicione o alias de módulo "mx" a um projecto de CVS (servidor local) com o seguinte.

$ export CVSROOT=/srv/cvs/project
$ cvs co CVSROOT/modules
$ cd CVSROOT
$ echo "mx -a module1" >>modules
$ cvs ci -m "Agora mx é um alias para module1"
$ cvs release -d .

Agora, você pode fazer check out ao "module1" (alias: "mx") do CVS para o directório "new" com o seguinte.

$ cvs co -d new mx
$ cd new
[Nota] Nota

De modo a executar o procedimento em cima, você precisa ter as permissões de ficheiro apropriadas.

10.7.10. Bit de execução para verificação do CVS

Quando você faz checkout a ficheiros de CVS, o seu bit de permissão de execução é retido.

Sempre que veja problemas com a permissão de execução num ficheiro a que fez check out, ex. "nome-de-ficheiro", mude as suas permissões no repositório CVS correspondente com o seguinte para a corrigir.

# chmod ugo-x nome-de-ficheiro

10.8. Subversion

Subversion é um sistema de controle de versão de geração-recente que substitui o antigo CVS. Tem a maioria das funcionalidades do CVS excepto as tags e branches.

Você precisa instalar os pacotes subversion, libapache2-svn e subversion-tools para configurar um servidor Subversion.

10.8.1. Configuração do repositório Subversion

Actualmente, o pacote subversion não configura um repositório, então é preciso configurar um manualmente. Uma possível localização para um repositório é em "/srv/svn/project".

Crie um directório com o seguinte.

# mkdir -p        /srv/svn/project

Crie a base de dados do repositório com o seguinte.

# svnadmin create /srv/svn/project

10.8.2. Acesso ao Subversion via servidor Apache2

Se você apenas aceder ao repositório Subversion via servidor Apache2, você apenas precisa de activar a escrita no repositório pelo servidor WWW com o seguinte.

# chown -R www-data:www-data /srv/svn/project

Adicione (ou descomente) o seguinte em "/etc/apache2/mods-available/dav_svn.conf" para permitir o acesso ao repositório via autenticação do utilizador.

<Location /project>
  DAV svn
  SVNPath /srv/svn/project
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/subversion/passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
</LimitExcept>
</Location>

Crie um ficheiro de autenticação de utilizador com o comando com o seguinte.

# htpasswd2 -c /etc/subversion/passwd algum_nome_de_utilizador

Reiniciar o Apache2

O seu novo repositório Subversion está acessível no URL "http://localhost/project" e "http://exemplo.com/project" a partir de svn(1) (assumindo que o URL do seu servidor web é "http://exemplo.com/").

10.8.3. Acesso local ao Subversion pelo grupo

O seguinte configura um repositório Subversion para acesso local pelo grupo, ex. project.

# chmod  2775     /srv/svn/project
# chown -R root:src /srv/svn/project
# chmod -R ug+rwX   /srv/svn/project

O seu novo repositório Subversion está acessível ao grupo no URL "file:///localhost/srv/svn/project" ou "file:///srv/svn/project" a partir de svn(1) para os utilizadores locais que pertençam ao grupo project. Você tem de correr comandos, como o svn, svnserve, svnlook, e svnadmin sob "umask 002" para assegurar o acesso do grupo.

10.8.4. Acesso remoto ao Subversion via SSH

Um repositório Subversion acessível por grupo está no URL "example.com:/srv/svn/project" para SSH, você pode aceder-lhe a partir de svn(1) no URL "svn+ssh://example.com:/srv/svn/project".

10.8.5. Estrutura de directórios do Subversion

Muitos projectos usam árvores de directórios semelhantes à seguinte para o Subversion para compensar a falta de branches e tags.

  ----- module1
    |   |-- branches
    |   |-- tags
    |   |   |-- release-1.0
    |   |   `-- release-2.0
    |   |
    |   `-- trunk
    |       |-- file1
    |       |-- file2
    |       `-- file3
    |
    `-- module2
[Dica] Dica

Você tem de usar o comando "svn copy …" para marcar os branches e as etiquetas. Isto assegura que o Subversion grave um histórico de modificações dos ficheiros de modo apropriado e poupe espaço de armazenamento.

10.8.6. importar uma nova fonte para o Subversion

Crie uma nova localização de árvore fonte local em "~/caminho/para/module1" com o seguinte.

$ mkdir -p ~/caminho/para/module1; cd ~/caminho/para/module1

Povoa uma nova árvore fonte local sob "~/caminho/para/module1" como ficheiros.

Importe-o para Subversion com os seguintes parâmetros.

  • Module name: "module1"

  • Subversion site URL: "file:///srv/svn/project"

  • Subversion directory: "module1/trunk"

  • Subversion tag: "module1/tags/Release-initial"

$ cd ~/path/to/module1
$ svn import file:///srv/svn/project/module1/trunk -m "Start module1"
$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-initial

Alternativamente, pelo seguinte.

$ svn import ~/path/to/module1 file:///srv/svn/project/module1/trunk -m "Start module1"
$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-initial
[Dica] Dica

Você pode substituir URLs como o "file:///…" por qualquer outro formato de URL como o "http://…" e "svn+ssh://…".

10.8.7. Fluxo de trabalho do Subversion

Aqui está um exemplo do fluxo de trabalho típico usando o Subversion com o seu cliente nativo.

[Dica] Dica

Os comandos de cliente oferecidos pelo pacote git-svn podem oferecer um fluxo de trabalho alternativo do Subversion usando o comando git. Veja Secção 10.9.4, “Git para o repositório Subversion”.

Verifique todos os módulos disponíveis do projecto do Subversion apontado pelo URL "file:///srv/svn/project" com o seguinte.

$ svn list file:///srv/svn/project
module1
module2
...

Faz checkout a "module1/trunk" para um directório "module1" com o seguinte.

$ cd ~/caminho/para
$ svn co file:///srv/svn/project/module1/trunk module1
$ cd module1

Faça as alterações necessárias ao conteúdo.

Verifique alterações ao fazer "diff -u [repositório] [local]" equivalente ao seguinte.

$ svn diff

Você descobre que danificou o ficheiro "ficheiro-a-desfazer" severamente mas os outros ficheiros estão bem.

Sobrescreve "ficheiro_a_desfazer" com a cópia limpa do Subversion com o seguinte.

$ svn revert ficheiro_a_desfazer

Salve a árvore de fonte local actualizada para o Subversion com o seguinte.

$ svn ci -m "Descreve alteração"

Crie e adicione o ficheiro "ficheiro_a_adicionar" ao Subversion com o seguinte.

$ vi ficheiro_a_adicionar
$ svn add ficheiro_a_adicionar
$ svn ci -m "Adicionado ficheiro_a_adicionar"

Junta a versão mais recente do Subversion com o seguinte.

$ svn up

Procure por linhas que comecem com "C filename" as quais indicam alterações em conflito.

Procura por código não modificado em, ex., "filename.r6", "filename.r9", e "filename.mine".

Procura por "<<<<<<<" e ">>>>>>>" em ficheiros por alterações em conflito.

Edite os ficheiros para corrigir os conflitos como necessário.

Adicione uma etiqueta de lançamento "Release-1" com o seguinte.

$ svn ci -m "última submissão para Release-1"
$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1

Continuar a editar.

Remova a etiqueta de lançamento "Release-1" com o seguinte.

$ svn rm file:///srv/svn/project/module1/tags/Release-1

Verifique as alterações ao Subversion com o seguinte.

$ svn ci -m "última submissão real para Release-1"

Re-adicione a etiqueta de lançamento "Release-1" a partir de do CABEÇALHO do trunk Subversion actualizado com o seguinte.

$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1

Crie um branch com o caminho "module1/branches/Release-initial-bugfixes" a partir da versão original apontada pelo caminho "module1/tags/Release-initial" e faça check out a ele para o directório "~/path/to/old" com o seguinte.

$ svn cp file:///srv/svn/project/module1/tags/Release-initial file:///srv/svn/project/module1/branches/Release-initial-bugfixes
$ cd ~/path/to
$ svn co file:///srv/svn/project/module1/branches/Release-initial-bugfixes old
$ cd old
[Dica] Dica

Use "module1/trunk@{2005-12-20}" (formato de data ISO 8601) em vez de "module1/tags/Release-initial" para especificar uma data particular como o ponto do branch.

Trabalhe nesta árvore de fonte local que aponta para o branch "Release-initial-bugfixes" o qual é baseado na versão original.

Trabalhe neste branch por si … até que alguém se junte a este branch "Release-initial-bugfixes".

Sincronize com ficheiros modificados por outros neste branch com o seguinte.

$ svn up

Edite os ficheiros para corrigir os conflitos como necessário.

Verifique as alterações ao Subversion com o seguinte.

$ svn ci -m "check feito para este branch"

Actualize a árvore local com o CABEÇALHO do trunk com o seguinte.

$ svn switch file:///srv/svn/project/module1/trunk

Actualize a árvore local (conteúdo = CABEÇALHO do trunk) ao fundir a partir do branch "Release-initial-bugfixes" com o seguinte.

$ svn merge file:///srv/svn/project/module1/branches/Release-initial-bugfixes

Corrigir conflitos com o editor.

Verifique as alterações ao Subversion com o seguinte.

$ svn ci -m "merged Release-initial-bugfixes"

Criar arquivo com o seguinte.

$ cd ..
$ mv old old-module1-bugfixes
$ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes
$ rm -rf old-module1-bugfixes
[Dica] Dica

Você pode substituir URLs como o "file:///…" por qualquer outro formato de URL como o "http://…" e "svn+ssh://…".

[Dica] Dica

Você pode fazer checkout apenas a um sub directório do "module1" ao fornecer o seu nome como "svn co file:///srv/svn/project/module1/trunk/subdir module1/subdir", etc.

Tabela 10.18. Opções notáveis para os comandos do Subversion (use como primeiro argumento) para o svn(1))

opção significado
--dry-run simulação, nenhum efeito
-v mostra mensagens detalhadas da actividade do svn

10.9. Git

O Git pode fazer tudo para gestão de código fonte tanto local como remoto. Isto significa que você pode gravar as alterações no código fonte sem precisar de ligação de rede ao repositório remoto.

10.9.1. Configuração do cliente Git

Você pode desejar definir várias configurações globais em "~/.gitconfig" como o seu nome e endereço de mail usado pelo Git com o seguinte.

$ git config --global user.name "Nome Apelido"
$ git config --global user.email seu-nome@exemplo.com

Se você está muito acostumado aos comandos do CVS ou Subversion, pode desejar definir nomes alternativos a vários comandos com o seguinte.

$ git config --global alias.ci "commit -a"
$ git config --global alias.co checkout

Você pode verificar a sua configuração global com o seguinte.

$ git config --global --list

10.9.2. Referências do Git

Veja o seguinte.

Os comandos git-gui(1) e gitk(1) tornam a utilização do Git muito fácil.

[Atenção] Atenção

Não use a string de etiqueta (tag) com espaços nela, mesmo que algumas ferramentas como o gitk(1) o permitam. Pode estrangular outros comandos do git.

10.9.3. Comandos do Git

Mesmo que o seu repositório de origem use um VCS diferente, pode ser boa ideia usar o git(1) para actividade local porque você pode gerir a sua cópia local da árvore fonte sem a ligação de rede ao repositório de origem. Aqui estão alguns pacotes e comandos usados com o git(1).

Tabela 10.19. Lista de pacotes e comandos relacionados com o git

pacote popcon tamanho comando descrição
git-doc I:28 8405 N/D documentação oficial para o Git
gitmagic I:3 740 N/D "Magia do Git", guia fácil de compreender para o Git
git V:130, I:414 13134 git(7) Git, o sistema de controlo de revisão distribuído, rápido e escalável
gitk V:11, I:52 1048 gitk(1) explorador GUI de repositórios Git com histórico
git-gui V:3, I:31 1670 git-gui(1) GUI para Git (Nenhum histórico)
git-svn V:5, I:42 689 git-svnimport(1) importa os dados de Subversion para Git
git-svn V:5, I:42 689 git-svn(1) disponibiliza operação bi-direccional entre Subversion e Git
git-cvs V:1, I:18 782 git-cvsimport(1) importa os dados de CVS para Git
git-cvs V:1, I:18 782 git-cvsexportcommit(1) exporta uma submissão para um checkout do CVS a partir do Git
git-cvs V:1, I:18 782 git-cvsserver(1) emulador de servidor CVS para o Git
git-email V:1, I:20 533 git-send-email(1) envia uma colecção de patches como email a partir do Git
stgit V:0, I:7 1628 stg(1) quilt no topo do git (Python)
git-buildpackage V:2, I:12 2530 git-buildpackage(1) automatiza o empacotamento Debian com o Git
guilt V:0, I:0 360 guilt(7) quilt no topo do git (SH/AWK/SED/…)

[Dica] Dica

Com o git(1), você trabalha num branch local com muitas submissões e usa algo como "git rebase -i master" para reorganizar o histórico de alterações mais tarde. Isto permite-lhe fazer um histórico de alterações limpo. Veja git-rebase(1) e git-cherry-pick(1).

[Dica] Dica

Quando você deseja recuar para um directório de trabalho limpo sem perder o estado actual do directório de trabalho, você pode usar o "git stash". Veja git-stash(1).

10.9.4. Git para o repositório Subversion

Você pode fazer check out a um repositório Subversion em "svn+ssh://svn.example.org/project/module/trunk" para um repositório Git local em "./dest" e submeter de volta para o repositório Subversion. Ex.:

$ git svn clone -s -rHEAD svn+ssh://svn.example.org/project dest
$ cd dest
... faz as alterações
$ git commit -a
... continua a trabalhar localmente com o git
$ git svn dcommit
[Dica] Dica

O uso de "-rHEAD" permite-nos evitar clonar os conteúdos históricos inteiros do repositório Subversion.

10.9.5. Git para gravar o histórico de configuração

Você pode gravar manualmente o histórico cronológico da configuração usando ferramentas do Git. Aqui está um exemplo simples para você praticar a gravar os conteúdos de "/etc/apt/".

$ cd /etc/apt/
$ sudo git init
$ sudo chmod 700 .git
$ sudo git add .
$ sudo git commit -a

Cometer configuração com descrição

Fazer modificações nos ficheiros de configuração.

$ cd /etc/apt/
$ sudo git commit -a

Cometer a configuração com descrição e continuar com a sua vida.

$ cd /etc/apt/
$ sudo gitk --all

Você tem o histórico de configuração completo consigo.

[Nota] Nota

O sudo(8) é necessário para trabalhar com quaisquer permissões de ficheiros de dados de configuração. Para os dados de configuração do utilizador, você pode descartar o sudo.

[Nota] Nota

O comando "chmod 700 .git" no exemplo em cima é necessário para proteger os dados do arquivo contra acesso de leitura não autorizado.

[Dica] Dica

Para uma solução mais completa para gravação do histórico de configuração, por favor procure o pacote etckeeper: Secção 9.2.10, “Gravar alterações em ficheiros de configuração”.