Como clonar um disco no Linux

Clonar um dispositivo de armazenamento pode garantir que você leve, de um local a outro, uma cópia exata de um drive importante para você.
Se o objetivo é criar uma cópia de segurança (ou backup), pode ser interessante acrescentar o uso de compactação, para obter uma melhor optimização do espaço disponível.
Neste post, vou mostrar como realizar o procedimento, de maneira ágil, com o uso do comando dd, no Linux.
drives SSD
Se você clicar na tag dd, vai ver uma série de outros posts, relatando vários outros usos possíveis para o comando — o que comprova o fato de que é uma daquelas ferramentas exemplo de flexibilidade do universo UNIX/Linux.
Para realizar um teste, você pode usar 2 flash drives (ou pendrives), com a mesma capacidade — simultaneamente conectados, cada qual a uma entrada USB.

O comando dd irá apagar todo o conteúdo do drive ou arquivo de destino. Considere-se avisado.

O comando dd tem basicamente 2 parâmetros importantes, aqui:

  • if — input file ou nome do arquivo original.
  • of — output file ou nome do arquivo de destino.

Sabendo, disto é fácil fornecer o drive original e o drive de destino (ou “futuro” clone) na linha de comando.
Se você tem um drive em /dev/sdc e deseja clonar o seu conteúdo em /dev/sdd, o comando vai ficar assim:


dd if=/dev/sdc of=/dev/sdd bs=64K conv=noerror,sync

Segue a explicação para os outros 2 parâmetros usados:

  • bs=64K — estabelece o tamanho de cada bloco e dados em 64 Kb. Você pode usar outros valores, mais altos e sempre múltiplos de 8, que podem dar mais agilidade ao procedimento — sem alterar a qualidade do resultado final.
  • conv=noerror,sync — o parâmetro noerror não permite que o dd pare, em função de erros de leitura — ou seja, mesmo que o drive original contenha erros, ele será clonado. O parâmetro sync adiciona ao drive de destino blocos com zeros, correspondentes ao espaço que continha erros no dispositivo original. Desta forma, ele mantém o offset de dados em plena sincronia.

drive SSD sobre teclado

Como clonar uma partição

Vocẽ pode clonar uma única partição do sistema em outro drive, indicando exatamente a localização da origem e do destino:


dd if=/dev/sdd1 of=/dev/sdd2 bs=64K conv=noerror,sync

Como enviar um clone via SSH

Neste caso, vale a pena acrescentar um método de compactação ao arquivo clone, antes de enviá-lo pela rede:


dd if=/dev/sdc0 conv=sync,noerror bs=128K | gzip -c | ssh username@servidor.com.br dd of=arquivoclone.gz

Como obter feedback do progresso do dd

Para obter um retorno visual do andamento do processo, use a opção ‘status’, da seguinte forma:


dd if=/dev/sdd1 of=/dev/sdd2 bs=64K conv=noerror,sync status=progress

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Como criar um drive virtual, usando o comando dd no Linux

Drives virtuais podem ter várias utilidades.
Podem funcionar como partições separadas ou simples pastas — só que apartadas do sistema de arquivos hospedeiro ou host.
Um uso comum para um sistema de arquivos virtual é fazer dele um espaço de troca ou SWAP.
Você também pode clonar ou transferir o conteúdo de um drive físico para um drive virtual, como backup ou um armazenamento intermediário a ser transferido para outro drive físico.
Como ferramenta, o comando dd é muito flexível e pode ter uma gama variada de aplicações.
Se você fizer uma busca por “comando dd”, vai encontrar vários artigos mencionando alguma tarefa a ser realizada com ele. Se quiser, você também pode clicar na tag dd, para dar uma olhada no que a gente já andou falando sobre o assunto.

Crie um drive virtual com um tamanho determinado

Vamos começar por criar um espaço (arquivo), dentro do qual vamos inserir o nosso sistema de arquivos mais tarde.
No meu exemplo, vou mostrar como criar um arquivo com 700 MB (mais ou menos o tamanho de um CD de dados):


