Saya ingin menghasilkan file acak 1 GB, jadi saya menggunakan perintah berikut.
dd if=/dev/urandom of=output bs=1G count=1
Tetapi alih-alih setiap kali saya meluncurkan perintah ini saya mendapatkan file 32 MB:
<11:58:40>$ dd if=/dev/urandom of=output bs=1G count=1
0+1 records in
0+1 records out
33554431 bytes (34 MB, 32 MiB) copied, 0,288321 s, 116 MB/s
Apa yang salah?
SUNTING:
Berkat jawaban yang bagus dalam topik ini, saya datang dengan solusi yang bertuliskan 32 bongkahan 32 MB besar yang menghasilkan 1GB:
dd if=/dev/urandom of=output bs=32M count=32
Solusi lain diberikan yaitu membaca 1 GB langsung ke memori dan kemudian menulis ke disk. Solusi ini membutuhkan banyak memori sehingga tidak diutamakan:
dd if=/dev/urandom of=output bs=1G count=1 iflag=fullblock
script
dd
random-number-generator
Trismegistos
sumber
sumber
dd
semua. Saya akan menggunakanhead
,cat
ataursync
di tempatnya hampir selalu. Dan pertanyaan Anda jika salah satu alasan mengapa alternatif biasanya lebih aman.head
tidak dapat melakukan tugas ini tanpa-c
opsi yang tidak ada di POSIX . Saya tidak tahu versicat
mana yang bisa menyelesaikan ini.rsync
adalah utilitas yang sama sekali tidak standar. Itu tidak ada di sini atau di sana; membaca halaman manualnya, saya juga tidak bisa mengatasi masalah ini./dev/urandom
juga tidak ada di POSIX ...Jawaban:
bs
, ukuran buffer, berarti ukuran panggilan read () tunggal yang dilakukan oleh dd.(Misalnya, keduanya
bs=1M count=1
danbs=1k count=1k
akan menghasilkan file 1 MiB, tetapi versi pertama akan melakukannya dalam satu langkah, sedangkan yang kedua akan melakukannya dalam 1024 potongan kecil.)File biasa dapat dibaca di hampir semua ukuran buffer (selama buffer itu sesuai dengan RAM), tetapi perangkat dan file "virtual" sering bekerja sangat dekat dengan panggilan individu dan memiliki pembatasan sewenang-wenang tentang berapa banyak data yang akan mereka hasilkan per baca () panggilan.
Sebab
/dev/urandom
, batas ini didefinisikan dalam urandom_read () di driver / char / random.c :Ini berarti bahwa setiap kali fungsi dipanggil, itu akan menjepit ukuran yang diminta ke 33554431 byte.
Secara default, tidak seperti kebanyakan alat lain, dd tidak akan mencoba lagi setelah menerima lebih sedikit data daripada yang diminta - Anda mendapatkan 32 MIB dan hanya itu. (Untuk membuatnya coba lagi secara otomatis, seperti dalam jawaban Kamil, Anda harus menentukan
iflag=fullblock
.)Perhatikan juga bahwa "ukuran baca tunggal ()" berarti bahwa seluruh buffer harus muat dalam memori sekaligus, sehingga ukuran blok yang besar juga sesuai dengan penggunaan memori yang sangat besar oleh dd .
Dan itu semua tidak ada gunanya karena Anda biasanya tidak akan mendapatkan kinerja apa pun ketika pergi di atas ~ 16-32 blok MiB - syscalls bukan bagian yang lambat di sini, generator nomor acak adalah.
Jadi untuk kesederhanaan, gunakan saja
head -c 1G /dev/urandom > output
.sumber
iflag=fullblock
adalah ekstensi GNU ke utilitas POSIXdd
. Karena pertanyaannya tidak menentukan Linux, saya pikir penggunaan ekstensi khusus Linux mungkin harus secara eksplisit dicatat agar beberapa pembaca di masa depan mencoba untuk memecahkan masalah serupa pada sistem non-Linux menjadi bingung.dd
di mesin saya, dengan ukuran blok dari 1k ke 512M. Membaca dari Intel 750 SSD, kinerja optimal (sekitar 1300MiB / s) dicapai pada blok 2MiB, secara kasar mencocokkan hasil Anda. Ukuran blok yang lebih besar tidak membantu atau terhalang. Membaca dari/dev/zero
, kinerja optimal (hampir 20GiB / s) berada di 64KiB dan 128KiB blok; blok yang lebih kecil dan lebih besar menurunkan kinerja, kira-kira cocok dengan komentar saya sebelumnya. Intinya: tolok ukur untuk situasi aktual Anda. Dan tentu saja, tidak satu pun dari kami yang melakukan benchmark/dev/random
: Pdd
lebih cepat. Sebuah strace cepat menunjukkan bahwahead
menggunakan 8KiB membaca, dan dua 4KiB menulis, yang menarik (GNU coreutils 8.26 pada Debian 9.6 / Linux 4.8).head
kecepatan memang di suatu tempat antaradd bs=4k
dandd bs=8k
.head
kecepatan turun ~ 40% dibandingkandd if=/dev/zero bs=64k
dan turun ~ 25% dibandingkan dengandd if=/dev/nvme0n1 bs=2M
. Membaca dari/dev/zero
tentu saja lebih terbatas pada CPU, tetapi untuk SSD I / O queing juga memainkan peran. Ini perbedaan yang lebih besar dari yang saya harapkan.dd
dapat membaca kurang dariibs
(catatan:bs
menentukan keduanyaibs
danobs
), kecualiiflag=fullblock
ditentukan.0+1 records in
menunjukkan bahwa0
blok penuh dan1
sebagian blok telah dibaca. Namun setiap blok penuh atau parsial meningkatkan penghitung.Saya tidak tahu mekanisme pasti yang membuatSunting: jawaban serentak ini menjelaskan mekanisme yang membuatdd
membaca blok yang kurang dari1G
dalam kasus khusus ini. Saya kira semua blok dibaca ke memori sebelum ditulis, sehingga manajemen memori dapat mengganggu (tapi ini hanya dugaan).dd
membaca blok yang kurang dari1G
dalam kasus khusus ini.Lagi pula, saya tidak merekomendasikan sebesar itu
bs
. Saya akan menggunakanbs=1M count=1024
. Yang paling penting adalah: tanpaiflag=fullblock
setiap membaca upaya dapat membaca kurang dariibs
(kecualiibs=1
, saya pikir, ini meskipun cukup efisien).Jadi, jika Anda perlu membaca sejumlah data, gunakan
iflag=fullblock
. Catataniflag
tidak diperlukan oleh POSIX, Andadd
mungkin tidak mendukungnya. Menurut jawabanibs=1
ini mungkin satu-satunya cara POSIX untuk membaca jumlah byte yang tepat. Tentu saja jika Anda berubahibs
maka Anda harus menghitung ulangcount
. Dalam kasus Anda menurunkanibs
ke32M
atau kurang mungkin akan memperbaiki masalah, bahkan tanpaiflag=fullblock
.Di Kubuntu saya, saya akan memperbaiki perintah Anda seperti ini:
sumber