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. Meio de arquivo
10.1.7. Dispositivo de armazenamento amovível
10.1.8. Escolha de sistema de ficheiros para partilhar dados
10.1.9. Partilhando dados via rede
10.2. Salvaguarda (backup) e recuperação
10.2.1. Suites de utilitários de backup
10.2.2. Um script de exemplo para salvaguarda ao sistema
10.2.3. Um script de cópia para a salvaguarda de dados
10.3. Infraestrutura da segurança de dados
10.3.1. Gestão de chaves para GnuPG
10.3.2. Usa GnuPG em ficheiros
10.3.3. Usar GnuPG com o Mutt
10.3.4. Usar GnuPG com o Vim
10.3.5. O valor de controlo MD5
10.4. Ferramentas de fusão de código fonte
10.4.1. Extrair as diferenças para ficheiros fonte
10.4.2. Fundir actualizações para ficheiros de fonte
10.4.3. Actualizar via fusão-de-3-vias
10.5. Sistemas de controle de versão
10.5.1. Comparação dos comandos VCS
10.6. Git
10.6.1. Configuração do cliente Git
10.6.2. Referências do Git
10.6.3. Comandos do Git
10.6.4. Git para o repositório Subversion
10.6.5. Git para gravar o histórico de configuração
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

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.

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

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:532, I:999 2516 .tar tar(1) o arquivador standard (de facto standard)
cpio V:384, I:999 844 .cpio cpio(1) arquivador estilo Unix System V, usar com o find(1)
binutils V:364, I:738 18832 .ar ar(1) arquivador para a criação de bibliotecas estáticas
fastjar V:10, I:100 191 .jar fastjar(1) arquivador para Java (estilo zip)
pax V:20, I:71 181 .pax pax(1) novo arquivador standard do POSIX, um compromisso entre tar e cpio
gzip V:862, I:999 235 .gz gzip(1), zcat(1), … LZ77 utilitário de compressão do GNU (o standard de facto)
bzip2 V:420, I:874 119 .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:13, I:177 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:249, I:916 472 .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:10, I:90 986 .7z 7zr(1), p7zip(1) 7-Zip arquivador de ficheiros com alta taxa de compressão (compressão LZMA)
p7zip-full V:241, I:515 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:37 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:56, I:357 593 .zip zip(1) InfoZIP: ferramenta de compressão e arquivo do DOS
unzip V:278, I:775 377 .zip unzip(1) InfoZIP: ferramenta de descompressão e de de-arquivar 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".

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


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.2.3, “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.11, “lista de ferramentas de sistemas de controle de versão” podem funcionar como a copia de multi-modos e ferramentas de sincronização.

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 -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . user@host.dom:/dest

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

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ user@host.dom:/dest

Alternativamente, pelo seguinte.

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/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)

  • "/dest/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.

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.3.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.

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.

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”).

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.


[Dica] Dica

Veja Secção 9.8.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.

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".

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

[Nota] Nota

Não faça salvaguarda aos conteúdos dos pseudo-sistemas de ficheiros encontrados em /proc, /sys, /tmp, e /run (veja Secção 1.2.12, “procfs e sysfs” e Secção 1.2.13, “tmpfs”). A menos que saiba exactamente o que está a fazer, eles são enormes quantidades de dados desnecessários.

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 9.7, “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.3.14, “Agendar tarefas regularmente” para cron(8) e crontab(1).

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


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.2.2, “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 obnam permite salvaguardas incrementais (remotas).

  • 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.

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".

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 -aHAXSv ./ "${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.6.5, “Git para gravar o histórico de configuração”).

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.


Veja Secção 9.8, “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.

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


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


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".

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


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.

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

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

pacote popcon tamanho comando descrição
diffutils V:779, I:913 1229 diff(1) compara ficheiros linha a linha
diffutils V:779, I:913 1229 diff3(1) compara e junta três ficheiros linha a linha
vim V:150, I:378 2006 vimdiff(1) compara dois ficheiros lado a lado no vim
patch V:144, I:952 172 patch(1) aplica ficheiro diff a um original
dpatch V:3, I:47 237 dpatch(1) gere séries de patches para pacote Debian
diffstat V:17, I:136 49 diffstat(1) produz um histograma de alterações feitas pelo diff
patchutils V:15, I:121 185 combinediff(1) cria uma patch cumulativa de duas patches incrementais
patchutils V:15, I:121 185 dehtmldiff(1) extrai um diff de uma página HTML
patchutils V:15, I:121 185 filterdiff(1) extrai ou executa diffs de um ficheiro diff
patchutils V:15, I:121 185 fixcvsdiff(1) corrige ficheiros diff criados pelo CVS que o patch(1) interpreta mal
patchutils V:15, I:121 185 flipdiff(1) troca a ordem de duas patches
patchutils V:15, I:121 185 grepdiff(1) mostra que ficheiros são modificados por uma patch que corresponde a um regex
patchutils V:15, I:121 185 interdiff(1) mostra as diferenças entre dois ficheiros diff unificados
patchutils V:15, I:121 185 lsdiff(1) mostra quais ficheiros são modificados por uma patch
patchutils V:15, I:121 185 recountdiff(1) recalcula contagens e offsets em diffs de contexto unificado
patchutils V:15, I:121 185 rediff(1) corrige os offsets e as contagens de um diff editado manualmente
patchutils V:15, I:121 185 splitdiff(1) separa patches incrementais
patchutils V:15, I:121 185 unwrapdiff(1) desembaralha patches cujas linhas foram alteradas para arrumação de palavras
wiggle V:0, I:0 167 wiggle(1) aplica patches rejeitadas
quilt V:8, I:67 822 quilt(1) gere séries de patches
meld V:9, I:42 1825 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 58 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:12, I:136 821 wdiff(1) mostra diferenças de palavras entre ficheiros de texto

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.


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.

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.


[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.6.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", …

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.

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.

Mesmo que o seu repositório de origem use um VCS diferente, pode ser uma 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).


[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).

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”.

Veja o seguinte.

  • cvs(1)

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

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

  • "/usr/share/doc/cvsbook"

  • "info cvs"

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.

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.

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".


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.

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.6.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.