0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HDDなどのクローンを同時複数台作成

Posted at

ハードディスクやsdカードをクローン。

PC とか RaspberryPi の設定を行ったものをまるまるクローンするということはよくあるけれども、時間がかかる。同時に複数台を時間をかけずにできないか?

クローンツールはいろいろあるが、プリミティブな操作が自由にできるものとなるとLinuxベースのddとか、ddrescueとか。

まずは、速度のリミットが高いハードディスクで調査。その後、sdカードなどにも応用予定(記事はまだ)。

環境

Fujitsu MX1310 M1
Ubuntu 17.04 インストーラをUSBメモリに入れて起動
HDD TOSHIBA DT01ACA050
SSD Colorful SL300 160G

ddrescue で 1台に書き込む

まずは、1台に書き込む場合のテスト。

dd よりも ddrescue が高速だし、表示もいろいろ出る。

コピー元:SSD Colorful SL300 160G
コピー先:HDD TOSHIBA DT01ACA050 (もしかしたらSSDだったかも?)

Screenshot from 2018-08-08 11-02-00.png

これで130~140MB/secぐらい。

ddrescue で複数台に書き込む

同時に4台に書き込んでみる。

Screenshot from 2018-08-08 11-06-40.png

30MBytes/Secぐらいになる。大体1/4ですね。

ちなみに、一番上のaverage rate が 83MBytes/Secになっているのは、最初に一番上のターミナルでコピーを始め、2番目、3番目、4番目のコピーが始まるまでに140MBytes/Secぐらいで先行してコピーをしていたため。

ddrescue で同期しながら複数台に書き込む

ここで、コピーのタイミングを4台合わせ、同じ箇所をコピーするようにする。そうすればメモリキャッシュに残ったコピー元イメージを有効に活用できる。

Screenshot from 2018-08-08 11-13-00.png

かなり向上。130~140MBytes/Secにかなり近い値となる。
純粋に、4倍の効率でクローンを作成できることになる。

このことから、律速段階はCPUや書込バスの飽和などではないことがわかる。適切な書込環境を設定すれば、実質500MBytes/Sec以上で書込ができることになる。

なお、タイミングを合わせるためには、先行しているコピーを Ctrl+Sでポーズ、Ctrl+Qで再開をして、手動で合わせるようにした。

なお、コピー先のストレージデバイスの種類やロットを合わせると、一旦タイミングを同期させるとそのまま何十分も乱れずにコピーしてくれるが、HDD/SSD混在、また同じ型番のHDD同士でもロットが違うとタイミングがどんどんずれていくので度々タイミングを取り直す必要がある。

teeを使用して同期書込

元々、ddrescue は 1対1でのコピーツール。複数台同時コピーなどの機能は無いみたい。
複数台同時コピーを自動で行うには?

こういう時には tee を使うことが多い。標準出力を分岐することができるので、dd を使った同時複数台書込などに応用できる。

しかしながら ddrescue は対象がブロックデバイスなので、キャラクタデバイス対象の tee はうまく使えない。

ということで、ddrescue ではなく dd を使って試してみた。


dd bs=512 if=$SOURCE | tee /dev/sda /dev/sdb /dev/sdc > /dev/sde

($SOURCE は /dev/sdd )

Screenshot from 2018-08-08 12-36-33.png

同時にコピーできているが・・・遅い!! ひと桁遅いとは・・・。

ddrescue を複数同期して動かす

ddrescue の速度を活かしたやりかたを工夫してみた。

  • ddrescue の --size オプションで、1GByteだけコピーする
  • 同時に4スレッド ddrescue を動かす
  • ddrescue の -i オプションで、コピー開始位置を指定
  • コピー開始位置を1GBytesずつインクリメントしながらループ

# !/bin/bash
SOURCE=/dev/sde
DIST1=/dev/sdb
DIST2=/dev/sdc
DIST3=/dev/sdd
DIST4=/dev/sda
COPYSIZE=130
SIZEPREFIX=Gi
for ((i=0;i<$COPYSIZE;i++));do
  date
  ddrescue $SOURCE $DIST1 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST2 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST3 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST4 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force &
  wait
  date
done
sync
sync
sync

いろいろハードコーディングなのでキケンなスクリプトですが、あくまでテストということで。

動かした結果

ゆらぎがあるけど先程よりは速いです。

Screenshot from 2018-08-08 13-45-30.png

130GBytesのコピー4台が、55分程度で終了しました。大体、40GBytes/Sec.

140GBytes には程遠いので、もうちょっと工夫の余地がありますね。

0
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?