Apa perbedaan antara 'bs', 'count' dan 'seek' dalam perintah dd?

24

Saya telah membaca banyak panduan dan posting forum yang menjelaskan cara menggunakan dd, tetapi satu hal yang saya perhatikan adalah bahwa orang selalu menggunakan nilai yang berbeda untuk bs=, count=dan seek=beralih.

Tolong bisakah seseorang menjelaskan apa yang switch ini lakukan dengan tepat (halaman manual tidak terlalu detail), dan menjelaskan apa pengaturan terbaik untuk mereka untuk tugas yang berbeda, seperti membuat file dari / dev / random atau / dev / zero, dan menimpa partisi dan drive eksternal.

Eric
sumber

Jawaban:

27

Saya benar-benar tidak tahu bagaimana menjelaskan ini lebih baik daripada halaman manual.

bs=set blocksize, misalnya bs=1Makan menjadi 1MiB blocksize.

count=hanya menyalin jumlah blok ini (standarnya adalah untuk dd terus berjalan selamanya atau sampai input habis). Idealnya bs=ukuran blok tetapi mungkin ada bacaan yang tidak lengkap, jadi jika Anda menggunakan count=untuk menyalin sejumlah data tertentu ( count*bs), Anda juga harus menyediakan iflag=fullblock.

seek= mencari jumlah blok dalam output ini, alih-alih menulis ke bagian paling awal dari perangkat output.

Jadi, misalnya, ini menyalin nilai 1MiB y\nke posisi 8MiB dari file output. Jadi total filesize akan menjadi 9MiB.

$ yes | dd bs=1M count=1 seek=8 iflag=fullblock of=outputfile
$ ls -alh outputfile
9.0M Jun  3 21:02 outputfile
$ hexdump -C outputfile
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00800000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00900000

Karena Anda menyebutkan /dev/randomdan menimpa partisi ... itu akan memakan waktu lama karena /dev/random(juga /dev/urandom) terlalu lambat. Anda bisa menggunakan shred -v -n 1saja, itu cepat dan biasanya tersedia di mana saja.

frostschutz
sumber
21

Ok, Anda bilang halaman manual tidak detail, jadi saya akan menjelaskan apa artinya dengan metafora yang mudah dipahami tentang seorang pria yang bergerak (ini namanya dd:)

   bs=BYTES
          read and write up to BYTES bytes at a time

ddmengambil sesuatu (kotak, vas, tempat tidur, beras, dll.), pindah ke tempat yang seharusnya dan jatuhkan. Sampai dia tidak menjatuhkan beban, dia tidak memilih apa pun. Sekarang, ketika Anda perlu memberi tahu dia dengan tepat berapa banyak objek yang harus ia pilih per perjalanan, inilah yang bsdilakukannya. Anda mengatur jumlah data yang akan dia baca dan tulis. Ini hampir wajib dalam semua perintah yang berguna dan umum.

   count=N
          copy only N input blocks

Ini menentukan jumlah total kotak yang akan ia pindahkan. Kotak dalam konteks ini adalah blok pada disk . Anda memintanya untuk memindahkan 5 kotak, dia hanya memindahkan 5 kotak bahkan jika ada lebih dari 5 kotak (jika ada kurang dari 5 kotak, dia akan mengambil vas yang dia temukan di samping kotak untuk menambahkannya). Jika Anda memberitahu dduntuk counthanya 5, dan menulis di suatu tempat, ia akan menyalin pertama 5 blok ia melihat dan menulis mereka di mana Anda inginkan.

   seek=N skip N obs-sized blocks at start of output

Orang itu biasanya menemukan tempat pertama yang tersedia untuk menjatuhkan beban, ini biasanya di awal (dari disk), dan terus mengisi hingga akhir. Nah, dengan ini Anda mengatakan dduntuk memulai lebih jauh, katakanlah bukannya aula, mulailah di salah satu kamar lebih jauh di dalam. Itu hanya "melewati" blok awal.

Sekarang, tergantung apa yang Anda lakukan, Anda akan memerlukan kombinasi berbeda berdasarkan sumber dan tujuan, bersama dengan format mereka akan dibaca dan ditulis. Saya sarankan Anda untuk mencari mereka yang terpisah.

Braiam
sumber
"Dia akan mengambil vas yang dia temukan di samping kotak untuk menambahkannya". Apa arti kiasan ini?
Ini
1
@Ini Bahwa jika ada blok yang berdekatan yang bukan milik if read, dd akan membacanya dan memindahkannya juga. Vas bukan kotak, namun dd memindahkannya.
Braiam