Bagaimana cara mengatur kloning disk dengan dd, netcat dan ssh tunnel?

26

Saya ingin menyalin barang dalam jumlah besar (menggunakan reimage disk dd) dengan netcat dari host A ke B melalui saluran terenkripsi ssh di Linux.

Perintah apa yang harus saya ketik di kedua ujungnya?

Evgeny
sumber

Jawaban:

28

Menyalin dari sumber ke target tempat target menjalankan sshd:

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

Menyalin dari sumber ke target melalui sshd_host ketika target tidak menjalankan sshd.

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

    dd - jika = adalah sumber, dari = adalah tujuannya, bs = adalah ukuran blok. Ukuran blok yang berbeda dapat meningkatkan kinerja. 16 biasanya merupakan titik awal yang cukup masuk akal. Anda juga dapat menggunakan count = untuk menunjukkan berapa banyak blok yang akan disalin.

    nc - -p menunjukkan port yang akan digunakan untuk layanan. -l digunakan untuk memulai layanan. -w mengatur waktu untuk menunggu data dalam pipa sebelum berhenti.

    ssh - -L mengatur terowongan pada host jarak jauh. Format argumennya adalah local_port:target_host:target_port,. Program lokal Anda (nc) terhubung ke local_port, koneksi ini disalurkan dan terhubung ke target_port di target_host.

Opsi yang ditentukan hanya yang digunakan untuk ini. Lihatlah halaman manual untuk lebih jelasnya.

Beberapa catatan:

  1. Jika Anda melakukan ini di atas sesuatu selain LAN, saya sarankan mengompres datastream dengan gzip atau kompres. Bzip2 akan bekerja juga tetapi butuh waktu CPU lebih lama. Yang pertama memiliki contoh penggunaan itu.
  2. Lebih baik jika partisi sumber tidak di-mount atau dipasang hanya-baca. Jika tidak, Anda akan perlu fsck gambar tujuan.
  3. Kecuali salah satu mesin memiliki netcat tetapi tidak ssh, netcat tidak benar-benar diperlukan di sini. Kasus itu akan terlihat seperti:

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

  1. dd berfungsi paling baik jika sumber dan target berukuran sama. Jika tidak target harus lebih besar dari 2.
  2. Jika Anda menggunakan ext2 / 3 atau xfs, dump (atau xfsdump) dan restore mungkin merupakan opsi yang lebih baik. Ini tidak akan menangani sektor boot tetapi bekerja ketika target dan sumber berbeda ukuran.
Rik Schneider
sumber
4

Jika Anda ingin menggunakan netcat tanpa ssh. Saya kira itu adalah cara tercepat dan bukan yang aman, Anda dapat menyalin dan mengembalikan seluruh disk seperti ini:
Di komputer A dengan IP 192.168.0.1

cat /dev/hdb | nc -p 9000
Di komputer B
nc -l 192.168.0.1 9000 > /dev/hdb

Ingat bahwa menurut man nc opsi -l adalah:

  -l Digunakan untuk menentukan bahwa nc harus mendengarkan koneksi yang masuk daripada memulai koneksi ke host jarak jauh. Merupakan kesalahan untuk menggunakan opsi ini bersamaan dengan opsi -p, -s, atau -z.
Ali Mezgani
sumber
3

netcat tidak diperlukan.

saat menjalankan mesin src:

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

saya berasumsi tidak ada partisi pada sdX dan sdY yang di-mount. Anda dapat mem-boot kedua kotak dengan knoppix atau distro langsung serupa lainnya.

dd - mengambil data dari jika [jika tidak disediakan - mengambilnya dari stdin], mengirimkan data ke dari [jika tidak disediakan - data dikirim ke stdout]. bs - ukuran blok ... akan mempercepat.

ssh - mengeksekusi perintah yang diberikan dalam tanda kutip pada kotak jarak jauh, semua data yang dipompa ke stdin dari ssh akan disalurkan ke mesin jarak jauh dan disimpan sebagai stdin untuk perintah yang dijalankan di sana.

pQd
sumber
jadi tidak mungkin pada disk yang dipasang?
Evgeny
@ Evgeny itu akan baik-baik saja jika disk dipasang sebagai hanya baca. jika tidak - jangan lakukan itu ... salinan Anda tidak akan konsisten.
pQd
3

Host A adalah yang di-image, host B adalah di mana gambar akan disimpan:

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

Mengembalikan ke disk hanya akan menukar keduanya.

Bill Weiss
sumber
1

Salinan dasar dengan netcat dijelaskan di sini .

Jika Anda perlu melibatkan SSH dalam hal ini, Anda bisa menggunakan port forwarding untuk itu,

-R [bind_address:]port:host:hostport

Tapi, secara keseluruhan, Anda bisa melakukan transfer SSH di tempat pertama (tanpa netcat).

nik
sumber
1

Selama filesystem keduanya tidak di-mount, dd berfungsi dengan baik.

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

Anda akan memerlukan pengaturan autentikasi tuan rumah sebelumnya atau jika kata sandi akan menyebabkan salinan gagal.

Melakukan ini pada volume yang terpasang akan menghasilkan hasil yang buruk.

Dominic D
sumber
Terima kasih. apakah kutipan diperlukan?
Evgeny
1

Atau, Anda bisa menggunakan clonezilla dan "me-mount" penyimpanan jarak jauh Anda melalui sshfs.

David Mackintosh
sumber
Jika Anda menyalin partisi, tidakkah Anda ingin partisi target di-unmount? Lebih detail tentang opsi ini akan sangat membantu.
Mark Stosberg
1

Saya mencoba kombinasi opsi yang disediakan di atas, dan saya membagikan hasilnya dengan Anda. tercepat hingga paling lambat menggunakan kombinasi ukuran blok dd, algoritma kompresi gzip dan gzip.

Seperti yang Anda lihat, gzip hanya memberi saya peningkatan ketika menggunakan algoritma cepat bersamaan dengan ukuran blok 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

Dua server cepat digunakan terhubung dengan GigE melalui switch Enterprise GigE menggunakan disk lokal melalui LVM.

Edward Groenendaal
sumber
0

Sepertinya Anda menggunakan palu godam untuk memecahkan kacang di sini - atau mungkin analogi yang lebih baik sedang mencoba memotong rumput Anda dengan gunting :)

Saya sangat menyarankan Anda melihat beberapa alat di luar sana untuk melakukan pekerjaan seperti ini kecuali Anda punya alasan bagus untuk melakukannya di rumah.

Trinity Rescue Kit adalah liveCD gratis yang mendukung drive pencitraan lebih dari multicast, dan dapat melakukan apa yang Anda inginkan (atau memang orang lain berpikir pada baris yang sama), tanpa harus pergi ke sistem pencitraan yang penuh.

Tom Newton
sumber