Cosa fa `dd if = / dev / zero of = / dev / sda`


19

Modificato: non eseguirlo per testarlo a meno che non si desideri distruggere i dati.

Qualcuno potrebbe aiutarmi a capire cosa ho ottenuto?

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

    Q: Perché specificamente 4096 per count?

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

    D: Cosa fa esattamente questo?


4
Dove hai trovato questo codice dannoso
Suici Doga,

10
Questo non è un codice dannoso.
Michael Hampton,

12
@MichaelHampton: s / dannoso / distruttivo / Mentre pubblicare codice distruttivo non è di per sé dannoso, pubblicarlo senza un chiaro avviso che può distruggere i dati IS.
Ben Voigt,

1
È meglio pensare a DD come "Disk Destroyer" quando qualcuno su Internet ti dice di eseguire un comando come questo.
Bobby Sacamano,

3
in realtà DD significa descrizione dei dati
Suici Doga

Risposte:


43

dd if = / dev / zero of = / dev / sda bs = 4096 conteggio = 4096 D: perché 4096 è particolarmente usato per il contatore?

Questo azzererà i primi 16 MiB dell'unità. 16 MiB è probabilmente più che sufficiente per annusare qualsiasi struttura di "avvio del disco" pur essendo abbastanza piccola da non richiedere molto tempo.

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

D: Cosa significa esattamente?

blockdev --getszottiene la dimensione del dispositivo a blocchi in "settori a 512 byte". Quindi questo comando sembra destinato a azzerare gli ultimi 2 MiB dell'unità.

Sfortunatamente questo comando è sintattico non corretto. Mi aspetto che il comando fosse originariamente previsto

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

e i backtick si sono persi da qualche parte lungo la fila di persone che lo copiano / incollano tra ambienti diversi.

Le vecchie tabelle delle partizioni, i metadati LVM, i metadati del raid ecc. Possono causare problemi durante il riutilizzo di un'unità. L'azzeramento delle sezioni all'inizio e alla fine dell'unità generalmente eviterà questi problemi pur essendo molto più veloce dell'azzeramento dell'intera unità.


4
Grazie. Questa risposta sembra incontrare di più per quello che stavo cercando. I due comandi vengono utilizzati dopo delpart. Sono utilizzati per cancellare un disco per riutilizzarlo come pulito.
JH,

expr blockdev --getsz /dev/sda - 4096sarebbe un errore di sintassi di expr. Penso che il comando previsto fosse ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". O meglio:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas l'

1
La mia ipotesi sarebbe che originariamente ci fossero delle levette nel comando e che ad un certo punto furono mangiate.
lavaggio:

16

Questo cancellerà il primo 4096*4096=16MBe l'ultimo 512*4096=2MBdisco rigido, che contengono importanti strutture utili per il recupero. Presumo che questo codice sia stato pubblicato in modo dannoso.

Non ho mai incontrato una situazione in cui specificare esplicitamente un countaltro che 1fosse utile. Io ho cancellato il primo blocco se volevo per garantire non mi lasciare tracce del dietro MBR ...


8
Questo non è necessariamente dannoso, ho avuto alcuni cattivi programmi di formattazione che si rifiutano di scrivere una nuova etichetta se quella attuale è danneggiata e quindi ho dovuto azzerare manualmente i primi byte in questo modo.
Shelvacu,

1
@shelvacu Sarei sorpreso se il drive manipolato in questo modo fosse sda. Più probabile sdbo sdc. Ma potrei sbagliarmi, naturalmente ...
yo'

7
Questo non è malevolo. Cancella il GPT all'inizio del disco e il GPT di backup alla fine del disco.
Michael Hampton,

2
@shelvacu: è distruttivo. Se i comandi distruttivi sono stati pubblicati senza una spiegazione di ciò che fa, è dannoso. Se fossero accompagnati da una spiegazione, perché OP lo sta chiedendo qui?
Ben Voigt,

2
Quindi chi, nella sua mente perfetta, copia / incolla i codici trovati ovunque senza conoscerne lo scopo? Non dannoso perché non agiterò alcun dispositivo strano che potrei trovare in metropolitana.
Magno C,

4

Questi comandi sovrascriveranno il dispositivo sda con zero: il primo eseguirà i primi 16 MB (dimensione del blocco di 4096 e conteggio di 4096 blocchi) e il secondo sovrascriverà gli ultimi 2 MB (dimensione del blocco di 512 con 4096 blocchi) con zero. (non sta tecnicamente cancellando, e ciò si riferisce al mio primo punto di seguito).

(quella era la parte già menzionata in altre risposte, inclusa qui per completezza)

