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 seleção de ficheiros
10.1.6. Meio de arquivo
10.1.7. Aparelho de armazenamento amovível
10.1.8. Escolha de sistema de ficheiros para partilhar dados
10.1.9. Partilhar dados via a rede
10.2. Salvaguarda (backup) e recuperação
10.2.1. Política de cópia de segurança e recuperação
10.2.2. Suites de utilitários de backup
10.2.3. Sugestões de cópia de segurança
10.2.3.1. Cópia de segurança GUI
10.2.3.2. Cópia de segurança acionada por evento de montagem
10.2.3.3. Cópia de segurança acionada por um evento de temporizador
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.3.6. Gestor de palavras-passe
10.4. Ferramentas de fusão de código fonte
10.4.1. Extrair as diferenças para ficheiros fonte
10.4.2. Fundir atualizações para ficheiros de fonte
10.4.3. Integração interativa
10.5. Git
10.5.1. Configuração do cliente Git
10.5.2. Comandos básicos do Git
10.5.3. Dicas do Git
10.5.4. Referências do Git
10.5.5. Outros sistemas de controlo de versões

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 aparelhos 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 partilha controlada dele 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 a usar 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:902, I:999 3077 .tar tar(1) o arquivador standard (de facto standard)
cpio V:440, I:998 1199 .cpio cpio(1) arquivador estilo Unix System V, usar com o find(1)
binutils V:172, I:629 144 .ar ar(1) arquivador para a criação de bibliotecas estáticas
fastjar V:1, I:13 183 .jar fastjar(1) arquivador para Java (estilo zip)
pax V:8, I:14 170 .pax pax(1) novo arquivador standard do POSIX, um compromisso entre tar e cpio
gzip V:876, I:999 252 .gz gzip(1), zcat(1), … LZ77 utilitário de compressão do GNU (o standard de facto)
bzip2 V:166, I:970 112 .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:1, I:16 149 .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:360, I:980 1203 .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)
zstd V:193, I:481 2158 .zstd zstd(1), zstdcat(1), … Utilitário de compressão rápida sem perdas Zstandard
p7zip V:20, I:463 8 .7z 7zr(1), p7zip(1) 7-Zip arquivador de arquivos com alta taxa de compressão (LZMA)
p7zip-full V:110, I:480 12 .7z 7z(1), 7za(1) 7-Zip arquivador de ficheiros com rácio de compressão alto (LZMA compressão e outros)
lzop V:15, I:142 164 .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:48, I:380 616 .zip zip(1) InfoZIP: ferramenta de compressão e arquivo do DOS
unzip V:105, I:771 379 .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).

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

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

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

rsync(8):

# cd ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . [email protected]:/dest

Pode alternativamente usar a sintaxe de "uma barra à direita no diretório fonte".

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ [email protected]:/dest

Alternativamente, pelo seguinte.

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . [email protected]:/dest

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

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . [email protected]:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh [email protected] '(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 diretório "./source/foo" ao diretó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 a depender das ferramentas utilizadas conforme a seguir.

  • "/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 selecionar 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.4.9, “Repetir 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 à direita.

  • Esta avaliação pára assim que o resultado dele é 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 diretó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 "." inicial dele 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 argumento dele.

  • "-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 a seguir.

# find /path/to \
    -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 /path/to/timestamp -print0

Isto significa fazer as seguintes acções.

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

  2. Limitar globalmente a busca para dentro do sistema de ficheiros inicial e usa ERE (ao inves veja 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 diretó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". 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 uso CD-Rs e DVD-Rs 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 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 precisa de um 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.

[Dica] Dica

Se utilizar suportes regraváveis para as suas cópias de segurança, a utilização de um sistema de ficheiros como o btrfs ou zfs, que suportam instantâneos apenas de leitura, pode ser uma boa ideia.

Aparelhos 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 aparelhos amovíveis sem uma entrada correspondente no "/etc/fstab".

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

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

  • PolicyKit disponibiliza os privilégios necessários.

[Dica] Dica

Os aparelhos 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 aparelhos amovíveis não estão listados em "/etc/fstab".

O ponto de montagem no ambiente de trabalho moderno é escolhido como "/media/username/disk_label" que pode ser personalizado da seguinte forma.

  • 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.1.3, “Codificação de nomes de ficheiros”).

