Come impostare la clonazione del disco con dd, netcat e ssh tunnel?


26

Vorrei copiare roba in blocco (reimage disk using dd) con netcat dall'host A alla B tramite il canale crittografato ssh su Linux.

Quali comandi devo digitare su entrambe le estremità?

Risposte:


28

Copia dall'origine alla destinazione dove target ha sshd in esecuzione:

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

Copia dall'origine alla destinazione tramite sshd_host quando la destinazione non esegue sshd.

  • Bersaglio: 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 - if = è l'origine, di = è la destinazione, bs = è la dimensione del blocco. Diverse dimensioni di blocco possono migliorare le prestazioni. 16 è di solito un punto di partenza abbastanza ragionevole. Puoi anche usare count = per indicare quanti blocchi copiare.

    nc - -p indica la porta da utilizzare per i servizi. -l viene utilizzato per avviare un servizio. -w imposta il tempo di attesa per i dati nella pipeline prima di uscire.

    ssh - -L imposta il tunnel sull'host remoto. Il formato dell'argomento è, local_port:target_host:target_port. Il tuo programma locale (nc) si connette a local_port, questa connessione viene tunnelata e connessa a target_port su target_host.

Le opzioni definite sono solo quelle utilizzate per questo. Guarda le pagine man per maggiori dettagli.

Alcune note:

  1. Se lo stai facendo su qualsiasi cosa tranne una LAN, suggerirei di comprimere il flusso di dati con gzip o compress. Anche Bzip2 funzionerebbe, ma richiede un po 'più di tempo CPU. Il primo ha un esempio di tale utilizzo.
  2. È meglio se la partizione di origine non è montata o è montata in sola lettura. In caso contrario, dovrai inserire l'immagine di destinazione.
  3. A meno che una delle macchine non abbia netcat ma non ssh, netcat non è realmente necessario qui. Tale caso sarebbe simile a:

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

  1. dd funziona meglio se l'origine e le destinazioni hanno le stesse dimensioni. In caso contrario, l'obiettivo deve essere il più grande dei 2.
  2. Se si utilizza ext2 / 3 o xfs, dump (o xfsdump) e ripristino potrebbero essere un'opzione migliore. Non gestirà il settore di avvio ma funziona quando la destinazione e l'origine hanno dimensioni diverse.

4

Se vuoi usare netcat senza ssh. Presumo che sia il modo più veloce e non quello sicuro, è possibile copiare e ripristinare l'intero disco in questo modo:
Sul computer A con IP 192.168.0.1

cat /dev/hdb | nc -p 9000
Sul computer B
nc -l 192.168.0.1 9000 > /dev/hdb

Ricorda che secondo man nc l'opzione -l è:

  -l Usato per specificare che nc dovrebbe attendere una connessione in arrivo piuttosto che avviare una connessione a un host remoto. È un errore usare questa opzione insieme alle opzioni -p, -s o -z.

3

netcat non è necessario.

su src machine run:

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

suppongo che nessuna delle partizioni su sdX e sdY sia montata. puoi avviare entrambe le caselle con knoppix o altra distribuzione live simile.

dd - prende i dati da se [se non disponibile - prende da stdin], invia dati di [se non disponibile - dati vengono inviati al stdout]. bs - dimensione del blocco ... velocizzerà le cose.

ssh - esegue il comando fornito tra virgolette sulla casella remota, tutti i dati pompati su stdin di ssh verranno sottoposti a tunnel su macchina remota e porovided come stdin per il comando eseguito lì.


quindi sarà impossibile sul disco montato?
Evgeny,

@Evgeny andrà bene se il disco è montato in sola lettura. altrimenti - non farlo ... la tua copia sarà incoerente.
pQd

3

L'host A è quello da immagine, l'host B è quello su cui verrà memorizzata l'immagine:

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

Il ripristino su disco cambierebbe semplicemente quei due.


1

La copia di base con netcat è descritta qui .

Se devi coinvolgere SSH in questo, puoi utilizzare il port forwarding su quello,

-R [bind_address:]port:host:hostport

Ma, nel complesso, potresti semplicemente fare il trasferimento SSH in primo luogo (senza netcat).


1

Finché i filesystem sono entrambi smontati, dd funziona bene.

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

Avrai bisogno di un'impostazione di autenticazione della chiave host in anticipo, altrimenti la richiesta della password farà fallire la copia.

Fare questo su un volume montato produrrà scarsi risultati.


Grazie. sono necessarie le virgolette?
Evgeny,

1

In alternativa, è possibile utilizzare clonezilla e "montare" la memoria remota tramite sshfs.


Se si sta copiando una partizione, non si desidera che la partizione di destinazione sia smontata? Maggiori dettagli su questa opzione sarebbero utili.
Mark Stosberg,

1

Ho provato una combinazione delle opzioni fornite sopra e sto condividendo i risultati con te. dal più veloce al più lento utilizzando combinazioni di dimensioni del blocco dd, algoritmo di compressione gzip e gzip.

Come puoi vedere, gzip mi ha dato solo un miglioramento quando ho usato l'algoritmo veloce in combinazione con una dimensione del blocco di 1M.

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

Sono stati utilizzati due server veloci collegati con GigE tramite uno switch GigE Enterprise utilizzando dischi locali tramite LVM.


0

Sembra che tu stia usando una mazza per rompere un dado qui - o forse un'analogia migliore sta cercando di tagliare il prato con le forbici :)

Ti consiglio vivamente di esaminare alcuni degli strumenti disponibili per svolgere un lavoro come questo a meno che tu non abbia ottime ragioni per farlo internamente.

Trinity Rescue Kit è un liveCD gratuito che supporta le unità di imaging su multicast e potrebbe fare quello che vuoi (o addirittura chiunque altro stia pensando sulla stessa linea), senza passare a sistemi di imaging a pieno diametro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.