ハードディスクや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だったかも?)
これで130~140MB/secぐらい。
ddrescue で複数台に書き込む
同時に4台に書き込んでみる。
30MBytes/Secぐらいになる。大体1/4ですね。
ちなみに、一番上のaverage rate が 83MBytes/Secになっているのは、最初に一番上のターミナルでコピーを始め、2番目、3番目、4番目のコピーが始まるまでに140MBytes/Secぐらいで先行してコピーをしていたため。
ddrescue で同期しながら複数台に書き込む
ここで、コピーのタイミングを4台合わせ、同じ箇所をコピーするようにする。そうすればメモリキャッシュに残ったコピー元イメージを有効に活用できる。
かなり向上。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 )
同時にコピーできているが・・・遅い!! ひと桁遅いとは・・・。
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
いろいろハードコーディングなのでキケンなスクリプトですが、あくまでテストということで。
動かした結果
ゆらぎがあるけど先程よりは速いです。
130GBytesのコピー4台が、55分程度で終了しました。大体、40GBytes/Sec.
140GBytes には程遠いので、もうちょっと工夫の余地がありますね。