ゼロ以外のブロックのみを作成してディスクバックアップを復元する

ゼロ以外のブロックのみを作成してディスクバックアップを復元する

生の形式のディスクバックアップがあり、最初にゼロで埋められていると仮定すると、バックアップを復元するsda.imgとき/dev/sdaにゼロをスキップできますか?シミュレーションはdd入力ストリーム内のゼロブロックを検出し、出力デバイスで適切な照会を実行する必要があります。

ノート

cpオプションを試しましたが、--sparse=alwaysターゲットがブロックデバイスの場合は機能しないようです。

[root@vmarch ~]# truncate sda.img -s1G
[root@vmarch ~]# cat sda.img | cp --sparse=always /dev/stdin sdb.img
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
0       sdb.img
[root@vmarch ~]# ls -lh sda.img sdb.img
-rw-r--r-- 1 root root 1.0G Jul 31 09:17 sda.img
-rw------- 1 root root 1.0G Jul 31 09:17 sdb.img
[root@vmarch ~]# losetup -f sdb.img
[root@vmarch ~]# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE     DIO
/dev/loop0         0      0         0  0 /root/sdb.img   0
[root@vmarch ~]# cp --sparse=always sda.img /dev/loop0
[root@vmarch ~]# du -h sda.img sdb.img
0       sda.img
1.1G    sdb.img

答え1

GNU coreutils (たとえば、非埋め込み Linux) では、次のようにcp --sparse=always出力ファイルをできるだけ薄くすることができます。

cp --sparse=always sda.img /dev/sda

これは直線より速くてもそうでないかもしれません。

cat sda.img >/dev/sda

cp --sparse=always入力内容を読み、分析するのにもっと時間を費やす必要があります。このcatバージョンは書き込みに時間がかかりますが、出力デバイスが遅くない限り、コピー期間に大きな影響はありません。これは、読み取りと書き込みがほとんど並列化される可能性があるためです。

関連情報