dd if=/dev/zero of=meudrive700 bs=4K count=175000

175000+0 records in                                                 
175000+0 records out                                                
716800000 bytes (717 MB, 684 MiB) copied, 4,84865 s, 148 MB/s

Note que o tamanho final do arquivo é mostrado em MB (megabytes) e MiB (mibibytes).
Veja o que foi feito:

  • if=/dev/zero — abreviatura de input file (ou arquivo fonte), pega caracteres 0x00 para preencher o espaço do novo drive.
  • of=meudrive700 — abreviatura de output file (ou arquivo de destino), nomeia o arquivo que vai receber o novo drive virtual. Use o nome que vocẽ quiser aqui.
  • bs=4K — abreviatura de block size (ou tamanho de cada bloco de dados), fornece o tamanho a ser usado para cada bloco. No nosso caso, 4096 bytes.
  • count=175000 — conta cada inserção de blocos 175000 vezes e encerra o comando.
    Para chegar a este número fizemos um cálculo: 700.000 Kb / 4 Kb (blocksize)

O /dev/zero é um arquivo especial, que provê caracteres ‘null’ (0x00).
Uma de suas funções é prover uma string de caracteres “neutros” para inicializar um sistema de armazenamento

Com o comando ls, já é possível observar o nosso novo arquivo:


ls -lh meudrive*

-rw-rw-r-- 1 justincase justincase 684M Mai 30 18:22 meudrive700 

Como criar um sistema de arquivos dentro do drive virtual

Para poder ser visto como “verdadeiro drive”, ele precisa comportar um sistema de arquivos.
Para isto, vamos usar o comando mkfs (make filesystem), que também aceita várias configurações e parâmetros de execução.
Se você deseja um sistema de arquivos swap, use o mkfs assim:


mkfs.btrfs --label="meudrive700" meudrive700

btrfs-progs v4.4                                                    
See http://btrfs.wiki.kernel.org for more information.              
                                                                    
Label:              meudrive700                                     
UUID:               8acf7d75-935c-4713-b211-aeeb0c7597ce            
Node size:          16384                                           
Sector size:        4096                                            
Filesystem size:    683.59MiB                                       
Block group profiles:                                               
  Data:             single            8.00MiB                       
  Metadata:         DUP              42.12MiB                       
  System:           DUP              12.00MiB                       
SSD detected:       no                                              
Incompat features:  extref, skinny-metadata                         
Number of devices:  1                                               
Devices:                                                            
   ID        SIZE  PATH                                             
    1   683.59MiB  meudrive700

Se você prefere o sistema de arquivos padrão de muitas distribuições, o ext4, use o comando assim:


mkfs.ext4 -L="meudrive700" meudrive700

mke2fs 1.42.13 (17-May-2015)                                        
meudrive700 contains a btrfs file system labelled 'meudrive700'     
Proceed anyway? (y,n) y                                             
fs_types for mke2fs.conf resolution: 'ext4'                         
Discarding device blocks: done 
Creating filesystem with 175000 4k blocks and 43776 inodes          
Filesystem UUID: 52117614-5508-4e8e-866a-1f9684410582               
Superblock backups stored on blocks:                                
        32768, 98304, 163840                                        
                                                                    
Allocating group tables: done                                       
Writing inode tables: done                                          
Creating journal (4096 blocks): done                                
Writing superblocks and filesystem accounting information: done    

Como já havia um sistema de arquivos habitando aquele espaço, o mkfs faz uma advertência e pede confirmação (y/n) para continuar.
Há várias outras possibilidades de formatação, com o mkfs. Leia mais sobre sistemas de arquivos no Linux para descobrir mais.
Leia também sobre as diferenças entre os sistemas de arquivos BTRFS e EXT4.

Como montar o meu novo drive virtual


sudo mount -t ext4 meudrive700 /mnt/
ls -lah /mnt/                         

