Apa yang dilakukan `dd if = / dev / zero of = / dev / sda` lakukan

19

Diedit: jangan jalankan ini untuk mengujinya kecuali Anda ingin menghancurkan data.

Bisakah seseorang membantu saya memahami apa yang saya dapatkan?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    T: Mengapa khusus 4096 untuk count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    T: Apa sebenarnya yang dilakukan ini?

JH
sumber
4
Di mana Anda menemukan kode berbahaya ini
Suici Doga
10
Ini bukan kode berbahaya.
Michael Hampton
12
@MichaelHampton: s / malicious / destructive / Sementara memposting kode destruktif tidak jahat per se, mempostingnya tanpa peringatan yang jelas bahwa ia dapat menghancurkan data IS.
Ben Voigt
1
Lebih baik menganggap DD sebagai 'Penghancur Disk' ketika seseorang di internet memberi tahu Anda untuk menjalankan perintah seperti ini.
Bobby Sacamano
3
sebenarnya DD berarti deskripsi data
Suici Doga

Jawaban:

43

dd jika = / dev / nol = / dev / sda bs = 4096 count = 4096 T: mengapa 4096 terutama digunakan untuk penghitung?

Ini akan menghasilkan nol 16 MiB pertama dari drive. 16 MiB mungkin lebih dari cukup untuk mem-nuke setiap struktur "start of disk" sementara cukup kecil sehingga tidak akan memakan waktu lama.

dd jika = / dev / nol = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda - 4096)

T: Apa tepatnya ini?

blockdev --getszmendapatkan ukuran perangkat blok di "sektor 512 byte". Jadi perintah ini sepertinya ditujukan untuk menghilangkan 2 MiB terakhir dari drive.

Sayangnya perintah ini rusak karena sintaks. Saya berharap perintah itu semula dimaksudkan

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

dan backtick tersesat di suatu tempat sepanjang garis orang menyalin / menempel di antara lingkungan yang berbeda.

Tabel partisi lama, metadata LVM, metadata raid dll dapat menyebabkan masalah saat menggunakan kembali drive. Bagian zeroing out di awal dan akhir drive umumnya akan menghindari masalah ini sementara menjadi jauh lebih cepat daripada memusatkan seluruh drive.

plugwash
sumber
4
Terima kasih. Jawaban ini sepertinya paling cocok untuk apa yang saya cari. Dua perintah digunakan setelah delpart. Mereka digunakan untuk menyeka disk untuk digunakan kembali sebagai bersih.
JH
expr blockdev --getsz /dev/sda - 4096akan menjadi kesalahan sintaksis dari expr. Saya pikir perintah yang dimaksudkan adalah ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Atau lebih baik:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas
1
Dugaan saya adalah bahwa pada awalnya ada backtick dalam perintah dan mereka dimakan pada beberapa titik.
plugwash
16

Ini akan menghapus hard drive pertama 4096*4096=16MBdan terakhir 512*4096=2MBAnda, yang berisi struktur penting yang berguna untuk pemulihan. Saya menganggap kode ini diposting dengan jahat.

Saya tidak pernah menemukan situasi di mana secara eksplisit menentukan countselain 1itu bermanfaat. Saya telah menghapus blok pertama jika saya ingin memastikan saya tidak meninggalkan jejak MBR di belakang ...

o11c
sumber
8
Ini tidak berbahaya, saya punya beberapa program format buruk yang menolak untuk menulis label baru jika yang sekarang rusak, dan harus secara manual nol beberapa byte pertama seperti ini.
Shelvacu
1
@shelvacu saya akan terkejut jika drive dimanipulasi dengan cara ini sda. Lebih mungkin sdbatau sdc. Tapi saya mungkin salah tentu saja ...
yo '
7
Ini tidak berbahaya. Itu menghapus GPT di awal disk dan GPT cadangan di akhir disk.
Michael Hampton
2
@shelvacu: Ini destruktif. Jika perintah yang merusak diposting tanpa penjelasan tentang apa yang dilakukannya, itu berbahaya. Jika mereka disertai dengan penjelasan, mengapa OP menanyakannya di sini?
Ben Voigt
2
Jadi siapa, dalam pikirannya yang sempurna, akan menyalin / menempel kode yang ditemukan di mana saja tanpa mengetahui tujuannya? Tidak berbahaya karena saya tidak akan menggoyangkan perangkat aneh yang saya temukan di kereta bawah tanah.
Magno C
4

Perintah-perintah itu akan menimpa perangkat sda Anda dengan nol - yang pertama akan melakukan 16MB pertama (ukuran blok 4096 dan jumlah 4096 blok) dan yang ke-2 akan menimpa 2MB terakhir (ukuran blok 512 dengan 4096 blok) dengan nol. (itu tidak secara teknis menghapus, dan itu berkaitan dengan poin pertama saya di bawah ini.)

(itu adalah bagian yang sudah disebutkan dalam jawaban lain, termasuk di sini untuk kelengkapan)

Hal lain yang layak disebutkan adalah bahwa ukuran blok memang memiliki efek, tetapi yang umumnya hanya terlihat pada operasi volume tinggi. Cara paling efisien (tercepat) untuk menjalankan perintah adalah jika ukuran blok perintah cocok dengan ukuran akses perangkat, jika tidak maka waktu akan terbuang sia-sia.

