Como configurar a clonagem de disco com dd, netcat e ssh tunnel?

26

Gostaria de copiar as coisas em massa (reimage disco usando dd) com o netcat do host A para o B via canal ssh criptografado no Linux.

Quais comandos devo digitar nas duas extremidades?

Evgeny
fonte

Respostas:

28

Copiando da origem para o destino onde o sshd está em execução:

  • dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda'

Copiando da origem para o destino via sshd_host quando o destino não está executando o sshd.

  • Alvo: nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024))
  • Fonte: ssh -L 62222:target:62222 sshd_host &
  • Fonte: dd if=/dev/sda | nc -w 3 localhost 62222

    dd - se = é a origem, of = é o destino, bs = é o tamanho do bloco. Diferentes tamanhos de bloco podem melhorar o desempenho. 16 é geralmente um ponto de partida bastante razoável. Você também pode usar count = para indicar quantos blocos copiar.

    nc - -p indica a porta a ser usada nos serviços. -l é usado para iniciar um serviço. -w configura o tempo para aguardar os dados no pipline antes de sair.

    ssh - -L configura o túnel no host remoto. O formato do argumento é local_port:target_host:target_port,. Seu programa local (nc) se conecta ao local_port, essa conexão é encapsulada e conectada ao target_port no target_host.

As opções definidas são apenas as usadas para isso. Veja as páginas do manual para mais detalhes.

Algumas notas:

  1. Se você estiver fazendo isso em algo que não seja uma LAN, sugiro compactar o fluxo de dados com gzip ou compress. O Bzip2 também funcionaria, mas demora um pouco mais a CPU. O primeiro tem um exemplo desse uso.
  2. É melhor se a partição de origem não estiver montada ou montada somente leitura. Caso contrário, você precisará fsck a imagem de destino.
  3. A menos que uma das máquinas possua netcat, mas não ssh, o netcat não é realmente necessário aqui. Esse caso seria semelhante a:

source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd

  1. O dd funciona melhor se a origem e os destinos tiverem o mesmo tamanho. Caso contrário, o alvo deve ser o maior dos 2.
  2. Se você estiver usando ext2 / 3 ou xfs, despejar (ou xfsdump) e restaurar pode ser uma opção melhor. Ele não manipula o setor de inicialização, mas funciona quando o destino e a origem são de tamanhos diferentes.
Rik Schneider
fonte
4

Se você deseja usar o netcat sem ssh. Presumo que seja o caminho mais rápido e não seguro, você pode copiar e restaurar todo o disco como este:
No computador A com IP 192.168.0.1

cat /dev/hdb | nc -p 9000
No computador B
nc -l 192.168.0.1 9000 > /dev/hdb

Lembre-se de que, de acordo com man nc, a opção -l é:

  -l Usado para especificar que o nc deve escutar uma conexão de entrada em vez de iniciar uma conexão com um host remoto. É um erro usar esta opção em conjunto com as opções -p, -s ou -z.
Ali Mezgani
fonte
3

O netcat não é necessário.

na máquina src executada:

dd if=/dev/sdX bs=1M | ssh root@dstMachine " dd of=/dev/sdY bs=1M"

Presumo que nenhuma das partições no sdX e sdY esteja montada. você pode inicializar as duas caixas com o knoppix ou outra distribuição ao vivo semelhante.

dd - pega dados de se [se não for fornecido - pega com stdin], envia dados para de [se não for fornecido - dados são enviados para stdout]. bs - tamanho do bloco ... irá acelerar as coisas.

ssh - executa o comando fornecido entre aspas na caixa remota, todos os dados bombeados para o stdin do ssh serão encapsulados em uma máquina remota e fornecidos como stdin para o comando executado lá.

pQd
fonte
então será impossível no disco montado?
Evgeny
@ Evgeny, tudo ficará bem se o disco estiver montado como somente leitura. caso contrário - não faça ... sua cópia será inconsistente.
PQD
3

O host A é aquele que cria a imagem, o host B é aquele em que a imagem será armazenada:

root@A# dd if=/dev/sda | ssh root@B "dd of=/some/file"

Restaurar para o disco apenas trocaria os dois.

Bill Weiss
fonte
1

A cópia básica com o netcat é descrita aqui .

Se você precisar envolver o SSH , use o encaminhamento de porta para isso,

-R [bind_address:]port:host:hostport

Mas, no geral, você pode fazer a transferência SSH em primeiro lugar (sem o netcat).

nik
fonte
1

Enquanto os sistemas de arquivos estiverem desmontados, o dd funcionará bem.

(from server1) dd if=/dev/sda bs=32k | ssh <server2> dd of=/dev/sda bs=32k

Você precisará configurar a autenticação da chave do host com antecedência, caso contrário, o prompt da senha fará com que a cópia falhe.

Fazer isso em um volume montado produzirá resultados ruins.

Dominic D
fonte
obrigado. são necessárias cotações?
Evgeny
1

Ou você pode usar o clonezilla e "montar" seu armazenamento remoto por meio de sshfs.

David Mackintosh
fonte
Se você estiver copiando uma partição, não deseja que a partição de destino seja desmontada? Mais detalhes sobre esta opção seriam úteis.
Mark Stosberg
1

Tentei uma combinação das opções fornecidas acima e estou compartilhando os resultados com você. do mais rápido ao mais lento, usando combinações de tamanho de bloco dd, algoritmo de compressão gzip e gzip.

Como você pode ver, o gzip só me aprimorou ao usar o algoritmo rápido em conjunto com um tamanho de bloco de 1 milhão.

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 326.045 s, 39.5 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 370.158 s, 34.8 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 370.274 s, 34.8 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd bs=1M of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 372.906 s, 34.6 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 520.116 s, 24.8 MB/s

Dois servidores rápidos foram usados ​​conectados ao GigE por meio de um comutador Enterprise GigE usando discos locais via LVM.

Edward Groenendaal
fonte
0

Parece que você está usando uma marreta para quebrar uma noz aqui - ou talvez uma analogia melhor esteja tentando cortar seu gramado com uma tesoura :)

Eu sugiro fortemente que você olhe algumas das ferramentas disponíveis para realizar um trabalho como esse, a menos que você tenha ótimos motivos para fazê-lo internamente.

O Trinity Rescue Kit é um liveCD gratuito que suporta unidades de imagem através de multicast e pode fazer o que você deseja (ou qualquer outra pessoa que pensa na mesma linha), sem precisar usar sistemas de imagem de tamanho completo.

Tom Newton
fonte