total 20K                                                           
drwxr-xr-x 3 root root 4,0K Mai 30 18:37 .                          
drwxr-xr-x 1 root root  258 Mai 28 10:05 ..
drwx------ 2 root root  16K Mai 30 18:37 lost+found

O Linux enxerga este arquivo como um dispositivo físico. Você pode gravar o que quiser dentro deste drive.

Para o UNIX (e o Linux também, claro), tudo é arquivo.

Como automatizar a montagem do meu drive virtual

Se você reiniciar a máquina, neste momento, não vai perder os eventuais dados que tiver gravado lá.
Contudo, vai precisar montar o drive, novamente, toda vez que bootar a máquina — caso queira usá-lo.
Se vocẽ acha incômodo fazer o procedimento manualmente, talvez prefira automatizá-lo. Para isso, basta inscrever o comando de montagem no fstab.
Abra o arquivo /etc/fstab e adicione as linhas


# montando o meu drive virtual
/home/justincase/meudrive700    /mnt/meudrive700        ext4    default     0     2

Acima, é necessário informar no fstab o caminho completo do arquivo que contém o meu drive (/home/justincase/meudrive700).
Optei também por criar um subdiretório dentro do /mnt para abrigar um ponto de montagem para o meu drive virtal (/mnt/meudrive700) — apenas achei que ficaria mais organizado assim.
O restante dos parâmetros na linha de comando, foram copiados da linha que monta o meu diretório /home: ext4 default 0 2.
Grave as alterações feitas no fstab e saia do editor.
Use o comando mount -a (para montar todas entradas do fstab, que ainda não estejam montadas):


sudo mount -a

[sudo] password for justincase:                                     

Ao rodar o ls, no drive, é possível notar que os arquivos dele pertencem ao root e, portanto, não será possível gravar nada lá dentro.


ls -lah /mnt/meudrive700/

total 20K
drwxr-xr-x 3 root root 4,0K Mai 30 18:37 .
drwxr-xr-x 1 root root   22 Mai 31 09:38 ..
drwx------ 2 root root  16K Mai 30 18:37 lost+found

Use o chown para atribuir o drive ao seu usuário:


sudo chown justincase:justincase /mnt/meudrive700/
# agora, crie um arquivo em branco, só para testar:
touch /mnt/meudrive700/apague.me

Liste os arquivos do diretório, para ver se houve sucesso:


ls -lah /mnt/meudrive700/


total 20K
drwxr-xr-x 3 justincase justincase 4,0K Mai 31 10:24 .
drwxr-xr-x 1 root       root         22 Mai 31 09:38 ..
-rw-rw-r-- 1 justincase justincase    0 Mai 31 10:24 apague.me
drwx------ 2 root       root        16K Mai 30 18:37 lost+found

Se quiser entender melhor o funcionamento da ferramenta de criação de arquivos de sistemas, leia o post Como formatar drives com o mkfs.

Como determinar a velocidade de seu memory card ou pendrive no Linux com o comando dd

Fazer uma análise do desempenho ou da performance de um dispositivo de armazenamento removível (cartão de memória, drive flash, pendrive etc) é bastante fácil.
Neste texto vou mostrar como usar o comando dd, como ferramenta padrão de qualquer distro Linux, para fazer um benchmarking nos seus dispositivos.
Este tipo de resultado pode ser interessante obter toda vez em que você precisar decidir qual dispositivo quer usar para instalar uma distro Linux Live, por exemplo — onde você vai precisar ter o máximo de desempenho.