[Dica] Dica

A utilização do menu da GUI para desmontar um sistema de ficheiros pode remover o nó de aparelho dele gerado dinamicamente tal como "/dev/sdc". Se desejar manter o nó de aparelho dele, desmonte-o com o comando umount(8) na linha de comandos da shell.

Quando partilha dados com outros sistemas via aparelhos de armazenamento amovível, 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 aparelhos de armazenamento amovíveis com cenários de utilização típica

nome do sistema de ficheiros 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 aparelhos como pequenos discos rígidos (<2GiB)
FAT32 partilha de dados em várias plataformas em aparelhos como grandes discos rígidos (<8TiB, suportado por mais recente que MS Windows95 OSR2)
exFAT partilha de dados entre plataformas no dispositivo semelhante a um disco rígido de grandes dimensões (<512TiB, suportado pelo WindowsXP, Mac OS X Snow Leopard 10.6.5 e kernel Linux desde a versão 5.4)
NTFS partilha de dados em várias plataformas em aparelhos 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)
MINIX armazenamento de dados em ficheiros unix eficiente em espaço em disquetes
ext2 partilha de dados em aparelhos tipo disco rígido com sistemas Linux mais antigos
ext3 partilha de dados em aparelhos tipo disco rígido com sistemas Linux mais antigos
ext4 partilha de dados em aparelhos de tipo disco rígido com sistemas Linux atuais
btrfs partilha de dados em aparelhos de tipo disco rígido com sistemas Linux atuais com instantâneos só de leitura

[Dica] Dica

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

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

Quando formatar aparelhos 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 a utilizar o tar(1), ou cpio(1) para reter o nome longo do ficheiro, a ligação simbólica, 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 segurar o conteúdo dele 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 a ser a utilização ineficiente do espaço do disco na "Visão geral dos sistemas de ficheiros FAT, HPFS e NTFS" dele. Claro que 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 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 atual de salvaguarda e recuperação.

  1. Saber o que salvaguardar e recuperar.

  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.

    • Risco de perda de dados

      • Os dados devem estar, pelo menos, em partições de disco diferentes, de preferência em discos e máquinas diferentes, para resistir à corrupção do sistema de ficheiros. É preferível armazenar os dados importantes num sistema de ficheiros só de leitura. [4]

    • Risco de violação de dados

      • Dados de identidade sensíveis, como "/etc/ssh/ssh_host_*_key", "~/.gnupg/*", "~/.ssh/*", "~/.local/share/keyrings/*", "/etc/passwd", "/etc/shadow", "popularity-contest.conf", "/etc/ppp/pap-secrets", e "/etc/exim4/passwd.client" devem ser copiados como encriptados. [5] (Ver Secção 9.9, “Dicas de encriptação de dados”.)

      • Nunca codifique a palavra-passe de início de sessão do sistema nem a frase-passe de desencriptação em qualquer script, mesmo em qualquer sistema fiável. (Ver Secção 10.3.6, “Gestor de palavras-passe”.)

    • Modo de falha e a possibilidade dele

      • O hardware (especialmente o disco rígido) avaria-se

      • O sistema de ficheiros pode estar corrompido e os dados nele contidos podem perder-se

      • O sistema de armazenamento remoto não é fiável em termos de violações de segurança

      • Uma proteção por palavra-passe fraca pode ser facilmente comprometida

      • O sistema de permissão de ficheiros pode estar comprometido

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

      • Cópia de segurança automática agendada com a tarefa cron ou a tarefa de temporizador systemd

[Dica] Dica

