コマンドリファレンス - ファイルコンバート・コピー dd

 
1. dd ファイルのコンバート・コピー
2.  主なオペランド
3.  適切なブロックサイズを使用する

1. dd ファイルのコンバート・コピー

 dd コマンドの基本は、標準入力を標準出力にコピーするものだそうですが。  実用的には、入出力にデバイスを指定でき、ブロック単位の転送を可能とするため、ハードディスクのパーティションコピーや USB メモリ・光学ディスクのバックアップをとるといった目的に使用できるようです。  また、ハードディスクの不良セクタ検出にも使えます。  基本形は

> dd [オペランド ...]
 なのですが、FreeBSD の man を参考にすると以下のような使い方ができるようです。  ディスクドライブにバッドブロックが含まれていないかチェックする。

> dd if=/dev/ad0 of=/dev/null bs=1m
 現在のところリカバー可能なリードエラーのエラー度合が進んでリカバー不可能になってしまわないように、ディスクドライブをリフレッシュする。

> dd if=/dev/ad0 of=/dev/ad0 bs=1m
 ファイルからパリティビットを削除する。

> dd if=file conv=parnone of=file.txt
 ファイルの (偶数) パリティエラーをチェックする。

> dd if=file conv=pareven | cmp -x - file

2. 主なオペランド

オペランド 意味
bs=n 入出力のブロックサイズを n バイトにします。
if=file 標準入力の代わりに file を使用します。
of=file 標準出力の代わりに file を使用します。

 サイズの指定時に単位として以下の文字が使えます(他にもありますがよく知らない)。

 ・k(キロ 103)
 ・m(メガ 106)
 ・g(ギガ 109

3. 適切なブロックサイズを使用する

 「bs=n」でシステムのメモリ容量に合わせた適切なブロックサイズを使用しないと dd コマンドは、非常に時間がかかります。  「dd コマンドの bs サイズ」の孫引きになりますが、以下のシェルスクリプトを使用するとそのマシンの適切なブロックサイズが分かります。

#!/bin/sh
#
#create a file to work with
#
echo "creating a file to work with"
dd if=/dev/zero of=/var/tmp/infile count=1175000

for bs in  16m 32m 64m 128m 256m 512m

do
        echo "---------------------------------------"
        echo "Testing block size  = $bs"
        dd if=/var/tmp/infile of=/var/tmp/outfile bs=$bs
        echo ""
done
rm /var/tmp/infile /var/tmp/outfile
 このシェルスクリプトは、固定サイズのファイルを処理するのに bs=n の n を変化させて、その処理時間を表示するというものです。  あるマシンでの実行結果は以下のようになりました。

creating a file to work with
1175000+0 records in
1175000+0 records out
601600000 bytes transferred in 30.709318 secs (19590146 bytes/sec)
---------------------------------------
Testing block size  = 16m
35+1 records in
35+1 records out
601600000 bytes transferred in 11.737120 secs (51256186 bytes/sec)

---------------------------------------
Testing block size  = 32m
17+1 records in
17+1 records out
601600000 bytes transferred in 12.126274 secs (49611282 bytes/sec)

---------------------------------------
Testing block size  = 64m
8+1 records in
8+1 records out
601600000 bytes transferred in 9.032465 secs (66604190 bytes/sec)

---------------------------------------
Testing block size  = 128m
4+1 records in
4+1 records out
601600000 bytes transferred in 7.275015 secs (82693984 bytes/sec)

---------------------------------------
Testing block size  = 256m
2+1 records in
2+1 records out
601600000 bytes transferred in 10.648509 secs (56496173 bytes/sec)

---------------------------------------
Testing block size  = 512m
1+1 records in
1+1 records out
601600000 bytes transferred in 9.908525 secs (60715395 bytes/sec)
 この場合、128m が 7.27 秒と最も短い時間なので、128m が最適なブロックサイズでしょう。  ディスクドライブやメモリの容量は時代とともに変化していくので、6行目、8行目は、システムに合わせて書き換えていくのがよいかと思います。