Jika Anda tertarik, Anda dapat mencoba membuat file dengan sejuta potongan 1 blok, dan file dengan 1 juta potongan blok dan melihat perbedaannya:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

Seperti yang Anda lihat, blocksize memiliki dampak besar pada efisiensi. Itu mungkin sidebar untuk OP, tetapi saya merasa itu masih relevan.

TL; DR: Jangan jalankan kode arbitrer yang Anda temukan di internet, atau seseorang yang tidak Anda percayai memberi Anda. Itu akan merusak harimu.

Tim S.
sumber
7
+1 untuk Don't execute arbitrary code you find on the netsaluran
Sergiy Kolodyazhnyy
7
"Perhatikan bahwa proses ini sangat membosankan dan / atau mahal dan membutuhkan peralatan yang sangat spesifik." Berhenti menyebarkan informasi yang salah ini. Terakhir kali ini secara teori bahkan mungkin adalah beberapa dekade yang lalu pada teknologi yang banyak generasi sudah usang sekarang. Tidak ada yang pernah menunjukkan pemulihan seperti ini pada drive modern, bahkan dalam menanggapi tantangan publik dengan hadiah uang, misalnya hostjury.com/blog/view/195/…
Andrew Medico
Saya menghapus bagian itu - kira sudah lama sejak saya pertama kali mendengar tentang itu. Namun saya akan mengatakan, bahwa "secara teoritis" adalah kata yang berlaku, tetapi saya ngelantur.
Tim S.
2

Yang lain telah menjelaskan apa yang mereka lakukan, jadi saya akan lewati itu.

Maksud dari ddpemisahan bsdan countargumen adalah bsmengontrol berapa banyak yang ditulis pada satu waktu . Menentukan nilai yang sangat besar untuk bsakan membutuhkan buffer yang sangat besar dalam program ini, dan menentukan nilai yang kurang dari ukuran blok perangkat akan lambat karena kernel harus membangun seluruh blok untuk menulis ke perangkat (dalam kasus seperti ini ia dapat mungkin buffer menulis hingga ada blok lengkap, dalam kasus lain mungkin harus membaca apa yang sudah ada di disk). Karena kedua perintah menggunakan nilai yang berbeda untuk bs, itu membuat saya berpikir bahwa Anda mungkin menemukannya di dua situs yang berbeda. Hard disk dulu memiliki ukuran blok 512 byte, sesuai denganbs=512dari perintah terakhir, tetapi beberapa (6-8 saya pikir) tahun yang lalu mereka mulai membuat cakram dengan ukuran blok 4096 byte, membuat bs=4096pilihan yang lebih baik untuk cakram modern.

Henrik - berhenti menyakiti Monica
sumber
1
Sweet spot untuk bsjauh lebih tinggi dari itu . Satu perintah SATA dapat membaca atau menulis banyak sektor, sehingga kernel menggabungkan I / Os sebelum mengirimkannya. Di mana saja dari bs=64kke bs=1024kwajar (ukuran cache L3 sering 4-8MiB). Saya sering menggunakan bs=128k, yang merupakan setengah dari ukuran cache L2 pada CPU Intel modern. ( ddtermasuk dua operasi memcpy: dalam read(2)dari sumber (bahkan jika / dev / nol), dan write(2). IIRC, sddmemiliki opsi untuk menulis nol, yang akan menghemat sedikit waktu CPU. Benar-benar hanya relevan jika tujuannya adalah sesuatu selain disk).
Peter Cordes
Untuk melihat permintaan I / O penggabungan terjadi, lihat output iostat -x 4atau sesuatu, dan catat rrqm / s (baca-permintaan digabung per detik) dan kolom wrqm / s.
Peter Cordes
1

PERINGATAN: dd if=/dev/zero of=/dev/ digunakan untuk membersihkan drive atau perangkat sebelum menyalin data secara forensik. Drive atau perangkat harus selalu disanitasi sebelum menyalin informasi dari sistem yang sedang diselidiki forensik untuk mengurangi kontaminasi silang. Oleh karena itu, ini bukan perintah yang buruk, pengguna akhir harus memahami untuk apa ia digunakan atau mereka akan menghancurkan data mereka. Jika ini yang Anda inginkan maka lakukan verifikasi operasi tulis nol dd if=/dev/sda | hexdump -C | head.

Sumber: Panduan Praktis untuk Penyelidikan Forensik Komputer oleh Dr Darren Hayes

SierraJuliet
sumber
1

Saya gunakan dd if=/dev/zero of=/dev/sdX oflag=syncuntuk menguji kualitas USB drive atau kartu MicroSD yang dimasukkan SEBELUM saya benar-benar menggunakannya dengan gparted, fdisk, atau dd dengan disk image. Saya pikir ini adalah ide yang bijaksana, terutama dengan media MicroSD yang memiliki sejarah kualitas yang buruk.

Tentu saja, berhati-hatilah dengan = sdX karena tidak ada pengampunan dengan penghapusan disk yang tidak disengaja. Verifikasi bahwa X = huruf drive dari target yang dituju.

Richard
sumber