私はレプリカの「高度なケース」を作成しようとしています。
ブロックデバイスに書き込むパイプがあり、その端には触れてはいけないパーティションがあります。私はこのパーティションがどこから始まるのかを知っています。この場合は、パーティションテーブルを上書きしたいと思います。
簡単にするために、パイプラインはdd if=myfile
。
dd if=myfile > /dev/sda
私は次のことをすることができます
dd if=myfile | dd bs=1B count=startofmypartition-~1000000 > /dev/sda
しかし、これを行うより良い方法はありますか?このアプローチに欠点はありますか?
pv
サイズオプションがありますが、ETAを計算するためにのみ使用されると指定されているので、これがうまくいくかどうかはわかりません。 (マンページから:)
-s SIZE, --size SIZE Assume the total amount of data to be transferred is SIZE bytes when calculating percentages and ETAs. The same suffixes of "k", "m" etc can be used as with -L.
より多くの書き込みがあることを知っていますが、その結果、テープドライブでない限り、同じ量のスペースを使用してディスクに同じデータが必要です。
答え1
dd bs=1
read()
バイトごとにシステムコールを繰り返し実行するため、非常に非効率的ですwrite()
。dd
ブロックデバイスで使用することはとにかく意味がありません(特殊フラグ(conv=noerror,sync...
エラーやオフセット処理など)を使用したい場合を除く)。
ここでは、次のことができます。
offset=$(($(cat /sys/class/block/sda3/start) * 512)) &&
pv -trabSs "$offset" < myfile > /dev/sda
head -c "$offset"
(または進行状況情報に興味がない場合に使用します)。
pv
そして、head
パフォーマンスを最適化するのに十分なバッファサイズが選択されます。
(ディスクの先頭にデータを書き込むので、パーティションテーブルを効果的に上書きします!)
/dev/sda
別のオプションは、上書きしたい部分だけをマップして新しいブロックデバイスを作成することです。
良い:
echo "0 $(cat /sys/class/block/sda3/start) linear /dev/sda 0" |
dmsetup create writable_sda &&
cp myfile /dev/mapper/writable_sda