Índice
São descritas ferramentas e dicas para gerir dados binários e de texto no sistema Debian.
![]() |
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:565, I:999 | 2614 |
.tar
|
tar(1) | o arquivador standard (de facto standard) |
cpio
|
V:333, I:999 | 844 |
.cpio
|
cpio(1) | arquivador estilo Unix System V, usar com o find(1) |
binutils
|
V:300, I:761 | 19469 |
.ar
|
ar(1) | arquivador para a criação de bibliotecas estáticas |
fastjar
|
V:8, I:82 | 191 |
.jar
|
fastjar(1) | arquivador para Java (estilo zip) |
pax
|
V:19, I:71 | 147 |
.pax
|
pax(1) |
novo arquivador standard do POSIX, um compromisso entre
tar e cpio
|
gzip
|
V:862, I:999 | 239 |
.gz
|
gzip(1), zcat(1), … | LZ77 utilitário de compressão do GNU (o standard de facto) |
bzip2
|
V:405, I:904 | 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:10, I:127 | 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:212, I:946 | 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:9, I:91 | 966 |
.7z
|
7zr(1), p7zip(1) | 7-Zip arquivador de ficheiros com alta taxa de compressão (compressão LZMA) |
p7zip-full
|
V:220, I:516 | 3810 |
.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:41 | 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:51, I:355 | 593 |
.zip
|
zip(1) | InfoZIP: ferramenta de compressão e arquivo do DOS |
unzip
|
V:287, I:789 | 377 |
.zip
|
unzip(1) | InfoZIP: ferramenta de descompressão e de de-arquivar do DOS |
![]() |
Atenção |
---|---|
Não defina a variável " |
![]() |
Nota |
---|---|
O arquivo
tar(1)
gzipado usa a extensão de ficheiro " |
![]() |
Nota |
---|---|
O arquivo
tar(1)
comprimido em xz usa a extensão de ficheiro " |
![]() |
Nota |
---|---|
Método de compressão popular em ferramentas FOSS
tal como o
tar(1)
têm se movido como se segue: |
![]() |
Nota |
---|---|
cp(1), scp(1) e tar(1) podem ter algumas limitações para ficheiros especiais. cpio(1) é o mais versátil. |
![]() |
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 |
---|---|
A estrutura interna dos ficheiros de dados do Libreoffice são ficheiros
" |
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:866, I:999 | 13844 | GNU cp | copia localmente ficheiros e directórios ("-a" para ser recursivo) |
openssh-client
|
V:537, I:995 | 3758 | scp |
copia remotamente ficheiros e directórios (cliente, "-r "
para ser recursivo)
|
openssh-server
|
V:623, I:787 | 944 | sshd | copia ficheiros e directórios remotamente (servidor remoto) |
rsync
|
V:199, I:578 | 728 | - | sincronização remota a salvaguarda de 1 via |
unison
|
V:6, I:25 | 1977 | - | sincronização remota a salvaguarda de 2 vias |
obnam
|
V:0, I:2 | 1425 | - | salvaguarda incremental (remoto) |
rdiff-backup
|
V:10, I:21 | 704 | - | salvaguarda incremental (remoto) |
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 |
---|---|
A execução do script |
![]() |
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 várias maneiras de arquivar e "desarquivar" o conteúdo completo
do directório "./source
" usando diferentes ferramentas.
GNU tar(1):
$ tar -cvJf archive.tar.xz ./source $ tar -xvJf archive.tar.xz
Alternativamente, pelo seguinte.
$ find ./source -xdev -print0 | tar -cvJf archive.tar.xz --null -F -
cpio(1):
$ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; xz archive.cpio $ zcat archive.cpio.xz | cpio -i
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 |
---|---|
rsync(8)
e
cp(1)
do GNU têm a opção " |
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.
Procurar todos os ficheiros que começam por
"/caminho/para
"
Limitar globalmente a sua busca dentro do sistema de ficheiros inicial e usa ERE (veja antes Secção 1.6.2, “Expressões regulares”)
Excluir da busca os ficheiros que correspondem à expressão regular
".*\.cpio
" ou ".*~
" ao parar o
processamento
Excluir da busca os directórios que correspondem à expressão regular
".*/\.git
" ao parar o processamento
Exclui da busca os ficheiros maiores que 99 Mb (unidades de 1048576 bytes) ao parar o processamento
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 |
---|---|
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 " |
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 |
---|---|
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 |
---|---|
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 |
---|---|
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 |
---|---|
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.
Câmara digital
Leitor digital de música
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
"
![]() |
Dica |
---|---|
Os dispositivos auto-montados podem ter a opção de montagem
" |
![]() |
Dica |
---|---|
A auto-montagem em ambientes de trabalho modernos apenas acontece quando
esses dispositivos amovíveis não estão listados em
" |
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 |
---|---|
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”). |
![]() |
Dica |
---|---|
A utilização do menu da GUI para desmontar um sistema de ficheiros pode
remover o seu nó de dispositivo gerado dinamicamente tal como
" |
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.3. 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 |
---|---|
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.
Particioná-los com o fdisk(8), cfdisk(8) ou parted(8) (veja Secção 9.5.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 |
---|---|
Para o sistema de ficheiros FAT pelo seu desenho, o tamanho máximo de
ficheiro é |
![]() |
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 |
---|---|
Para mais sistemas de ficheiros e acesso a sistemas de ficheiros, por favor leia "HOWTO dos Sistemas de Ficheiros". |
Quando se partilha dados com outro sistema via rede, você deve usar serviços comuns. Aqui estão algumas dicas.
Tabela 10.4. 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.x.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.
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”.
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 |
---|---|
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.
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
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
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 |
---|---|
Não faça salvaguarda aos conteúdos dos pseudo-sistemas de ficheiros
encontrados em |
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 |
---|---|
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 |
---|---|
Você deve ter cuidados extra com o backup e restauro de ficheiros de dados
relacionados com identidade como os
" |
![]() |
Nota |
---|---|
Se você correr uma tarefa cron como um processo de utilizador, você tem de
restaurar os ficheiros no directório
" |
Aqui está uma lista seleccionada de suites de utilitários de backup notáveis disponíveis no sistema Debian.
Tabela 10.5. Lista de suites utilitárias de salvaguarda
pacote | popcon | tamanho | descrição |
---|---|---|---|
dump
|
V:1, I:9 | 592 | 4.4 BSD dump(8) e restore(8) para sistemas de ficheiros ext2/ext3/ext4 |
xfsdump
|
V:1, I:14 | 789 | dump e restore com xfsdump(8) e xfsrestore(8) para sistema de ficheiros XFS em GNU/Linux e IRIX |
backupninja
|
V:4, I:4 | 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:10, I:20 | 1176 | Bacula: salvaguarda, recuperação e verificação em rede - ficheiros de suporte comum |
bacula-client
|
I:6 | 114 | Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote cliente |
bacula-console
|
V:2, I:8 | 197 | Bacula: salvaguarda, recuperação e verificação em rede - consola de texto |
bacula-server
|
I:2 | 114 | Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote servidor |
amanda-common
|
V:2, I:4 | 7000 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Bibliotecas) |
amanda-client
|
V:2, I:4 | 773 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Cliente) |
amanda-server
|
V:0, I:1 | 840 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Servidor) |
backuppc
|
V:5, I:6 | 2045 | BackupPC é um sistema de grau empresarial de alta performance para fazer salvaguardas a PCs (baseado em disco) |
backup-manager
|
V:2, I:3 | 615 | ferramenta de salvaguarda de linha de comandos |
backup2l
|
V:1, I:1 | 78 | 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.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 |
---|---|
Veja os ficheiros em " |
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.
Edite este script para cobrir todos os seus dados importantes (veja Secção 10.1.5, “Idiomas para a selecção de ficheiros” e Secção 10.2, “Salvaguarda (backup) e recuperação”).
Substitua "find … -print0
" por "find … -newer
$BUDIR/backup.stamp -print0
" para fazer uma salvaguarda
incremental.
Transfira os ficheiros de backup para a máquina remota usando scp(1) ou rsync(1) ou grave-os em CD/DVD para segurança extra dos dados. (Eu uso a GUI do ambiente GNOME para gravar CD/DVD. Veja See Secção 12.1.8, “Exemplo de script de shell com zenity” para redundância extra.)
Mantenha a coisa simples!
![]() |
Dica |
---|---|
Você pode recuperar dados configuração debconf com
" |
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 |
---|---|
Eu tenho este |
![]() |
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.
Tabela 10.6. Lista de ferramentas de infraestrutura da segurança de dados
pacote | popcon | tamanho | comando | descrição |
---|---|---|---|---|
gnupg
|
V:395, I:999 | 5056 | gpg(1) | GNU Privacy Guard - ferramenta de encriptação e assinatura OpenPGP |
gnupg-doc
|
I:6 | 4124 | N/D | Documentação do GNU Privacy Guard |
gpgv
|
V:572, I:998 | 445 | gpgv(1) | GNU Privacy Guard - ferramenta de verificação de assinaturas |
paperkey
|
V:0, I:0 | 39 | paperkey(1) | extrai apenas a informação secreta de chaves secretas OpenPGP |
cryptsetup
|
V:34, I:61 | 365 | cryptsetup(8), … | utilitários para encriptação de dispositivos de bloco do dm-crypto que suportam LUKS |
ecryptfs-utils
|
V:5, I:7 | 333 | ecryptfs(7), … | utilitários para encriptação de sistemas de ficheiros empilhados do ecryptfs |
coreutils
|
V:866, I:999 | 13844 | md5sum(1) | computa e verifica o resumo da mensagem MD5 |
coreutils
|
V:866, I:999 | 13844 | sha1sum(1) | computa e verifica o resumo da mensagem SHA1 |
openssl
|
V:762, I:983 | 1099 | openssl(1ssl) |
computa o resumo da mensagem com "openssl dgst " (OpenSSL)
|
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.
Tabela 10.7. 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 --export
|
exporta todas as chaves para ficheiro |
gpg --import 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.8. 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
".
Aqui estão exemplos para usar comandos do GNU Privacy Guard em ficheiros.
Tabela 10.9. 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
|
, , |
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
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
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 |
---|---|
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:814, I:945 | 1229 | diff(1) | compara ficheiros linha a linha |
diffutils
|
V:814, I:945 | 1229 | diff3(1) | compara e junta três ficheiros linha a linha |
vim
|
V:148, I:379 | 2063 | vimdiff(1) | compara dois ficheiros lado a lado no vim |
patch
|
V:154, I:949 | 172 | patch(1) | aplica ficheiro diff a um original |
dpatch
|
V:2, I:32 | 237 | dpatch(1) | gere séries de patches para pacote Debian |
diffstat
|
V:14, I:140 | 49 | diffstat(1) | produz um histograma de alterações feitas pelo diff |
patchutils
|
V:12, I:128 | 186 | combinediff(1) | cria uma patch cumulativa de duas patches incrementais |
patchutils
|
V:12, I:128 | 186 | dehtmldiff(1) | extrai um diff de uma página HTML |
patchutils
|
V:12, I:128 | 186 | filterdiff(1) | extrai ou executa diffs de um ficheiro diff |
patchutils
|
V:12, I:128 | 186 | fixcvsdiff(1) | corrige ficheiros diff criados pelo CVS que o patch(1) interpreta mal |
patchutils
|
V:12, I:128 | 186 | flipdiff(1) | troca a ordem de duas patches |
patchutils
|
V:12, I:128 | 186 | grepdiff(1) | mostra que ficheiros são modificados por uma patch que corresponde a um regex |
patchutils
|
V:12, I:128 | 186 | interdiff(1) | mostra as diferenças entre dois ficheiros diff unificados |
patchutils
|
V:12, I:128 | 186 | lsdiff(1) | mostra quais ficheiros são modificados por uma patch |
patchutils
|
V:12, I:128 | 186 | recountdiff(1) | recalcula contagens e offsets em diffs de contexto unificado |
patchutils
|
V:12, I:128 | 186 | rediff(1) | corrige os offsets e as contagens de um diff editado manualmente |
patchutils
|
V:12, I:128 | 186 | splitdiff(1) | separa patches incrementais |
patchutils
|
V:12, I:128 | 186 | unwrapdiff(1) | desembaralha patches cujas linhas foram alteradas para arrumação de palavras |
wiggle
|
V:0, I:0 | 189 | wiggle(1) | aplica patches rejeitadas |
quilt
|
V:7, I:57 | 794 | quilt(1) | gere séries de patches |
meld
|
V:9, I:44 | 2833 | meld(1) | compara e funde ficheiros (GTK) |
dirdiff
|
V:0, I:5 | 191 | dirdiff(1) | mostra diferenças e funde alterações entre árvores de directórios |
docdiff
|
V:0, I:0 | 582 | 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:10, I:131 | 891 | wdiff(1) | mostra diferenças de palavras entre ficheiros de texto |
Os seguintes procedimentos extraem 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
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
Aqui está um sumário dos sistemas de controle de versão (VCS) no sistema Debian.
![]() |
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.11. lista de ferramentas de sistemas de controle de versão
pacote | popcon | tamanho | ferramenta | Tipo VCS | comentário |
---|---|---|---|---|---|
cssc
|
V:0, I:3 | 2023 | CSSC | local | clone do SCCS do Unix (descontinuado) |
rcs
|
V:5, I:33 | 514 | RCS | local | "SCCS do Unix bem feito" |
cvs
|
V:12, I:90 | 4084 | CVS | remoto | VCS remoto standard anterior |
subversion
|
V:60, I:214 | 4707 | Subversion | remoto | "CVS bem feito", o novo VCS remoto standard "de facto" |
git
|
V:162, I:415 | 21596 | Git | distribuído | DVCS rápido em C (usado pelo kernel Linux e outros) |
mercurial
|
V:15, I:75 | 190 | Mercurial | distribuído | DVCS em Python e algum C |
bzr
|
V:4, I:29 | 100 | Bazaar | distribuído |
DVCS influenciado por tla escrito em Python (usado pelo
Ubuntu)
|
darcs
|
V:1, I:10 | 12307 | Darcs | distribuído | DVCS com álgebra inteligente de patches (lento) |
tla
|
V:0, I:9 | 881 | GNU arch | distribuído | DVCS principalmente por Tom Lord (Histórico) |
monotone
|
V:0, I:1 | 5885 | 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:9, I:53 | 1274 | 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.
Use "umask 002
" (veja Secção 1.2.4, “Controlo de permissões para ficheiros acabados de criar: umask”)
Tornar todos os ficheiros de arquivo VCS pertencentes a um grupo pertinente.
Activar a definição de ID de grupo em todos os directórios do arquivo VCS (esquema de criação de ficheiros do tipo BSD, veja Secção 1.2.3, “Permissões do sistema de ficheiros”)
Fazer o utilizador que partilha o arquivo VCS pertencer ao grupo
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.12. Comparação dos comandos VCS nativos
Git | CVS | Subversion | função |
---|---|---|---|
git init
|
cvs init
|
svn create
|
cria o repositório (local) |
- |
cvs login
|
- | login ao repositório remoto |
git clone
|
cvs co
|
svn co
|
faz check out ao repositório remoto como a árvore de trabalho |
git pull
|
cvs up
|
svn up
|
actualiza a árvore de trabalho ao fundir o repositório remoto |
git add .
|
cvs add
|
svn add
|
adiciona ficheiro(s) na árvore de trabalho do VCS |
git rm
|
cvs rm
|
svn 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 |
git status
|
cvs status
|
svn status
|
mostra o estado da árvore de trabalho do VCS |
git diff
|
cvs diff
|
svn 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 |
gitk
|
tkcvs
|
tkcvs
|
Mostrador GUI de árvore de repositório VCS |
![]() |
Cuidado |
---|---|
Invocar um sub-comando |
![]() |
Dica |
---|---|
Se existir um ficheiro executável |
![]() |
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 |
---|---|
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
|
![]() |
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.
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
Veja o seguinte.
manual: git(1)
(/usr/share/doc/git-doc/git.html
)
Manual do Utilizador do Git
(/usr/share/doc/git-doc/user-manual.html
)
Um tutorial de introdução ao
git (/usr/share/doc/git-doc/gittutorial.html
)
Um tutorial de introdução ao
git: parte dois
(/usr/share/doc/git-doc/gittutorial-2.html
)
GIT do Dia-a-Dia com Cerca de
20 Comandos
(/usr/share/doc/git-doc/everyday.html
)
git para utilizadores do CVS
(/usr/share/doc/git-doc/gitcvs-migration.html
)
Isto também descreve como configurar um servidor tipo CVS e extrair dados antigos do CVS para o Git.
Outros recursos do git disponíveis na web
Magia do Git
(/usr/share/doc/gitmagic/html/index.html
)
Os comandos git-gui(1) e gitk(1) tornam a utilização do Git muito fácil.
![]() |
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 |
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).
Tabela 10.13. Lista de pacotes e comandos relacionados com o git
pacote | popcon | tamanho | comando | descrição |
---|---|---|---|---|
git-doc
|
I:23 | 9716 | N/D | documentação oficial para o Git |
gitmagic
|
I:2 | 754 | N/D | "Magia do Git", guia fácil de compreender para o Git |
git
|
V:162, I:415 | 21596 | git(7) | Git, o sistema de controlo de revisão distribuído, rápido e escalável |
gitk
|
V:9, I:53 | 1274 | gitk(1) | explorador GUI de repositórios Git com histórico |
git-gui
|
V:3, I:31 | 1925 | git-gui(1) | GUI para Git (Nenhum histórico) |
git-svn
|
V:3, I:36 | 868 | git-svnimport(1) | importa os dados de Subversion para Git |
git-svn
|
V:3, I:36 | 868 | git-svn(1) | disponibiliza operação bi-direccional entre Subversion e Git |
git-cvs
|
V:1, I:17 | 988 | git-cvsimport(1) | importa os dados de CVS para Git |
git-cvs
|
V:1, I:17 | 988 | git-cvsexportcommit(1) | exporta uma submissão para um checkout do CVS a partir do Git |
git-cvs
|
V:1, I:17 | 988 | git-cvsserver(1) | emulador de servidor CVS para o Git |
git-email
|
V:1, I:16 | 659 | git-send-email(1) | envia uma colecção de patches como email a partir do Git |
stgit
|
V:0, I:4 | 1692 | stg(1) | quilt no topo do git (Python) |
git-buildpackage
|
V:2, I:12 | 3369 | git-buildpackage(1) | automatiza o empacotamento Debian com o Git |
guilt
|
V:0, I:0 | 145 | guilt(7) | quilt no topo do git (SH/AWK/SED/…) |
![]() |
Dica |
---|---|
Com o
git(1),
você trabalha num branch local com muitas submissões e usa algo como
" |
![]() |
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 " |
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 |
---|---|
O uso de " |
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 |
---|---|
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 |
![]() |
Nota |
---|---|
O comando " |
![]() |
Dica |
---|---|
Para uma solução mais completa para gravação do histórico de configuração,
por favor procure o pacote |
Veja o seguinte.
cvs(1)
"/usr/share/doc/cvs/html-cvsclient
"
"/usr/share/doc/cvs/html-info
"
"/usr/share/doc/cvsbook
"
"info 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 |
---|---|
Você pode restringir a criação de novo projecto ao alterar o dono do
directório " |
O repositório CVS predefinido é apontado por
"$CVSROOT
". O seguinte define
"$CVSROOT
" para o acesso local.
$ export CVSROOT=/srv/cvs/project
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@anonscm.debian.org:/cvs/webwml $ cvs login
![]() |
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.
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
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
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 |
---|---|
Use " |
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 |
---|---|
O comando " |
![]() |
Dica |
---|---|
Você pode fazer checkout apenas a um sub directório de
" |
Tabela 10.14. 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 |
Para obter os ficheiros mais recentes do CVS, use
"tomorrow
" com o seguinte.
$ cvs ex -D tomorrow nome-do-módulo
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 |
---|---|
De modo a executar o procedimento em cima, você precisa ter as permissões de ficheiro apropriadas. |
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
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.
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
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/
").
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.
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
".
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 |
---|---|
Você tem de usar o comando " |
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 |
---|---|
Você pode substituir URLs como o " |
Aqui está um exemplo do fluxo de trabalho típico usando o Subversion com o seu cliente nativo.
![]() |
Dica |
---|---|
Os comandos de cliente oferecidos pelo pacote |
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 |
---|---|
Use " |
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 |
---|---|
Você pode substituir URLs como o " |
![]() |
Dica |
---|---|
Você pode fazer checkout apenas a um sub directório do
" |
Tabela 10.15. 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 |