Un'altra cosa che vale la pena ricordare è che la dimensione del blocco ha effetti, ma quelli sono generalmente visti solo su operazioni ad alto volume. Il modo più efficiente (più veloce) per eseguire il comando è se la dimensione del blocco del comando corrisponde alla dimensione di accesso del dispositivo, altrimenti si perde tempo.

Se sei interessato, puoi provare a creare un file con un milione di blocchi di 1 blocco e un file con 1 milione di blocchi di blocchi e vedere la differenza:

[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

Come puoi vedere, il blocco ha un impatto enorme sull'efficienza. Questa è forse una barra laterale dell'OP, ma ritengo che sia ancora pertinente.

TL; DR: non eseguire codice arbitrario che trovi in ​​rete o che ti dà qualcuno di cui non ti fidi. Ti rovinerà la giornata.


7
+1 per la Don't execute arbitrary code you find on the netlinea
Sergiy Kolodyazhnyy

7
"Si noti che questo processo è estremamente noioso e / o costoso e richiede attrezzature estremamente specifiche." Smetti di diffondere questa disinformazione. L'ultima volta che ciò è stato anche teoricamente possibile è stato decenni fa sulla tecnologia che è ormai obsoleta da molte generazioni. Nessuno ha mai dimostrato questo tipo di recupero su unità moderne, anche in risposta a sfide pubbliche con premi in denaro, ad esempio hostjury.com/blog/view/195/…
Andrew Medico

Ho rimosso quella sezione - suppongo sia passato un po 'di tempo da quando ne ho sentito parlare per la prima volta. Dirò comunque che "teoricamente" era la parola chiave, ma sto divagando.
Tim S.

2

Altri hanno spiegato cosa fanno, quindi lo salterò.

Il punto ddnell'avere separato bse countargomento è che bscontrolla quanto viene scritto alla volta . Specificare valori veramente grandi per bsrichiederà un buffer molto grande nel programma e specificare valori inferiori alla dimensione del blocco del dispositivo sarà lento perché il kernel deve costruire un intero blocco per scrivere sul dispositivo (in casi come questo può probabilmente bufferare le scritture fino a quando non c'è un blocco completo, in altri casi potrebbe essere necessario leggere ciò che è già sul disco). Dato che i due comandi usano valori diversi per bs, questo mi porta a pensare che potresti averli trovati su due siti diversi. I dischi rigidi avevano una dimensione del blocco di 512 byte, corrispondente albs=512di quest'ultimo comando, ma alcuni (6-8 credo) anni fa hanno iniziato a creare dischi con una dimensione di blocco di 4096 byte, facendo bs=4096una scelta migliore per i dischi moderni.


1
Il punto debole per bsè molto più alto di quello . Un singolo comando SATA può leggere o scrivere più settori, quindi il kernel unisce gli I / O prima di inviarli. Ovunque da bs=64ka bs=1024kè ragionevole (la dimensione della cache L3 è spesso 4-8 MiB). Uso spesso bs=128k, che è la metà della dimensione della cache L2 su moderne CPU Intel. ( ddinclude due operazioni memcpy: in read(2)from the source (anche se è / dev / zero), e write(2). IIRC, sddavevano un'opzione per scrivere zeri, che risparmierebbe un po 'di tempo alla CPU. Veramente rilevante solo se la destinazione è qualcosa diverso da un disco).
Peter Cordes,

Per vedere l'unione delle richieste di I / O in corso, guarda l'output di iostat -x 4o qualcosa del genere e osserva le colonne rrqm / s (richieste di lettura unite al secondo) e wrqm / s.
Peter Cordes,

1

ATTENZIONE: dd if=/dev/zero of=/dev/ viene utilizzato per pulire un'unità o un dispositivo prima di copiare i dati in modo legale. L'unità o il dispositivo deve essere sempre disinfettato prima di copiare le informazioni da un sistema sotto indagine forense per mitigare la contaminazione incrociata. Pertanto, non è un cattivo comando, l'utente finale deve capire a cosa serve o distruggerà i propri dati. Se questo è ciò che desideri, verifica l'operazione di scrittura zero dd if=/dev/sda | hexdump -C | head.

Fonte: una guida pratica alle indagini di informatica forense del dott. Darren Hayes


1

Uso dd if=/dev/zero of=/dev/sdX oflag=syncper testare la qualità di un'unità USB inserita o di una scheda MicroSD PRIMA di utilizzarla con gparted, fdisk o dd con un'immagine del disco. Penso che questa sia un'idea prudente, soprattutto con i supporti MicroSD che hanno una storia di scarsa qualità.

Ovviamente, stai attento con of = sdX perché non c'è perdono con una cancellazione accidentale del disco. Verificare che X = lettera di unità del target previsto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.