Pode recuperar dados configuração debconf com "debconf-set-selections debconf-selections" e dados de seleção do dpkg com "dpkg --set-selection <dpkg-selections.list".

[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 exatamente o que está a fazer, eles são enormes quantidades de dados desnecessários.

[Nota] Nota

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

Aqui está uma lista selcionada 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
bacula-common V:8, I:10 2305 Bacula: salvaguarda, recuperação e verificação em rede - ficheiros de suporte comum
bacula-client V:0, I:2 178 Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote cliente
bacula-console V:0, I:3 112 Bacula: salvaguarda, recuperação e verificação em rede - consola de texto
bacula-server I:0 178 Bacula: salvaguarda, recuperação e verificação em rede - meta-pacote servidor
amanda-common V:0, I:2 9897 Amanda: Advanced Maryland Automatic Network Disk Archiver (Bibliotecas)
amanda-client V:0, I:2 1092 Amanda: Advanced Maryland Automatic Network Disk Archiver (Cliente)
amanda-server V:0, I:0 1077 Amanda: Advanced Maryland Automatic Network Disk Archiver (Servidor)
backuppc V:2, I:2 3178 BackupPC é um sistema de grau empresarial de alta performance para fazer salvaguardas a PCs (baseado em disco)
duplicity V:30, I:50 1973 salvaguarda incremental (remoto)
deja-dup V:28, I:44 4992 Interface gráfica para duplicidade
borgbackup V:11, I:20 3301 Cópia de segurança com desduplicação (remota)
borgmatic V:2, I:3 509 auxiliar borgbackup
rdiff-backup V:4, I:10 1203 salvaguarda incremental (remoto)
restic V:2, I:6 21385 salvaguarda incremental (remoto)
backupninja V:2, I:3 360 sistema de meta-backup leve e extensível
flexbackup V:0, I:0 243 salvaguarda incremental (remoto)
slbackup V:0, I:0 151 salvaguarda incremental (remoto)
backup-manager V:0, I:1 566 ferramenta de salvaguarda de linha de comandos
backup2l V:0, I:0 115 ferramenta de baixa manutenção para salvaguarda/restauro para medias montáveis (baseado em disco)

As ferramentas de salvaguarda têm os seus objetivos 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.

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

  • Duplicity, e Borg são utilitários de backup mais simples para estações de trabalho típicas.

Para uma estação de trabalho pessoal, os utilitários de backup completos concebidos para o ambiente de servidor podem não ser úteis. Ao mesmo tempo, os utilitários de backup existentes para estações de trabalho podem ter algumas deficiências.

Seguem-se algumas sugestões para facilitar a cópia de segurança com o mínimo de esforço do utilizador. Estas técnicas podem ser utilizadas com qualquer utilitário de cópia de segurança.

Para fins de demonstração, vamos assumir que o utilizador principal e o nome do grupo são pinguim e criar um exemplo de script de cópia de segurança e instantâneo "/usr/local/bin/bkss.sh" como:

#!/bin/sh -e
SRC="$1" # source data path
DSTFS="$2" # backup destination filesystem path
DSTSV="$3" # backup destination subvolume name
DSTSS="${DSTFS}/${DSTSV}-snapshot" # snapshot destination path
if [ "$(stat -f -c %T "$DSTFS")" != "btrfs" ]; then
  echo "E: $DESTFS needs to be formatted to btrfs" >&2 ; exit 1
fi
MSGID=$(notify-send -p "bkup.sh $DSTSV" "in progress ...")
if [ ! -d "$DSTFS/$DSTSV" ]; then
  btrfs subvolume create "$DSTFS/$DSTSV"
  mkdir -p "$DSTSS"
fi
rsync -aHxS --delete --mkpath "${SRC}/" "${DSTFS}/${DSTSV}"
btrfs subvolume snapshot -r "${DSTFS}/${DSTSV}" ${DSTSS}/$(date -u --iso=min)
notify-send -r "$MSGID" "bkup.sh $DSTSV" "finished!"

Aqui, apenas a ferramenta básica rsync(1) é utilizada para facilitar a cópia de segurança do sistema e o espaço de armazenamento é utilizado de forma eficiente pelo Btrfs.

[Dica] Dica

Para sua informação: Este autor utiliza o seu próprio script de shell semelhante "bss: Btrfs Subvolume Snapshot Utility" para a sua estação de trabalho.

Aqui está um exemplo para configurar a cópia de segurança de um único clique da GUI.

Para cada clique na GUI, é feita uma cópia de segurança dos seus dados de "~/Documents" para um dispositivo de armazenamento USB e é criada uma imagem só de leitura.

Eis um exemplo de configuração para a cópia de segurança automática acionada pelo evento de montagem.

Para cada evento de montagem, é feita uma cópia de segurança dos seus dados de "~/Documents" para um dispositivo de armazenamento USB e é criada uma imagem só de leitura.

Aqui, os nomes das unidades montadas systemd, que o systemd tem atualmente em memória podem ser pedidos ao gestor de serviços do utilizador que os chama com "systemctl --user list-units --type=mount".

Eis um exemplo de configuração da cópia de segurança automática acionada pelo evento do temporizador.

  • Prepare um dispositivo de armazenamento USB para ser utilizado para a cópia de segurança, como em Secção 10.2.3.1, “Cópia de segurança GUI”.

  • Crie um ficheiro systemd de unidade temporizadora "~/.config/systemd/user/snap-Documents.timer" como:

    [Unit]
    Description=Run btrfs subvolume snapshot on timer
    Documentation=man:btrfs(1)
    
    [Timer]
    OnStartupSec=30
    OnUnitInactiveSec=900
    
    [Install]
    WantedBy=timers.target
    
  • Crie um ficheiro systemd de unidade de serviço "~/.config/systemd/user/snap-Documents.service" como:

    [Unit]
    Description=Run btrfs subvolume snapshot
    Documentation=man:btrfs(1)
    
    [Service]
    Type=oneshot
    Nice=15
    ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
    IOSchedulingClass=idle
    CPUSchedulingPolicy=idle
    StandardOutput=append:%h/.cache/systemd-snap.log
    StandardError=append:%h/.cache/systemd-snap.log
    
  • Ativar esta configuração da unidade systemd com o seguinte:

     $ systemctl --user enable snap-Documents.timer
    

Para cada evento do temporizador, é feita uma cópia de segurança dos seus dados de "~/Documents" para um dispositivo de armazenamento USB e é criada uma imagem só de leitura.

Aqui, os nomes das unidades temporizadoras de utilizador do systemd, que o systemd tem atualmente em memória podem ser perguntados ao gestor de serviços do utilizador que os chama com "systemctl --user list-units --type=timer".

Para o sistema de área de trabalho moderna, esta abordagem do systemd pode oferecer um controlo mais fino do que os tradicionais sistemas Unix que utilizam at(1), cron(8), ou anacron(8).

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.9, “Dicas de encriptação de dados” em dm-crypt e fscrypt 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 a usar 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
patch V:97, I:700 248 patch(1) aplica ficheiro diff a um original
vim V:95, I:369 3743 vimdiff(1) compara dois ficheiros lado a lado no vim
imediff V:0, I:0 200 imediff(1) ferramenta de fusão de 2 ou 3 vias interactiva de écran completo
meld V:7, I:30 3536 meld(1) compara e funde ficheiros (GTK)
wiggle V:0, I:0 175 wiggle(1) aplica patches rejeitadas
diffutils V:862, I:996 1735 diff(1) compara ficheiros linha a linha
diffutils V:862, I:996 1735 diff3(1) compara e junta três ficheiros linha a linha
quilt V:2, I:22 871 quilt(1) gere séries de patches
wdiff V:7, I:51 648 wdiff(1) mostra diferenças de palavras entre ficheiros de texto
diffstat V:13, I:121 74 diffstat(1) produz um histograma de alterações feitas pelo diff
patchutils V:16, I:119 232 combinediff(1) cria uma patch cumulativa de duas patches incrementais
patchutils V:16, I:119 232 dehtmldiff(1) extrai um diff de uma página HTML
patchutils V:16, I:119 232 filterdiff(1) extrai ou executa diffs de um ficheiro diff
patchutils V:16, I:119 232 fixcvsdiff(1) corrige ficheiros diff criados pelo CVS que o patch(1) interpreta mal
patchutils V:16, I:119 232 flipdiff(1) troca a ordem de duas patches
patchutils V:16, I:119 232 grepdiff(1) mostra que ficheiros são modificados por uma patch que corresponde a um regex
patchutils V:16, I:119 232 interdiff(1) mostra as diferenças entre dois ficheiros diff unificados
patchutils V:16, I:119 232 lsdiff(1) mostra quais ficheiros são modificados por uma patch
patchutils V:16, I:119 232 recountdiff(1) recalcula contagens e offsets em diffs de contexto unificado
patchutils V:16, I:119 232 rediff(1) corrige os offsets e as contagens de um diff editado manualmente
patchutils V:16, I:119 232 splitdiff(1) separa patches incrementais
patchutils V:16, I:119 232 unwrapdiff(1) desembaralha patches cujas linhas foram alteradas para arrumação de palavras
dirdiff V:0, I:1 167 dirdiff(1) mostra diferenças e funde alterações entre árvores de diretórios
docdiff V:0, I:0 553 docdiff(1) compara dois ficheiros palavra a palavra / caractere a caractere
makepatch V:0, I:0 100 makepatch(1) gera ficheiros de patch extensos
makepatch V:0, I:0 100 applypatch(1) aplica ficheiros de patch extensos

Atualmente, o Git é a ferramenta de eleição para o sistema de controlo de versões (VCS), uma vez que o Git pode fazer tudo para a gestão local e remota do código-fonte.

O Debian disponibiliza serviços Git livres via Serviço Debian Salsa.. A sua documentação encontra-se em https://wiki.debian.org/Salsa .

Aqui estão alguns pacotes relacionados com o Git.


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 "Name Surname"
$ git config --global user.email [email protected]

Também pode personalizar o comportamento predefinido do Git da seguinte forma.

$ git config --global init.defaultBranch main
$ git config --global pull.rebase true
$ git config --global push.default current

Se 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

Pode verificar a sua configuração global com o seguinte.

$ git config --global --list

A operação Git envolve vários dados.

  • A árvore de trabalho que contém os ficheiros que o utilizador enfrenta e nos quais faz alterações.

    • As alterações a serem registadas devem ser explicitamente selecionadas e colocadas no índice. Estes são os comandos git add e git rm.

  • O índice que contém os ficheiros preparados.

    • Os ficheiros preparados serão confirmados para o repositório local após o pedido subsequente. Este é o comando git commit.

  • O repositório local que contém os ficheiros confirmados.

    • O Git regista o histórico ligado dos dados confirmados e organiza-os como ramos no repositório.

    • O repositório local pode enviar dados para o repositório remoto através do comando git push.

    • O repositório local pode receber dados do repositório remoto através dos comandos git fetch e git pull.

      • O comando git pull executa o comando git merge ou git rebase após o comando git fetch.

      • Aqui, git merge combina dois ramos separados do histórico no final para um ponto. (Este é o padrão do git pull sem personalização e pode ser bom para as pessoas que publicam o ramo para muitas pessoas.)

      • Aqui, git rebase cria um único ramo do histórico sequencial do ramo remoto seguido pelo ramo local. (Este é o caso de personalização pull.rebase true e pode ser bom para o resto de nós.)

  • O repositório remoto que contém os ficheiros confirmados.

    • A comunicação com o repositório remoto utiliza protocolos de comunicação seguros, como SSH ou HTTPS.

A árvore de trabalho são os arquivos fora do diretório .git/. Os ficheiros dentro do diretório .git/ contêm o índice, os dados do repositório local e alguns ficheiros de texto de configuração do git.

Aqui está uma visão geral dos principais comandos do Git.


Eis algumas dicas do Git.

Tabela 10.13. Dicas do Git

Linha de comando do Git função
gitk --all ver o histórico completo do Git e operar sobre ele, como redefinir o HEAD para outro commit, escolher patches, criar tags e branches ...
git stash obter a árvore de trabalho limpa sem perder dados
git remote -v verificar as definições do controlo remoto
git branch -vv verificar definições para o seu ramo
git status mostrar o estado da árvore de trabalho
git config -l listar definições git
git reset --hard HEAD; git clean -x -d -f reverter todas as alterações da árvore de trabalho e limpá-las completamente
git rm --cached filename reverte o índice de fases alterado pelo git add filename
git reflog obter registo de referência (útil para recuperar commits do ramo removido)
git branch new_branch_name HEAD@{6} criar um novo ramo a partir da informação do reflog
git remote add new_remote URL adicionar um repositório remoto new_remote apontado pelo URL
git remote rename origin upstream renomear o nome do repositório remoto de origin para upstream
git branch -u upstream/branch_name defina o rastreio remoto para o repositório remoto upstream e o seu nome de ramo branch_name.
git remote set-url origin https://foo/bar.git alterar URL de origin
git remote set-url --push upstream DISABLED desativar o envio para upstream (Editar .git/config para voltar a ativar)
git remote update upstream obter atualizações de todos os ramos remotos no repositório "upstream" a montante
git fetch upstream foo:upstream-foo criar um ramo upstream-foo local (possivelmente órfão) como uma cópia do ramo foo no repositório upstream
git checkout -b topic_branch ; git push -u topic_branch origin criar um novo topic_branch e enviá-lo para a origem
git branch -m oldname newname renomear o nome do ramo local
git push -d origin branch_to_be_removed remover o ramo remoto (novo método)
git push origin :branch_to_be_removed remover o ramo remoto (método antigo)
git checkout --orphan unconnected criar um novo ramo unconnected
git rebase -i origin/main reorder/drop/squish commits de origin/main para limpar o histórico do ramo
git reset HEAD^; git commit --amend squash os últimos 2 commits num só
git checkout topic_branch ; git merge --squash topic_branch squash todo o topic_branch num commit
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' converter um clone superficial num clone completo de todos os ramos
git ime divide o último commit numa série de commits mais pequenos, ficheiro a ficheiro, etc. (é necessário o pacote imediff )
git repack -a -d; git prune reempacotar o repositório local num único pacote (isto pode limitar a possibilidade de recuperação de dados perdidos a partir de um ramo apagado, etc.)

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

[Cuidado] Cuidado

Se um ramo local que foi enviado para o repositório remoto for rebaseado ou squashed, o envio deste ramo tem riscos e requer a opção --force. Isso geralmente não é aceitável para o ramo principal, mas pode ser aceitável para um ramo tópico antes de mesclar com o ramo principal.

[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

Se existir um ficheiro executável git-foo no caminho especificado por $PATH, inserir "git foo" sem hífen na linha de comandos invoca este git-foo. Isto é uma característica do comando git.

Veja o seguinte.



[4] Uma média de escrita única como o CD/DVD-R pode evitar acidentes de sobreescrita. (Veja Secção 9.8, “Os dados binários” para saber como escrever para o suporte de armazenamento a partir da linha de comandos da shell. O ambiente GUI do ambiente de trabalho GNOME dá-lhe acesso fácil através do menu: "Locais→Criador de CD/DVD".)

[5] Alguns destes dados não podem ser gerados de novo introduzindo a mesma cadeia de entrada no sistema.

[6] Se utilizar "~/.vimrc" em vez de "~/.vim/vimrc", substitua-o em conformidade.