Linuxでハードドライブを充填する方法


24

私はコードの一部のテストを行っており、ハードドライブにデータを入れたいと思っています。ddすぐに巨大なファイルを作成できることがわかりましたが、df意見が異なります。ここに私が試したものがあります:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lh10Gファイルを示しています。ただし、df -hパーティションが縮小しなかったことを示しています。ではdf、データが取得されたことを認識するために何をする必要がありますか?ユニットテストでコード化する高速なものを期待しています。



ところで、10 * 1024 * 1024 * 1024は10 * 2 ** 30と同じですが、少し単純です。
deltaray

回答:


26

seek=<big number>トリックの問題は、ファイルシステムが(通常)賢いことです:ファイルの一部が一度も書き込まれていない(したがってすべてゼロである)場合、そのためにスペースを割り当てることはありません-だから、ご覧のように、スペースをとらない10GBのファイルを作成できます(これは「スパースファイル」と呼ばれ、特定のデータベース実装などの場合に非常に役立ちます)。

強制的にスペースを割り当てることができます(例)。

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

これにはかなり時間がかかりますが、実際にはディスクがいっぱいになります。ブロックサイズを1よりもはるかに大きくすることをお勧めしddます。これにより、プロセスが実行するシステムコールの数が決定されるためです。(1MBを超えるとはいえ、おそらく大きな違いはなく、速度が低下する可能性もあります...)


私は通常bs =を使用します(キャッシュサイズの半分は、書き込み中のドライブにあります)。これは、後でサイズ変更するためにパーティションをより大きなハードドライブにイメージングするときに、これまでうまく機能していました。ETA:クリティカルワードHALF。
アトローン

20

これに対する別のオプションとして、yesを単一の文字列とともに使用し、dd if = / dev / urandom of = largefileを実行するよりも約10倍高速です。このような

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile

これは、驚くべきことに、dd if = / dev / zero of = filename bs = 1Mを使用するのとほぼ同じくらい高速です。
-bhinesley

構文も覚えやすいです。
AWT

7

「スパースファイル」と呼ばれるものを作成しました。ファイルのほとんどは空であるため(つまり、\ 0として読み返されます)、実際に書き込まれたもの以外のディスクのスペースを取りません(1B、10GB後)ギャップの)。

巨大なファイルを作成して、実際のディスクスペースを瞬時に取得できるとは思わない-物理スペースを取得すると、ファイルシステムがファイルにディスクブロックを割り当てる必要があります。

ドライブの順次書き込み速度によって制限される、昔ながらの「dd if = / dev / zero of = filename bs = 100M count = 100」に固執していると思います。


6

ファイルシステムがいっぱいになっているケースをテストするだけであれば、おそらくfallocateで十分です。しかも高速!例えば

fallocate -l 150G


3
ファイル名を指定する必要があります:fallocate -l 150G foo。それにもかかわらず、ツールに言及するための+1。
カミルマシオロウスキ


3

文字通りハードドライブをいっぱいにしたい場合は、次のようにします。

dd if=/dev/zero of=zeros bs=1M

サイズを制限する場合は、オプションでカウントを指定できますが、カウントを省略すると、ディスク領域がなくなるまで実行されます。

dd if=/dev/zero of=zeros bs=1M count=10240

psmearsで述べたように、ブロックサイズを1 B(bs = 1)ではなく1 MB(bs = 1M)に設定すると、パフォーマンスが向上します。これにはまだ時間がかかりますが、コマンドの進行状況を確認する場合は、別のコンソールを開いて次のコマンドを実行します。

ps aux | grep dd

このコマンドでddのPIDを使用します(PIDをddのPIDに置き換えます)。

kill -USR1 PID

次に、ddターミナルを見てください。もちろん、ドライブをいっぱいにしようとしているときは、これは限られた用途です(それぞれdfまたはduを使用して、それぞれ空きディスク容量またはファイルサイズを確認できます)。ただし、ddに進行状況を出力させると便利な場合もあります。

余分なクレジット:空き領域をゼロにする実用的な用途の1つは、その後、「ゼロ」ファイルを削除し、パーティション(またはすべてのパーティションをゼロにした場合はディスク)全体をディスクイメージファイルにddできることです(たとえば、 、disk-backup.dd)、ファイルを圧縮します。空き領域は高度に圧縮できるようになったため、圧縮されたddイメージは、コンテンツが含まれる元のブロックデバイスよりもはるかに小さくなります。

Shenanigans:大きなゼロファイルを圧縮して、すべての友達に電子メールで送信します。本当にクールなものだと伝えてください。


2

次のコマンドを使用して、スパースではない1 TBファイルを作成します。

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

これは、クォータが超過した場合、またはファイルシステムがいっぱいになった場合の動作をテストするのに役立ちました。

df -h 利用可能なスペースが小さくなることを示しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.