ddコマンドって何でこんなに使いにくいんだ

今回はLinuxのddコマンドです。

10 Byteの全データ0のバイナリデータを作ってみます。

takk@deb9:~/tmp$ dd if=/dev/zero of=test.bin bs=1 count=10
10+0 レコード入力
10+0 レコード出力
10 bytes copied, 0.000134315 s, 74.5 kB/s
takk@deb9:~/tmp$ 

作れましたが、使い方、やたらと難しいです。
Linux入門dd等のキーワードで探せば、ddコマンドの使い方は、上のような形式的に出てくると思います。
まあ間違ってはいないのでしょうけど、小難しいんですよね。

Unix/Linuxのコマンドはフィルタとして設計されてるので、パイプで渡す例を覚えれば簡単です。

データの流れはこんな感じ。

/dev/zero  ===> dd ===> 出力ファイル

/dev/zeroは、0値が流れ出る水道のようなもので、ファイルにリダイレクトすると大変なことになります。
ddを挟まないとこのようなフローになります。

/dev/zero ===> 出力ファイル

やってみます。実行後、すぐにCtrl+Cします。

takk@deb9:~/tmp$ cat /dev/zero > a.bin
^C
takk@deb9:~/tmp$ 

a.binに格納されたのは、ものすごい量の0値です。

takk@deb9:~/tmp$ ls -lh a.bin
-rw-r--r-- 1 takk takk 605M  5月  1 18:46 a.bin
takk@deb9:~/tmp$ od -tx1 a.bin | head -2
0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
takk@deb9:~/tmp$ 

次は、間にddコマンドを挟んで、出力サイズを制御してみます。

takk@deb9:~/tmp$ ls
takk@deb9:~/tmp$ cat /dev/zero | dd bs=1 count=10 > test.bin
10+0 レコード入力
10+0 レコード出力
10 bytes copied, 0.000183191 s, 54.6 kB/s
takk@deb9:~/tmp$ od -tx1 test.bin
0000000 00 00 00 00 00 00 00 00 00 00
0000012
takk@deb9:~/tmp$ 

1byte入出力単位で、10カウント分出力しました。

bsはデフォルトが512byteなので、bsを指定しないと以下のようになります。

takk@deb9:~/tmp$ cat /dev/zero | dd count=1 > test.bin
1+0 レコード入力
1+0 レコード出力
512 bytes copied, 0.000286236 s, 1.8 MB/s
takk@deb9:~/tmp$ 

次は/dev/zeroを使わない方法。echoで数値0を生成し、パイプでddへ渡し、10 byteのファイルに補完。

takk@deb9:~/tmp$ echo -ne "\x0" | dd ibs=10 conv=sync > test.bin
0+1 レコード入力
0+1 レコード出力
10 bytes copied, 0.000344905 s, 29.0 kB/s
takk@deb9:~/tmp$ hd test.bin
00000000  00 00 00 00 00 00 00 00  00 00                    |..........|
0000000a
takk@deb9:~/tmp$ 

このように、ddコマンドを使うときは、フィルタとして考えると、覚えやすいししっくりきます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA