[Linux]ネットワーク経由でHDDデータをダンプ

マシンを移行したり、物理マシンを仮想マシン(P2V)する時なんかに、HDDのダンプをよく取ると思います。

しかし、HDDのフルダンプを取るときは当然ながら、空き容量がたくさん空いた別のドライブ(パーティション)が必要です。また、HDDが1台しかなく、かつ、パーティションも切ってない場合はどうにもなりません。こういう時は、ネットワークごしに別のマシンにダンプするといい感じです。

よく忘れるのでコマンドをメモっておきます。参考にしたページは以下。

Using DD Over Netcat vs SSH

受信側(netcat待ち受けするマシン、ダンプデータを保存するマシン):

nc -l 12345 | bzip2 -d |dd bs=16M of=[保存先ファイル名]

送信側(ダンプするマシン):

dd bs=16M if=/dev/sdXX | bzip2 -c |nc [受信側マシンのIPアドレス] 12345

bzipで圧縮しています。圧縮しないとHDDのように容量が大きいドライブの場合、途方も無い時間がかかります(空き領域のゼロまで愚直に送信するので)。理論上、ダンプする前に、HDDの空き領域をゼロで埋めればさらに転送時間は短くなります。ネットワークが細い場合は、やってもいいかもしれません。私は、後にVirtualBoxの可変容量式の仮想ドライブに変換するつもりだったということもあり、ゼロクリアしておきました。

最初にddは前述のページでの実験結果によると、ブロックサイズ16MBにすると速いらしいです。まあ適当に。

ddは進捗状態を表示しないので、動いてるのかどうかわかりませんが、別のターミナルからddにUSR1シグナルを送ると進捗を表示してくれます。

killall -SIGUSR1 dd

たしか、USR1シグナルで進捗を表示してくれるのはGNU ddだけだったと思います。

以上。