コードのテストをしていて、ハードドライブをデータでいっぱいにしたいと思っています。dd
一瞬で巨大なファイルを作成できることはわかりましたが、df
うまくいきませんでした。試したことは次のとおりです。
dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))
ls -lh
10G のファイルが表示されます。ただし、df -h
パーティションは縮小されていないことが示されています。では、データが取得されたことを認識させるには、何をする必要がありますかdf
? ユニット テストでコード化した高速な処理を期待しています。
答え1
このトリックの問題seek=<big number>
は、ファイルシステムが (通常は) 賢いことです。ファイルの一部が一度も書き込まれていない場合 (つまりすべてゼロの場合)、ファイルシステムはその部分にスペースを割り当てません。そのため、ご覧のとおり、スペースをまったく取らない 10 GB のファイルを作成できます (これは「スパース ファイル」と呼ばれ、特定のデータベース実装など、いくつかの場合に非常に役立ちます)。
次のようにしてスペースを強制的に割り当てることができます (例):
dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))
これにはかなり時間がかかりますが、実際にディスクがいっぱいになります。ブロック サイズを 1 よりはるかに大きくすることをお勧めします。これは、プロセスがdd
実行するシステム コールの数によって決まるためです。ブロック サイズが小さいほど、システム コールの数が多くなり、したがって実行速度が遅くなります。(ただし、1 MB 程度を超えると、あまり違いは出ず、むしろ速度が低下する可能性があります...)
答え2
これの別のオプションとして、yes を単一の文字列とともに使用すると、dd if=/dev/urandom of=largefile を実行するよりも約 10 倍高速になります。
yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
答え3
「スパース ファイル」と呼ばれるファイルを作成しました。これは、ほとんどが空 (つまり、\0 として読み取られる) であるため、実際に書き込まれるもの (10 GB のギャップの後は 1 バイト) 以外はディスク上のスペースを占有しないファイルです。
実際のディスク領域を一瞬で占有する巨大なファイルを作成することはできないと思います。物理的な領域を占有するということは、ファイルシステムがファイルにディスク ブロックを割り当てる必要があることを意味します。
ドライブの順次書き込み速度によって制限される、旧式の「dd if=/dev/zero of=filename bs=100M count=100」に固執していると思います。
答え4
の使用をやめてseek
、非常に大きなbs
および/またはを使用してくださいcount
。そのままでは、スパースファイル、そして明らかにそうしてはいけません。