Kapan dd cocok untuk menyalin data? (atau, ketika dibaca () dan tulis () parsial) menunjukkan peringatan penting saat menggunakan count
: dd
dapat menyalin blok parsial, sehingga ketika diberikan count
akan berhenti setelah jumlah blok yang diberikan, bahkan jika beberapa blok tidak lengkap. Karena itu Anda mungkin berakhir dengan lebih sedikit dari bs * count
byte yang disalin, kecuali jika Anda tentukan iflag=fullblock
.
Ukuran blok default untuk dd adalah 512 byte. count
adalah batas; sebagai pertanyaan Anda mengisyaratkan itu tidak diperlukan ketika menyalin perangkat ukuran terbatas, dan benar-benar dimaksudkan untuk menyalin hanya sebagian perangkat.
Saya pikir ada dua aspek yang perlu dipertimbangkan di sini: kinerja dan pemulihan data.
Sejauh menyangkut kinerja, Anda idealnya menginginkan ukuran blok setidaknya sama dengan, dan kelipatan, ukuran blok fisik yang mendasarinya (karenanya 2048 byte saat membaca CD-ROM). Bahkan saat ini Anda juga dapat menentukan ukuran blok yang lebih besar untuk memberikan sistem caching yang mendasarinya kesempatan untuk melakukan buffer untuk Anda. Tetapi meningkatkan ukuran blok berarti dd
harus menggunakan lebih banyak memori, dan itu bisa menjadi kontra-produktif jika Anda menyalin melalui jaringan karena fragmentasi paket.
Sejauh menyangkut pemulihan data, Anda dapat mengambil lebih banyak data dari hard disk yang gagal jika Anda menggunakan ukuran blok yang lebih kecil; inilah yang dilakukan oleh program seperti dd-rescue
itu secara otomatis: mereka membaca blok besar pada awalnya, tetapi jika blok gagal mereka membacanya kembali dengan ukuran blok yang lebih kecil. dd
tidak akan melakukan ini, itu hanya akan gagal seluruh blok.
dd bs=4m iflag=fullblock
vsdd bs=1111
dan perhatikan tingkat data yang jauh lebih tinggi yang diberikan mantan. Ini karena yang pertama sejajar dengan ukuran blok alami pada kartu SD, sedangkan yang terakhir membutuhkan pengontrol SD untuk melakukan banyak membaca, menyalin dan merenungkan untuk menulis blok fisik parsial. Pentingnyafullblock
tidak boleh diremehkan, omong-omong, karena tanpa itu,bs
hanya pembacaan yang maksimal dan parsial dapat menyebabkan ketidakselarasan berikutnya yang persisten.Ada sedikit pemujaan di sekitar
dd
. Awalnya, ada dua bugcp
yang menyebabkan masalah: Ini akan salah mendeteks file sebagai jarang ketika dilaporkan dengan ukuran blok selain 512 (Linux menggunakan ukuran blok 1024), dan tidak menghapus blok kosong dari tujuan ketika menyalin dari file jarang ke perangkat blokir.Anda dapat menemukan beberapa referensi untuk ini di arsip milis Linux awal .
Jadi orang terbiasa menjadi cara yang benar untuk menangani gambar disk, dan cp jatuh di pinggir jalan. Dan karena dd menggunakan ukuran blok default 512, itu lambat (lebih lambat dari cp pada sistem modern). Tetapi tidak jelas ukuran blok apa yang harus Anda gunakan. Mungkin dalam kasus Anda seseorang telah membaca bahwa 2048 adalah ukuran blok "alami" untuk CD-ROM (yaitu, CD-ROM dibagi menjadi 2.352 sektor byte yang berisi 2.048 byte data bersama dengan informasi koreksi kesalahan) dan telah memutuskan bahwa ini adalah ukuran "benar" untuk digunakan dengan dd, padahal sebenarnya Anda mungkin akan mendapatkan hasil yang lebih cepat jika Anda menggunakan ukuran blok yang lebih besar. Faktanya, GNU cp menggunakan ukuran blok default 64k untuk alasan ini.
tl; dr:
cp /dev/dvd foobar.iso
harusnya bekerja dengan baik. Ukuran blok defaultdd
adalah 512. Satu-satunya efek meninggalkannya saja kemungkinan besar dalam sebagian besar keadaan modern adalah membuat proses penyalinan lebih lambat.sumber
Mengubah ukuran blok adalah cara yang baik untuk mengubah berapa banyak buffered atau dibaca / ditulis sekaligus.
Tidak benar-benar berhubungan dengan apakah itu perangkat blok nyata atau yang tak terbatas / virtual. Ini tentang seberapa banyak Anda ingin disimpan dalam memori sebelum
dd
menulisnya.bs=
menetapkan keduanyaibs=
(berapa banyak data yang dibaca sekaligus) danobs=
(berapa banyak data yang ditulis sekaligus). Semakin tinggi semakinobs=
banyak iterasiibs=
akan diperlukan sebelum Anda memiliki cukup data untukdd
mulai menulis ke tujuan.count=
juga tidak bergantung pada apa pun selain apa yang ingin Anda lakukan. Ini mengontrol berapa banyak "blok" (yang diukur denganibs=
) akan diperlukan untukdd
mempertimbangkan pekerjaannya yang sedang dilakukan.sumber
dd
menyalin sebagian blok - tidak selalubs * count
.dd
tanpabs=2048
atau beberapa daripadanya akan memberikan kesalahan saat membaca dari drive blok perangkat cdrom.Menggunakan opsi blocksize
dd
secara efektif menentukan berapa banyak data yang akan disalin ke memori dari sub-sistem input I / O sebelum mencoba untuk menulis kembali ke sub-sistem I / O output. Outputnya sama (karena seluruh disk sedang disalin), potongan hanya dibaca pada ukuran yang berbeda yang Anda tentukan (sebagian besardd
implementasi berjalan dengan ukuran blok default 512 byte).Jika Anda memiliki memori cadangan dalam jumlah besar dan meningkatkan ukuran blok, maka potongan data yang lebih besar dapat dibaca secara berurutan, disangga, dan dibilas ke tujuan keluaran. Ukuran blok yang lebih rendah membutuhkan lebih banyak overhead dalam hal masing-masing individu, memset dll.
Jarak tempuh Anda mungkin berbeda-beda tergantung di mana Anda
if=
danof=
diatur, dan perangkat keras apa yang Anda lalui, jika Anda memiliki memori rendah dan sebagainya.sumber
The bs = merupakan ukuran blok untuk membaca atau menulis. Meninggalkan bidang utuh atau tidak menentukannya mungkin tampak melakukan pekerjaan yang sama menyalin tetapi ada fakta tersembunyi dalam menggunakannya. Sebagai contoh,
Dalam kasus pertama menggunakan ukuran blok yang lebih rendah telah ditemukan untuk meningkatkan kecepatan penyalinan. Sementara di yang terakhir, ukuran blok yang lebih tinggi telah menjadi pilihan yang lebih baik karena ia meningkatkan ukuran sektor dan mengurangi jumlah
sector change
perintah, yang biasanya menghasilkan operasi I / O yang lebih cepat.sumber