Cópia binária dd

Uma imagem binária é uma cópia bia a bit do conteúdo de uma mídia, contendo os dados e todas as estruturas lógicas, como a tabela de partições. Essa imagem permite que o conteúdo da mídia (incluindo os arquivos deletados) sejam armazenados, copiados e restaurados posteriormente em outra mídia.

É uma estratégia muito útil para guardar a informação sem alterações nem se preocupar em instalar o sistema operacional e configurações tudo de novo. No entanto, a imagem sempre possui exatamente o mesmo tamanho da mídia original. Ou seja, um HD de 80 GB resultará em uma imagem de também 80 GB, mesmo que ele possua apenas 5 GB ocupados.

O Linux possui um utilitário padrão para realizar cópias binárias de mídias, partições ou mesmo arquivos: o dd. O comando sempre é chamado recebendo como argumentos a entrada de dados (if, de input flow) e a saída de dados (of, de output flow).

Veja esse exemplo do comando dd para copiar um cartão SD instalado como dispositivo “/dev/sdb” (com duas partições) para um único arquivo de imagem ISO:

Se quiser apensa copiar a partição “/dev/sdb1” para uma imagem ISO:

O inverso do processo acima se dá pelo seguinte comando:

Se quiser gravar o conteúdo de um CD em um arquivo ISO (com algumas opções extras, como exibição de progresso da cópia):

Uma opção muito utilizada é a “bs” (Byte Size), que indica a taxa de bytes enviados por vez. O padrão é 512 bytes, mas pode ser alterado para diferentes valores: bs=1024, bs=512K (aqui em KB), bs=1M (aqui em MB), etc. O que determina o tamanho ideal de BS são questões de hardware. Veja esse exemplo de script para testar diferentes velocidade e ver qual é a melhor (baseado nesse e nesse link):

O comando dd no script também conta com as opções “count” (que limita o número de blocos a serem copiados) e “conv” (converte o arquivo conforme os argumentos informados, separados por vírgula). Dentre os argumentos de “conv”, estão “sync” e “noerror”, que basicamente permitem copiar um bloco de informação mantendo o tamanho (através da inclusão de zeros, em caso de erro na leitura) e sem interrupção no caso de haver erro.

Como as cópias demoram um tempo razoável, é interessante acompanhar o procedimento. O comando dd não tem uma saída visual, então é preciso fazer alguns truques.

1) Abra outro terminal, e digite o seguinte comando:

Volte para o terminal onde está ocorrendo a cópia e estará impressa a quantidade de dados copiados e a velocidade da cópia. Caso seja necessário, verifique o PID e coloque manualmente após o “-USR1”.

2) Utilize o dialog para exibir uma interface gráfica, e o comando pv (acrônimo para Pipe Viewer, que recebe a saída de um comando via pipe e formata os dados conforme as flags que você indicar) – instaláveis através do comando “sudo apt-get install dialog pv”. O comando final segue na última linha do script abaixo (as variáveis de entrada e saída foram definidas nas linhas acima para facilitar a intervenção):

Quando terminar a cópia, o comando libera o terminal novamente.

Caso necessite fazer alguma alteração na imagem, você deverá montá-la em um diretório (lembre-se de criar o diretório):

Trabalhe normalmente nele como se fosse um disco físico. Todas as alterações são gravadas diretamente. Depois basta desmontar o volume usando “sudo umount /media/temp”.