web-dev-qa-db-ja.com

dd、netcat、sshトンネルでディスクのクローンを設定するにはどうすればよいですか?

Linuxのssh暗号化チャネルを介して、ホストAからBにnetcatを使用してデータを一括でコピーします(ddを使用してディスクのイメージを再作成)。

両端でどのコマンドを入力する必要がありますか?

26
Evgeny

ターゲットからsshdが実行されているソースからターゲットへのコピー:

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

ターゲットがsshdを実行していないときに、sshd_Hostを介してソースからターゲットにコピーする。

  • ターゲット:nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024))
  • ソース: _ssh -L 62222:target:62222 sshd_Host &_
  • ソース: _dd if=/dev/sda | nc -w 3 localhost 62222_

    dd-if =はソース、of =は宛先、bs =はブロックサイズです。異なるブロックサイズを使用すると、パフォーマンスが向上する場合があります。通常、16はかなり妥当な出発点です。 count =を使用して、コピーするブロックの数を示すこともできます。

    nc--pは、サービスに使用するポートを示します。 -lはサービスを開始するために使用されます。 -wは、終了する前にパイプラインのデータを待機する時間を設定します。

    ssh--Lは、リモートホストにトンネルをセットアップします。引数の形式は、_local_port:target_Host:target_port_です。ローカルプログラム(nc)はlocal_portに接続します。この接続はトンネルされ、target_Hostのtarget_portに接続されます。

定義されているオプションは、このために使用されるものにすぎません。詳細については、manページを参照してください。

いくつかのメモ:

  1. LAN以外でこれを行う場合は、gzipまたはcompressでデータストリームを圧縮することをお勧めします。 Bzip2も機能しますが、CPU時間が少し長くなります。最初のものはその使用法の例を持っています。
  2. ソースパーティションがマウントされていない場合、または読み取り専用でマウントされている場合は、より良い方法です。そうでない場合は、宛先イメージをfsckする必要があります。
  3. マシンの1つにnetcatはあるがsshがない場合を除き、netcatは実際には必要ありません。その場合は次のようになります。

_source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd_

  1. ddは、ソースとターゲットが同じサイズの場合に最適に機能します。そうでない場合、ターゲットは2の大きい方でなければなりません。
  2. Ext2/3またはxfsを使用している場合は、ダンプ(またはxfsdump)と復元の方が適している場合があります。ブートセクターは処理しませんが、ターゲットとソースのサイズが異なる場合に機能します。
28
Rik Schneider

Sshなしでnetcatを使用したい場合。安全な方法ではなく、最速の方法だと思います。次のようにディスク全体をコピーして復元できます。
IP 192.168.0.1のコンピューターA

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

Man ncによると、-lオプションは次のとおりです。

 -l ncがリモートホストへの接続を開始するのではなく、着信接続をリッスンするように指定するために使用されます。このオプションを-p、-s、または-zオプションと組み合わせて使用​​するのはerrorです。
4
Ali Mezgani

netcatは必要ありません。

srcマシンで実行:

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

sdXとsdYのどのパーティションもマウントされていないと想定しています。 knoppix または他の同様のライブディストリビューションを使用して、両方のボックスを起動できます。

dd-ifからデータを取得[提供されない場合-stdinから取得]、ofにデータを送信[提供されない場合-データはstdoutに送信されます]。 bs-ブロックサイズ...高速化されます。

ssh-リモートボックスで引用符で囲まれたコマンドを実行します。sshのstdinにポンプで送られるすべてのデータは、リモートマシンにトンネリングされ、そこで実行されるコマンドのstdinとして転送されます。

3
pQd

ホストAはイメージを作成するホスト、ホストBはイメージを保存するホストです。

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

ディスクへの復元は、これら2つを交換するだけです。

3
Bill Weiss

または、clonezillaを使用して、sshfs経由でリモートストレージを「マウント」することもできます。

1

上記のオプションを組み合わせてみましたので、結果をお知らせします。 ddブロックサイズ、gzipおよびgzip圧縮アルゴリズムの組み合わせを使用して、最速から最速まで。

ご覧のように、gzipは、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

LVMを介してローカルディスクを使用し、Enterprise GigEスイッチを介してGigEに接続された2つの高速サーバーが使用されました。

1

Netcatを使用した基本的なコピー ここで説明

[〜#〜] ssh [〜#〜]をこれに関与させる必要がある場合は、ポート転送

-R [bind_address:]port:Host:hostport

しかし、全体として、最初にSSH転送を実行するだけで済みます(netcatなし)。

1
nik

ファイルシステムが両方ともアンマウントされている限り、ddはうまく機能します。

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

事前にホストキー認証を設定する必要があります。そうしないと、パスワードプロンプトによってコピーが失敗します。

マウントされたボリュームでこれを行うと、結果が悪くなります。

1
Dominic D

あなたがハンマーを使ってここでナッツを割っているように見えます-または、おそらくより良いアナロジーはハサミであなたの芝生を切ることです:)

社内で行う大きな理由がない限り、このような仕事をするためのツールをいくつか見ることを強くお勧めします。

Trinity Rescue Kit は、マルチキャストを介したイメージングドライブをサポートする無料のliveCDであり、フルボアイメージングシステムに行かなくても、必要に応じて(実際には同じラインで考えている人なら誰でも)実行できます。

0
Tom Newton