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 clonar uma tabela no MySQL

Clonar uma tabela, no MySQL, é a solução mais adequada quando você precisa de uma cópia exata da estrutura e o CREATE TABLE… SELECT não atende aos seus propósitos — por que você precisa que a cópia venha com os mesmos índices, os mesmos valores padrão etc.
Capa do tutorial MySQL - clonar tabelas
A solução para obter uma declaração CREATE TABLE adequada é usar SHOW CREATE TABLE nome_da_tabela.
Com esta declaração, o sistema irá mostrar como proceder para criar a sua tabela clone.
Deixe o exemplo falar por si:

SHOW CREATE TABLE ClientesCidades\G

O comando, acima, pede ao servidor MySQL mostrar qual declaração deve ser usada para criar uma tabela idêntica à ClientesCidades.
Veja o meu resultado:

*************************** 1. row ***************************
       Table: ClientesCidades
Create Table: CREATE TABLE `ClientesCidades` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `NomeCliente` varchar(255) DEFAULT NULL,
  `IdadeCliente` mediumint(9) DEFAULT NULL,
  `CidadeCliente` varchar(255) DEFAULT NULL,
  `CredCliente` mediumint(9) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

De tudo isto, você precisa apenas desta parte:

CREATE TABLE `ClientesCidades_clone` (   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,   `NomeCliente` varchar(255) DEFAULT NULL,   `IdadeCliente` mediumint(9) DEFAULT NULL,   `CidadeCliente` varchar(255) DEFAULT NULL,   `CredCliente` mediumint(9) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1;

Note que troquei o nome da tabela de ClientesCidades para ClientesCidades_clone.
Use o SHOW TABLES para conferir a criação da tabela:

SHOW TABLES;
+-----------------------+
| Tables_in_tutorial    |
+-----------------------+
| CadCli                |
| CliCred               |
| ClientesCidades       |
| ClientesCidades_clone |
+-----------------------+
4 rows in set (0.00 sec)

Use o comando EXPLAIN para comparar as estruturas

Você pode usar o comando EXPLAIN para comparar as estruturas das 2 tabelas.

EXPLAIN ClientesCidades;
+---------------+-----------------------+------+-----+---------+----------------+
| Field         | Type                  | Null | Key | Default | Extra          |
+---------------+-----------------------+------+-----+---------+----------------+
| id            | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| NomeCliente   | varchar(255)          | YES  |     | NULL    |                |
| IdadeCliente  | mediumint(9)          | YES  |     | NULL    |                |
| CidadeCliente | varchar(255)          | YES  |     | NULL    |                |
| CredCliente   | mediumint(9)          | YES  |     | NULL    |                |
+---------------+-----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Segue a estrutura da tabela clone:

EXPLAIN ClientesCidades_clone;
+---------------+-----------------------+------+-----+---------+----------------+
| Field         | Type                  | Null | Key | Default | Extra          |
+---------------+-----------------------+------+-----+---------+----------------+
| id            | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| NomeCliente   | varchar(255)          | YES  |     | NULL    |                |
| IdadeCliente  | mediumint(9)          | YES  |     | NULL    |                |
| CidadeCliente | varchar(255)          | YES  |     | NULL    |                |
| CredCliente   | mediumint(9)          | YES  |     | NULL    |                |
+---------------+-----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Note que a segunda tabela foi clonada apenas na estrutura. Ela foi criada vazia, portanto — e como povoar uma tabela é assunto para outro tutorial. 😉