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. Backup and recovery policy
10.2.2. Suites de utilitários de backup
10.2.3. Backup tips
10.2.3.1. GUI backup
10.2.3.2. Mount event triggered backup
10.2.3.3. Timer event triggered backup
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. Password keyring
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. Interactive merge
10.5. Git
10.5.1. Configuração do cliente Git
10.5.2. Basic Git commands
10.5.3. Git tips
10.5.4. Referências do Git
10.5.5. Other version control systems

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 compression utility with higher compression ratio than gzip(1) (deprecated)
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), … Zstandard fast lossless compression utility
p7zip V:20, I:463 8 .7z 7zr(1), p7zip(1) 7-Zip arquivador de arquivos com alta taxa de compressão (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 . user@host.dom:/dest

Pode alternativamente usar a sintaxe de "uma barra à direita no diretó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 . user@host.dom:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh user@host.dom '(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

If you use re-writable media for your backups, use of filesystem such as btrfs or zfs which supports read-only snapshots may be a good idea.

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

  • udisks2 package provides a daemon and associated utilities to mount and unmount these devices.

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

Mount point under modern desktop environment is chosen as "/media/username/disk_label" which can be customized by the following.

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


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

    • Risk of data when lost

      • Data should be at least on different disk partitions preferably on different disks and machines to withstand the filesystem corruption. Important data are best stored on a read-only filesystem. [4]

    • Risk of data when breached

      • Sensitive identity data such as "/etc/ssh/ssh_host_*_key", "~/.gnupg/*", "~/.ssh/*", "~/.local/share/keyrings/*", "/etc/passwd", "/etc/shadow", "popularity-contest.conf", "/etc/ppp/pap-secrets", and "/etc/exim4/passwd.client" should be backed up as encrypted. [5] (See Secção 9.9, “Dicas de encriptação de dados”.)

      • Never hard code system login password nor decryption passphrase in any script even on any trusted system. (See Secção 10.3.6, “Password keyring”.)

    • Modo de falha e a possibilidade dele

      • Hardware (especially HDD) will break

      • Filesystem may be corrupted and data in it may be lost

      • Remote storage system can't be trusted for security breaches

      • Weak password protection can be easily compromised

      • File permission system may be compromised

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

      • Automatic scheduled backup with cron job or systemd timer job

[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 GUI frontend for duplicity
borgbackup V:11, I:20 3301 (remote) deduplicating backup
borgmatic V:2, I:3 509 borgbackup helper
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, and Borg are simpler backup utilities for typical workstations.

For a personal workstation, full featured backup suite utilities designed for the server environment may not serve well. At the same time, existing backup utilities for workstations may have some shortcomings.

Here are some tips to make backup easier with minimal user efforts. These techniques may be used with any backup utilities.

For demonstration purpose, let's assume the primary user and group name to be penguin and create a backup and snapshot script example "/usr/local/bin/bkss.sh" as:

#!/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!"

Here, only the basic tool rsync(1) is used to facilitate system backup and the storage space is efficiently used by Btrfs.

[Dica] Dica

FYI: This author uses his own similar shell script "bss: Btrfs Subvolume Snapshot Utility" for his workstation.

Here is an example to setup the single GUI click backup.

For each GUI click, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here is an example to setup for the automatic backup triggered by the mount event.

  • Prepare a USB storage device to be used for backup as in Secção 10.2.3.1, “GUI backup”.

  • Create a systemd service unit file "~/.config/systemd/user/back-BKUP.service" as:

    [Unit]
    Description=USB Disk backup
    Requires=media-%u-BKUP.mount
    After=media-%u-BKUP.mount
    
    [Service]
    ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
    StandardOutput=append:%h/.cache/systemd-snap.log
    StandardError=append:%h/.cache/systemd-snap.log
    
    [Install]
    WantedBy=media-%u-BKUP.mount
    
  • Enable this systemd unit configuration with the following:

     $ systemctl --user enable bkup-BKUP.service
    

For each mount event, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here, names of systemd mount units that systemd currently has in memory can be asked to the service manager of the calling user with "systemctl --user list-units --type=mount".

Here is an example to setup for the automatic backup triggered by the timer event.

  • Prepare a USB storage device to be used for backup as in Secção 10.2.3.1, “GUI backup”.

  • Create a systemd timer unit file "~/.config/systemd/user/snap-Documents.timer" as:

    [Unit]
    Description=Run btrfs subvolume snapshot on timer
    Documentation=man:btrfs(1)
    
    [Timer]
    OnStartupSec=30
    OnUnitInactiveSec=900
    
    [Install]
    WantedBy=timers.target
    
  • Create a systemd service unit file "~/.config/systemd/user/snap-Documents.service" as:

    [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
    
  • Enable this systemd unit configuration with the following:

     $ systemctl --user enable snap-Documents.timer
    

For each timer event, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here, names of systemd timer user units that systemd currently has in memory can be asked to the service manager of the calling user with "systemctl --user list-units --type=timer".

For the modern desktop system, this systemd approach can offer more fine grained control than the traditional Unix ones using at(1), cron(8), or 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.


See Secção 9.9, “Dicas de encriptação de dados” on dm-crypt and fscrypt which implement automatic data encryption infrastructure via Linux kernel modules.

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

Git is the tool of choice these days for the version control system (VCS) since Git can do everything for both local and remote source code management.

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

Here are some Git related packages.


Git operation involves several data.

  • The working tree which holds user facing files and to which you make changes.

    • The changes to be recorded must be explicitly selected and staged to the index. This is git add and git rm commands.

  • The index which holds staged files.

    • Staged files will be committed to the local repository upon the subsequent request. This is git commit command.

  • The local repository which holds committed files.

    • Git records the linked history of the committed data and organizes them as branches in the repository.

    • The local repository can send data to the remote repository by git push command.

    • The local repository can receive data from the remote repository by git fetch and git pull commands.

      • The git pull command performs git merge or git rebase command after git fetch command.

      • Here, git merge combines two separate branches of history at the end to a point. (This is default of git pull without customization and may be good for upstream people who publish branch to many people.)

      • Here, git rebase creates one single branch of sequential history of the remote branch one followed by the local branch one. (This is pull.rebase true customization case and may be good for rest of us.)

  • The remote repository which holds committed files.

    • The communication to the remote repository uses secure communication protocols such as SSH or HTTPS.

The working tree is files outside of the .git/ directory. Files inside of the .git/ directory hold the index, the local repository data, and some git configuration text files.

Here is an overview of main Git commands.


Here are some Git tips.

Tabela 10.13. Git tips

Git command line função
gitk --all see complete Git history and operate on them such as resetting HEAD to another commit, cheery-picking patches, creating tags and branches ...
git stash get the clean working tree without loosing data
git remote -v check settings for remote
git branch -vv check settings for branch
git status show working tree status
git config -l list git settings
git reset --hard HEAD; git clean -x -d -f revert all working tree changes and clean them up completely
git rm --cached filename revert staged index changed by git add filename
git reflog get reference log (useful for recovering commits from the removed branch)
git branch new_branch_name HEAD@{6} create a new branch from reflog information
git remote add new_remote URL add a new_remote remote repository pointed by URL
git remote rename origin upstream rename the remote repository name from origin to upstream
git branch -u upstream/branch_name set the remote tracking to the remote repository upstream and its branch name branch_name.
git remote set-url origin https://foo/bar.git change URL of origin
git remote set-url --push upstream DISABLED disable push to upstream (Edit .git/config to re-enable)
git remote update upstream fetch updates of all remote branches in the upstream repository
git fetch upstream foo:upstream-foo create a local (possibly orphan) upstream-foo branch as a copy of foo branch in the upstream repository
git checkout -b topic_branch ; git push -u topic_branch origin make a new topic_branch and push it to origin
git branch -m oldname newname rename local branch name
git push -d origin branch_to_be_removed remove remote branch (new method)
git push origin :branch_to_be_removed remove remote branch (old method)
git checkout --orphan unconnected create a new unconnected branch
git rebase -i origin/main reorder/drop/squish commits from origin/main to clean branch history
git reset HEAD^; git commit --amend squash last 2 commits into one
git checkout topic_branch ; git merge --squash topic_branch squash entire topic_branch into a commit
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' convert a shallow clone to the full clone of all branches
git ime split the last commit into a series of file-by-file smaller commits etc. (imediff package required)
git repack -a -d; git prune repack the local repository into single pack (this may limit chance of lost data recovery from erased branch 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

If a local branch which has been pushed to remote repository is rebased or squashed, pushing this branch has risks and requires --force option. This is usually not an acceptable for main branch but may be acceptable for a topic branch before merging to main branch.

[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

If there is a executable file git-foo in the path specified by $PATH, entering "git foo" without hyphen to the command line invokes this git-foo. This is a feature of the git command.

Veja o seguinte.



[4] A write-once media such as CD/DVD-R can prevent overwrite accidents. (See Secção 9.8, “Os dados binários” for how to write to the storage media from the shell commandline. GNOME desktop GUI environment gives you easy access via menu: "Places→CD/DVD Creator".)

[5] Some of these data can not be regenerated by entering the same input string to the system.

[6] If you use "~/.vimrc" instead of "~/.vim/vimrc", please substitute accordingly.