Cara mengisi hard drive di Linux

24

Saya sedang melakukan pengujian sepotong kode dan saya ingin mengisi hard drive dengan data. Saya menemukan bahwa dddapat membuat file besar dalam sekejap, tetapi dftidak setuju. Inilah yang saya coba:

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

ls -lhmenunjukkan file 10G. Namun, df -hmenunjukkan bahwa partisi tersebut tidak menyusut. Jadi apa yang harus saya lakukan untuk dfmengenali data yang sekarang diambil? Saya berharap sesuatu yang cepat yang saya kode dalam unit test.

Pengguna1
sumber
Anda akan lebih beruntung jika Anda bertanya di serverfault.com
BTW, 10 * 1024 * 1024 * 1024 sama dengan 10 * 2 ** 30, sedikit lebih sederhana.
deltaray

Jawaban:

26

Masalah dengan seek=<big number>triknya adalah bahwa sistem file (biasanya) pintar: jika bagian dari file tidak pernah ditulis (dan karena itu semua nol), tidak perlu repot untuk mengalokasikan ruang untuk itu - jadi, seperti yang Anda pernah dilihat, Anda dapat memiliki file 10GB yang tidak memakan ruang (ini dikenal sebagai "file jarang", dan dapat sangat berguna dalam beberapa kasus, misalnya implementasi database tertentu).

Anda dapat memaksa ruang yang akan dialokasikan dengan (misalnya):

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

yang akan memakan waktu lebih lama, tetapi sebenarnya akan mengisi disk. Saya sarankan untuk membuat ukuran blok jauh lebih tinggi dari satu, karena ini akan menentukan berapa banyak sistem yang ddmembuat proses panggilan - semakin kecil ukuran blok , semakin banyak syscalls, dan oleh karena itu semakin lambat akan berjalan. (Meskipun melampaui 1MB atau lebih mungkin tidak akan membuat banyak perbedaan dan bahkan dapat memperlambat segalanya ...)

psmears
sumber
Saya biasanya menggunakan bs = (setengah ukuran cache apa pun ada di drive yang saya tulis). Ini telah bekerja dengan baik hingga saat ini ketika pencitraan partisi ke hard drive yang lebih besar untuk mengubah ukuran nanti. ETA: kata kritis HALF.
atroon
20

Sebagai pilihan lain untuk ini, Anda dapat menggunakan yes bersama dengan string tunggal dan sekitar 10 kali lebih cepat daripada menjalankan dd jika = / dev / urandom dari = largefile. Seperti ini

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
sumber
Ini, secara mengejutkan, tentang secepat menggunakan dd jika = / dev / nol dari = nama file bs = 1M.
bhinesley
Sintaksnya juga mudah diingat.
AWT
7

Anda telah membuat apa yang dikenal sebagai "file jarang" - file yang, karena sebagian besar kosong (yaitu dibaca kembali sebagai \ 0), tidak mengambil ruang pada disk selain apa yang sebenarnya ditulis (1B, setelah 10GB kesenjangan).

Saya tidak percaya Anda bisa membuat file besar, mengambil ruang disk aktual dalam sekejap - mengambil ruang fisik berarti sistem file perlu mengalokasikan blok disk ke file Anda.

Saya pikir Anda terjebak dengan "mode lama dd = / dev / nol = nama file bs = 100M hitung = 100" yang dibatasi oleh kecepatan tulis berurutan drive Anda.

qdot
sumber
6

Jika Anda hanya menguji untuk kasus dengan sistem file yang diisi, mungkin fallocate cukup baik. Dan juga lebih cepat! misalnya

fallocate -l 150G

uchihaangel
sumber
3
Ini perlu nama file yang akan ditentukan: fallocate -l 150G foo. Namun demikian +1 untuk menyebutkan alat.
Kamil Maciorowski
3

Hentikan penggunaan seekdan gunakan yang sangat besar bsdan / atau count. Karena Anda membuat file yang jarang , dan jelas Anda tidak perlu melakukan itu.

Ignacio Vazquez-Abrams
sumber
3

Jika Anda ingin benar-benar mengisi hard drive, lakukan ini:

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

Anda bisa menentukan jumlah jika Anda ingin membatasi ukuran, tetapi jika Anda menghilangkan jumlah, itu hanya akan berjalan sampai Anda kehabisan ruang disk.

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

Seperti yang disebutkan psmears, Anda akan mendapatkan kinerja yang lebih baik jika Anda mengatur ukuran blok menjadi 1 MB (bs = 1M) daripada 1 B (bs = 1). Ini masih membutuhkan waktu, tetapi jika Anda ingin memeriksa progres perintah Anda, buka konsol terpisah dan jalankan perintah ini:

ps aux | grep dd

Gunakan PID dd dalam perintah ini (ganti PID dengan PID dd):

kill -USR1 PID

Kemudian lihat terminal dd Anda. Tentu saja, ini adalah penggunaan terbatas ketika Anda hanya mencoba untuk mengisi drive (Anda bisa menggunakan df atau du untuk memeriksa ruang disk atau ukuran file, masing-masing). Namun, ada saat-saat lain ketika berguna untuk membuat output dd kemajuannya.

Kredit tambahan: satu penggunaan praktis untuk memberi nol ruang kosong adalah, setelah itu, Anda kemudian dapat menghapus file "nol" dan menemukan seluruh partisi (atau disk, jika Anda telah memusatkan semua partisi) ke file gambar disk (katakanlah , disk-backup.dd), lalu kompres file. Ruang kosong sekarang sangat dapat dikompresi, jadi gambar Anda yang terkompresi akan jauh lebih kecil daripada perangkat blok asli yang isinya.

Shenanigans: zip file nol besar dan kirim email ke semua teman Anda. Katakan pada mereka itu sesuatu yang sangat keren.

rampok
sumber
2

Anda membuat file 1 TB non-jarang dengan perintah berikut:

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

Ini berguna dalam menguji apa yang terjadi ketika kuota terlampaui, atau sistem file terisi.

df -h menunjukkan ruang yang tersedia semakin kecil.

pengguna75112
sumber