A minha história é a seguinte: estou querendo revitalizar um dos meus notebooks antigos, que está sem o disco rigido.
Para isto, vou usar uma ou duas distribuições GNU/Linux Live rodando do pendrive ou do cartão de memória e vou optar por instalá-las nos dispositivos mais rápidos que eu tiver — ou, pelo menos, nos menos lerdos.
Os pendrives usados neste teste são antigos e a máquina conta apenas com 2GB de memória RAM.
Uma quantidade de memória RAM inferior a 3 GB é, na minha opinião, desestimulante para tentar rodar o Linux inteiramente na RAM — para isto, basta usar o parâmetro boot=toram na inicialização do GRUB, caso você queira tentar.
Se você tem também uma máquina antiga à qual gostaria de dar mais algum tempo de sobrevida (de 6 meses a 1 ano, ou mais… ), recomendo investir na compra de um drive em estado sólido SSD.
Além de ganhar velocidade, quando a máquina velha parar de funcionar definitivamente, você pode usar seu SSD em outra máquina.

Não esqueça de fazer backup completo dos dados armazenados nos dispositivos — os procedimentos descritos neste texto ocasionam perda de dados.
Seguem as descrições de cada metodologia usada.

Como determinar a velocidade de leitura e escrita de um dispositivo de armazenamento com o comando dd

O comando dd, no GNU/Linux é um dos comandos tradicionais. Vale a pena conhecê-lo melhor — trata-se de um “canivete suíço”, para realizar as mais variadas tarefas.
Quando terminar o teste, vou usá-lo para instalar as minhas distribuições favoritas dentro do pendrive — clique aqui, para ver como é fácil fazer isto.
O comando dd simplesmente copia dados de um lugar (indicado pelo parâmetro if=) para outro (of=).
Se você faz uso de um sistema de arquivos com caching, tenha em mente que este fator irá influenciar o teste e você poderá obter resultados irreais.
Para tentar driblar o cache, certifique-se de usar valores significativamente altos para o parâmetro ‘count’ do comando dd.
Isto irá forçar o sistema operacional a gravar os dados direto no dispositivo.
Minha sugestão é usar valores acima de 50Kb.
O teste com o dd consiste em enviar dados (aleatórios) para serem escritos direto no dispositivo conectado, com alguns parâmetros adicionados. Veja um exemplo:

sudo dd if=/dev/zero of=/dev/sdd bs=1M count=10241024+0 registros de entrada
1024+0 registros de saída
1073741824 bytes (1,1 GB) copiados, 229,927 s, 4,7 MB/s

Para o propósito deste post, a taxa de leitura do dispositivo terá mais impacto na performance.
Para obter a taxa de leitura sem a influência do cache, execute o seguinte comando antes de cada teste:

sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

Se quiser saber mais sobre o procedimento de limpar a memória cache no Linux, clique aqui.
Para testar a taxa de leitura, use qualquer arquivo dentro do pendrive em ‘if=’:

dd if=/media/pendrive/teste.log of=/dev/null bs=4k
51200+0 registros de entrada
51200+0 registros de saída
419430400 bytes (419 MB) copiados, 25,1704 s, 16,7 MB/s

Limpar o cache é opcional — mas, se você não fizer isto, vai obter uma taxa de leitura na casa dos GB/s, da qual você não irá usufruir na realidade.

O padrão USB 2.0 tem uma taxa máxima de 480 Mbits/s ou 60 Mbytes/s, teoricamente.
Em função de várias restrições, contudo, a taxa máxima de transferência acaba sendo 280 Mbits/s ou 35 Mbytes/s.
Além disto, a taxa de transferência vai depender da qualidade do seu dispositivo USB, além de outros fatores.

Como última dica, se você está testando cartões de memória para usar no Raspberry Pi e pretende usar aplicações/servidor de banco de dados MySQL ou PostgreSQL, use um blocksize = 8k. Assim:

dd if=/media/pendrive/teste.log of=/dev/null bs=8k

Como instalar o Linux em um pendrive com o comando dd

Já escrevi sobre outras formas de instalação do Linux em um pendrive ou cartão de memória flash. Cada método tem suas vantagens e desvantagens.
Este método é um dos mais simples e que requer apenas que você:

  1. tenha alguma máquina com uma distro Linux disponível (pode ser a de um amigo)
  2. tenha uma imagem .ISO pronta para ser instalada no seu pendrive
icons of flash devices
Leia mais sobre sistemas de arquivos para dispositivos flash.

