Graças à maravilhosa resposta de Scott Pack (eu não sabia como fazer isso com o ssh antes), posso oferecer essa melhoria (se bash
for o seu shell). Isso adicionará compactação paralela, um indicador de progresso e verificará a integridade no link de rede:
tar c file_list |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
tar xC /directory/to/extract/to
'
pv
é um bom programa de visualização de progresso para o seu pipe e pigz
é um programa gzip paralelo que usa quantos threads a sua CPU possui por padrão (acredito que até 8 no máximo). Você pode ajustar o nível de compactação para ajustar melhor a proporção da CPU à largura de banda da rede e trocá-lo com pxz -9e
e pxz -d
se você tiver muito mais CPU do que largura de banda. Você só precisa verificar se as duas somas correspondem após a conclusão.
Essa opção é útil para quantidades muito grandes de dados, bem como para redes de alta latência, mas não é muito útil se o link estiver instável e cair. Nesses casos, o rsync é provavelmente a melhor opção possível.
Saída de amostra:
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e - ]
176MiB [9.36MiB/s] [9.36MiB/s] [ <=> ]
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e -
Para dispositivos de bloco:
dd if=/dev/src_device bs=1024k |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
dd of=/dev/src_device bs=1024k
'
Obviamente, verifique se eles têm o mesmo tamanho ou limite com count =, skip =, seek =, etc.
Quando eu copio sistemas de arquivos dessa maneira, geralmente irei dd if=/dev/zero of=/thefs/zero.dat bs=64k && sync && rm /thefs/zero.dat && umount /thefs
zerar a maior parte do espaço não utilizado, o que acelera o xfer.