小ネタです。
LinuxやmacOS上で特定サイズのファイルを作成するには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を利用した方が安全と言えます。
参考ページ
- man dd
- /dev/random - Wikipedia
- odコマンド