Onde encontrar uma imagem para instalar o meu Linux?

O que torna esta pergunta “tão difícil” de responder é a enorme variedade de sabores do GNU/Linux disponíveis e a grande quantidade de locais onde se encontram imagens para download.
Aliás, há vários métodos de download disponíveis também.
O download via torrent costuma sempre ser o mais rápido e confiável para mim.
As distro que eu mais uso são Debian stable e Ubuntu LTS.
Você pode encontrar as imagens aqui:

Só uma dica: baixar sua distro Linux via torrents, costuma ser muito mais rápido…

Se você prefere outra forma ou outro local para baixar a sua distro favorita, por favor, compartilhe com os outros leitores, na seção de comentários.

Como gravar a imagem ISO Linux no seu pendrive

O procedimento descrito neste texto irá apagar todos os dados do disco no qual for executado. Por isto, você deve se certificar de que está executando-o no dispositivo de armazenamento certo.
Conecte o seu pendrive à porta USB e não o monte.
Para encontrar onde ele está conectado, use o comando fdisk:

sudo fdisk -l
root's password:

O resultado, em destaque, abaixo, mostra o meu pendrive em último na lista (ele foi último dispositivo de armazenamento a ser conectado ao notebook, afinal):

Disk /dev/sda: 931,5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xca65c207

Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1  *          2048   83892223   83890176    40G 83 Linux
/dev/sda2         83892224 1931640831 1847748608 881,1G 83 Linux
/dev/sda3       1931640832 1953523711   21882880  10,4G 82 Linux swap / Solaris

Disk /dev/sdb: 7,5 GiB, 7990149120 bytes, 15605760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x34ab6e74

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdb1          4224    12415     8192    4M ef EFI (FAT-12/16/32)
/dev/sdb2  *      12416  1794047  1781632  870M 83 Linux
/dev/sdb3       1794048 15605759 13811712  6,6G 83 Linux

Em função deste resultado, vou me referir ao meu pendrive como /dev/sdb, daqui pra frente.
Adeque os exemplos dados à sua situação, em particular, para evitar perder dados.
Uma outra forma de detectar os dispositivos conectado ao USB, é o comando lsblk (que não necessita de privilégios administrativos para ser executado

lsblk 
.
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 931,5G  0 disk 
├─sda1   8:1    0    40G  0 part /
├─sda2   8:2    0 881,1G  0 part /home
└─sda3   8:3    0  10,4G  0 part [SWAP]
sdb      8:16   1   7,5G  0 disk 
├─sdb1   8:17   1     4M  0 part 
├─sdb2   8:18   1   870M  0 part /run/media/justincase/openSUSE 13.2 GNOME Live
└─sdb3   8:19   1   6,6G  0 part /run/media/justincase/hybrid

O comando hwinfo, com os parâmetros corretos, pode oferecer um resultado ainda mais enxuto:

sudo hwinfo --disk --short
disk:                                                           
  /dev/sda             ST1000LM014-1EJ1
  /dev/sdb             Generic Flash Disk

Use o que achar melhor.
Uma vez encontrado o seu dispositivo, grave a imagem ISO baixada nele:

sudo umount /dev/sdb
sudo dd if=./openSUSE-Leap-42.1-DVD-x86_64.iso of=/dev/sdb bs=4M; sync

Isto é tudo.
Quando o terminal ficar livre novamente, remova o pendrive ou apenas dê um reboot no sistema.
não esqueça de ajustar o BIOS, para ele dar boot pelo pendrive.
Os passos que seguem são opcionais.
Se preferir, antes de gravar a distro no pendrive, é possível fazer backup dele, antes de iniciar o processo que irá apagar todo o seu conteúdo:

sudo dd if=/dev/sdb of=./conteudo-pendrive.backup bs=4M; sync

Mais tarde, você poderá restaurar o conteúdo no pendrive, invertendo o comando acima:

sudo dd if=./conteudo-pendrive.backup of=/dev/sdb bs=4M; sync