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
画像のサイズを決定します。たとえば、\ls -l my.img
(ls -lh
ではなく、おおよそのサイズになります。\ls
はls='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回読み取るだけでよいため、ハッシュが役立ちます。データの破損が心配なので、どんなハッシュでもかまいません。セキュリティ上の理由でファイルが変更されていないことを確認する必要がある場合は、cksum
とmd5sum
は適切ではないため、代わりに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カードのプロパティに基づいて異なるハッシュを提供するため、ディスク全体(つまり、上記の例では「/ dev/sdc」)をチェックサムできないことに注意してください。
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-
最も難しいのは、バイトサイズを正しくすることです。一度入手すれば、残りは簡単です。
md5sum
は、画像ファイルの値をSDカードの値と比較するための良い解決策です。
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
これは遅くなるので(ここでは行いません)、最初に読み取る最適なブロックサイズと倍数全体の数を計算してから、スキップ/シークで余りを取得する必要があります。
ただし、より良いアプローチは、切り上げられたブロック数を読み戻し、切り捨てられた長さでハッシュを実行することです。目的は、必要がない場合はデバイス全体を読み取ることではありません。
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。それ以外の場合。