DD Problemas de backup de Bash - “operando não reconhecido”

1

Estou usando o Datto Block Driver para tirar instantâneos do meu servidor em execução todas as noites. Depois que o instantâneo é tirado, eu dd o instantâneo de /dev/datto0 através do PipeViewer ( pv ) e gzip para um arquivo no sistema de arquivos. O arquivo é então enviado para o DropBox e deletado.

Eu automatizei isso com um script Bash e o configurei para ser executado por meio de um cron job todas as noites. Aqui está o trecho do meu script Bash que está me dando problemas:

echo "$(date +"%r"): Calculating MD5 checksum of /dev/datto0..."
MD5=$(md5sum /dev/datto0)
echo "$(date +"%r"): MD5: $MD5"

echo "$(date +"%r"): Compressing /dev/datto0 via gzip to /tmp directory..."
dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

echo "$(date +"%r"): Compression complete. File size is: $(du -b /tmp/BACKUP_${TODAY}_${MD5}.dd.gz | cut -f1) bytes"

Este é o erro que está sendo lançado:

02:37:35 PM: Calculating MD5 checksum of /dev/datto0...
02:54:01 PM: MD5: 28a6a6c11f088d6149d178af6e45102a  /dev/datto0
02:54:01 PM: Compressing /dev/datto0 via gzip to /tmp directory...
dd: unrecognized operand ‘/dev/datto0.dd.gz’
Try 'dd --help' for more information.
 896kB 0:00:00 [42.7MB/s] [  <=>                                                                                                      ]
du: cannot access ‘/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a’: No such file or directory
du: cannot access ‘/dev/datto0.dd.gz’: No such file or directory
02:54:01 PM: Compression complete. File size is:  bytes

Aqui está a parte do erro que está realmente me fazendo coçar a cabeça:

dd: unrecognized operand ‘/dev/datto0.dd.gz’

Nem uma vez no meu script estou me referindo a /dev/datto0.dd.gz

Talvez parte do meu comando dd esteja sendo ignorado por algum motivo? dd: unrecognized operand ‘/dev/datto0.dd.gz’

    
por Andrew Paglusch 21.09.2015 / 17:36

2 respostas

2

O problema é que a saída de md5sum inclui tanto o valor de hash como o nome do arquivo original, então a variável MD5 é configurada para algo como "28a6a6c11f088d6149d178af6e45102a / dev / datto0". Assim o comando

dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

expande para

dd of=/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a /dev/datto0.dd.gz

... o que confunde muito dd . Da mesma forma, quando você usa > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz , ele expande para duas palavras, o shell não sabe ao certo para qual enviar a saída e fornece um erro de "redirecionamento ambíguo".

Você poderia resolver isso canalizando a saída de md5sum através de awk '{print $1}' :

MD5=$(md5sum /dev/datto0 | awk '{print $1}')

... ou usando a variável de expansão ${MD5%% *} , que cortará o primeiro espaço e tudo depois dele. Além disso, geralmente é uma boa idéia manter as referências de variáveis dentro de aspas duplas - isso evita muitos problemas de análise estranhos como esse. Combinando isso com a sugestão de JakeGould dá:

dd if=/dev/datto0 | pv | gzip -1 > "/tmp/BACKUP_${TODAY}_${MD5%% *}.dd.gz"
    
por 22.09.2015 / 18:48
1

Este comando dd parece estranho. Por que há um dd if em um lado dos tubos e um dd of no outro lado dos tubos?

dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

Com base em o conselho dado nesta página sobre o uso de dd para fins de backup, parece que seu comando deve ser algo assim:

dd if=/dev/datto0 | pv | gzip -1 > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz

Observe como o último | dd of= agora é apenas um redirecionamento simples de saída por meio de uma seta para a direita ( > ).

    
por 21.09.2015 / 17:51

Tags