[Linux] 指定した大きさのファイルを作成する - dd

小ネタです。

LinuxmacOS上で特定サイズのファイルを作成するにはddコマンドを利用します。以下のコマンドを実行すると中身がすべてゼロの1kbyteのファイルを生成できます。

$ dd bs=1024 count=1 if=/dev/zero of=file1
$ ls -l  
total 8
-rw-r--r--  1 katsube  staff  1024  2  4 17:53 file1 

odコマンドでバイナリファイルとして表示すると、以下のようにすべて0が記録されていることを確認できます。

$ od test1                                
0000000    000000  000000  000000  000000  000000  000000  000000  000000
*
0002000

大雑把な原理

もともとddコマンドはファイルをコピーするコマンドの一種。実行時に指定したバイト数ずつコピーしたりデータを変換できるのが特徴です。今回は永遠にゼロが湧き出る特殊なファイル/dev/zeroをコピー元とし、必要なバイト数分コピーしているというわけです。

$ dd bs=(ブロック) count=(個数) if=(コピー元) of=(コピー先)
bs
block sizeの略称で一度にコピーするサイズ。1k, 1m, 1gなど接頭辞を用いて指定することもできます。
count
bsを何回コピーするか。例えば「bs=1024 count=10」なら1024*10 = 10kbyte分がコピーされます。

ファイルサイズを調整する

bsとcountを調整して任意のサイズのファイルを作成できます。bsを大きくしすぎるとパフォーマンス的によろしくないため、大きなファイルを作成する場合にはcountを増やしてやります。

# 1K byte
$ dd bs=1k count=1 if=/dev/zero of=file1

# 1M byte
$ dd bs=1m count=1 if=/dev/zero of=file1

# 1G byte
$ dd bs=1m count=1024 if=/dev/zero of=file1

# 1T byte
$ dd bs=1g count=1024 if=/dev/zero of=file1

乱数を記録する

内容をすべてゼロではなく何らかの値を記録したい場合は/dev/zeroの箇所を/dev/urandomに変更すると、乱数で埋め尽くしてくれます。

$ dd bs=1024 count=1 if=/dev/urandom of=file1

odコマンドで中身を開くとご覧の通りデタラメな数字がひたすら記録されているのがわかります。

$ od file1                                   
0000000    054362  045030  014166  047772  146303  162540  047614  065274
0000020    120275  015004  122152  071655  164602  157650  033661  163242
0000040    151677  165007  062002  120743  061472  177212  121115  102754
0000060    072050  117745  163622  020316  041465  121500  104413  062763
0000100    120141  021017  077053  121547  124407  144452  134536  145411
(中略)
0001760    163157  026411  151674  043246  034655  113706  027465  057475
0002000

randomとurandmの違い

Linuxでの乱数生成器は/dev/random/dev/urandmの2種類が最初から用意されています。

乱数を発生させるための元になっている値は有限なため、randomはある程度乱数を発生させると途中で止まってしまいますが、今回利用しているurandomは元になる値を使い回す性質があるため停止しません。一見便利に見えますがセキュリティ的に重要な場面での利用は同じ数値が出現しやすくなるなどの問題があるためrandomを利用した方が安全と言えます。

参考ページ