web-dev-qa-db-ja.com

ddを使用して画像を再読み込みし、今書いた画像と一致させるにはどうすればよいですか?

ddツールを使用して8GBSDカードに書き込んでいる最大1GBの画像があります。読み返してハッシュを元のハッシュと比較することにより、破損することなく書き込まれたことを確認したいと思います。

明らかに、ddを介して読み戻すと、結果の画像のサイズはSDカードのサイズと一致するため、ハッシュをチェックすることは無意味です。

writing呼び出しの出力を何らかの方法で解釈して、skip/countパラメーターを正しく読み戻すように構成する必要があると思います。

画像の作成に使用したコマンド:

> Sudo dd if=my.img of=/dev/sdc bs=1M 
8+50581 records in
8+50581 records out
3947888640 bytes (3.9 GB) copied, 108.701 s, 36.3 MB/s

画像を読み取るために使用したコマンド:

> Sudo dd if=/dev/sdc of=same_as_my.img
15523840+0 records in
15523840+0 records out
7948206080 bytes (7.9 GB) copied, 285.175 s, 27.9 MB/s
5
Kentzo

画像のサイズを決定します。たとえば、\ls -l my.imgls -lhではなく、おおよそのサイズになります。\lsls='ls -h'などのエイリアスから保護します)またはstat -c %s my.imgを使用します。

コピーを元のファイルと一度だけ確認する場合は、ファイルを比較するだけです。ハッシュを使用することは、1回限りの比較には役に立ちません。処理が遅くなり、より多くのコマンドが必要になるだけです。コマンド cmp はバイナリファイルを比較します。画像ファイルとSDカードの対応する部分を渡す必要があります。 head を使用して、SDカードの先頭を抽出します。

</dev/sdc head -c "$(stat -c %s my.img)" | cmp - my.img

多くの比較を実行する場合は、ハッシュを計算するために各インスタンスを1回読み取るだけでよいため、ハッシュが役立ちます。データの破損が心配なので、どんなハッシュでもかまいません。セキュリティ上の理由でファイルが変更されていないことを確認する必要がある場合は、cksummd5sumは適切ではないため、代わりにsha256sumまたはsha512sumを使用する必要があります。

md5sum <my.img >my.img.md5sum
</dev/sdc head -c "$(stat -c %s my.img)" | md5sum >sd-copy.md5sum
cmp my.img.md5sum sd-copy.md5sum

最初のコマンドの入力リダイレクトに注意してください。これにより、チェックサムファイルにファイル名が含まれないようになるため、チェックサムファイルを比較できます。チェックサムファイルと確認するコピーがある場合は、で直接チェックを行うことができます。

</dev/sdc head -c "$(stat -c %s my.img)" | md5sum -c my.img.md5sum

ああ、そして dd を使用しないでください、それは遅く(またはせいぜい速くはありません)、コピーエラーを検出しません。

私たちがしたことはmd5um実際のパーティション。ディスクを使用してイメージをチェックサムすることは正確にはできませんが、ディスクが数個ある場合は(私たちのように)、「適切な」チェックサムを確立できます。

たとえば、この場合、パーティションは次のようになります。

$ Sudo fdisk -l /dev/sdc
Disk /dev/sdc: 7948 MB, 7948206080 bytes
245 heads, 62 sectors/track, 1021 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sdc2          122880     7710719     3793920   83  Linux

次に、次の方法でパーティションにハッシュを生成できます。

$ Sudo md5sum /dev/sdc2

ただし、これは次のことを前提としています。

  • テストできるSDカードが複数あります
  • ハッシュを実行する前にSDカードをマウントしない

また、SDカードのプロパティに基づいて異なるハッシュを提供するため、ディスク全体(つまり、上記の例では「/ dev/sdc」)をチェックサムできないことに注意してください。

1
vpetersson

IMO、これを行うための最良の(最も簡単な)方法は、ddを使用するときに、ソースファイルに均等に分割できるバイトサイズ(bs =)を使用することです。これにより、整数のブロック書き込みが発生します。次に、プロセスを逆にして(読み戻し)、読み取りコマンドでbs =とcount =の両方で正確なバイト数が読み取られるようにし、チェックサムプログラムにパイプします。

例:

ls

-rw-rw-r-- 1 1006632960 myfile.iso

チェックサムを生成します。

sha256sum myfile.iso

8012fcba8bf71a7dd9e8179af40bce0fec57bb84b7426e4de807130ada63243d myfile.iso

ファイルサイズ1006632960は512で割り切れます。したがって、ddを使用します。

Sudo dd if = myfile bs = 512b of =/dev/sdi

結果は次のようになります。

3840 +0レコード

3840 +0レコードアウト

+0はここで重要な部分です。 +0以外のものが表示された場合は、ddコマンドで別のバイトサイズが必要です。

次に、結果を確認するには、次のコマンドを使用します。

Sudo dd if =/dev/sdi bs = 512b count = 3840 | sha256sum

そして出力は前のsha256sumと一致し、それが良いコピーであることを意味します:

3840 +0レコード

3840 +0レコードアウト

1006632960バイト(1.0 GB、960 MiB)コピー、14.788秒、68.1 MB /秒

8012fcba8bf71a7dd9e8179af40bce0fec57bb84b7426e4de807130ada63243d-

最も難しいのは、バイトサイズを正しくすることです。一度入手すれば、残りは簡単です。

0
Stuart K. Smith

md5sumは、画像ファイルの値をSDカードの値と比較するための良い解決策です。

0
steve

SDカードのファイルシステムに書き込んでいますか?または直接?比較されたデータのランレングスを制限したい場合は、カウントが必要ですか?

ddは、コピーされたバイト数を示します。

これをキャプチャして、適切なbs = xおよびcount = yで使用する必要があります。これは、クラスターチップでガベージをハッシュしないようにするためです。

[〜#〜]編集[〜#〜]

出力をキャプチャします。これは必要な行です。バイトにはgrepを使用します。

254033920 bytes (254 MB) copied, 1.198 s, 212 MB/s

そうです(冗長性とバックティックを許します)。

# original dd
dd if=/path/to/file of=/dev/sdc 2> tempfile
# get bytes
CNT=`cat tempfile | grep bytes | cut -d' ' -f1`
# copy it back by byte
dd bs=1 count=$CNT if=/dev/sdc of=/path/to/copy 

これは遅くなるので(ここでは行いません)、最初に読み取る最適なブロックサイズと倍数全体の数を計算してから、スキップ/シークで余りを取得する必要があります。

ただし、より良いアプローチは、切り上げられたブロック数を読み戻し、切り捨てられた長さでハッシュを実行することです。目的は、必要がない場合はデバイス全体を読み取ることではありません。

0
mckenzm
Sudo sh -c '
     dd bs=64k if="$1" of="$2"
     ! cmp -- "$1" "$2" 2>&1 |
       grep -qvF "EOF on $1"
' -- my.img /dev/sdc

cmpは、2つのファイルをバイトごとに比較し、それらが同一であるかどうかに基づいて返します。一方が他方よりも短いが、両方のファイルが短いファイルの全長で同一である場合、cmpは1を返し、EOF on <shorter file>... stderrへ。両方のファイルが同一の場合、cmpは0を返し、何も報告しませんが、そうでない場合、cmpは1を返し、それらが異なるバイトについて報告します。したがって、上記のステートメントは、stdoutまたはstderrで一致しない出力行を生成するcmp実行に対して1を返しますEOF on $1または0。それ以外の場合。

0
mikeserv