Co robi `dd if = / dev / zero of = / dev / sda`


19

Edytowane: nie uruchamiaj tego, aby go przetestować, chyba że chcesz zniszczyć dane.

Czy ktoś mógłby mi pomóc zrozumieć, co mam?

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

    P: Dlaczego konkretnie 4096 count?

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

    P: Co to dokładnie robi?


4
Gdzie znalazłeś ten złośliwy kod
Suici Doga,

10
To nie jest złośliwy kod.
Michael Hampton,

12
@MichaelHampton: s / złośliwy / destrukcyjny / Chociaż publikowanie destrukcyjnego kodu nie jest samo w sobie złośliwe, publikowanie go bez wyraźnego ostrzeżenia, że ​​może zniszczyć dane IS.
Ben Voigt,

1
Najlepiej jest myśleć o DD jako „Disk Destroyer”, gdy ktoś w Internecie każe ci wykonać takie polecenie.
Bobby Sacamano,

3
właściwie DD oznacza opis danych
Suici Doga,

Odpowiedzi:


43

dd if = / dev / zero of = / dev / sda bs = 4096 count = 4096 P: dlaczego 4096 jest szczególnie używany do licznika?

Spowoduje to wyzerowanie pierwszych 16 MiB napędu. 16 MiB jest prawdopodobnie więcej niż wystarczający, aby zniszczyć wszelkie struktury „początku dysku”, a jednocześnie jest na tyle mały, że nie zajmie to dużo czasu.

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

P: Co to dokładnie robi?

blockdev --getszpobiera rozmiar urządzenia blokowego w „sektorach 512-bajtowych”. To polecenie wygląda więc tak, jakby miało na celu wyzerowanie ostatnich 2 MB dysku.

Niestety, to polecenie nie działa poprawnie pod względem składni. Spodziewam się, że polecenie było pierwotnie przeznaczone

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

a backticks zgubiły się gdzieś na linii ludzi kopiujących / wklejających je między różnymi środowiskami.

Stare tabele partycji, metadane LVM, metadane rajdowe itp. Mogą powodować problemy przy ponownym użyciu dysku. Zerowanie sekcji na początku i na końcu dysku pozwoli na ogół uniknąć tych problemów, a jednocześnie będzie znacznie szybsze niż zerowanie całego dysku.


4
Dziękuję Ci. Ta odpowiedź wydaje się najbardziej odpowiadać temu, czego szukałam. Oba polecenia są używane po delpart. Służą do wycierania dysku do ponownego użycia jako czyste.
JH

expr blockdev --getsz /dev/sda - 4096byłby błąd składniowy expr. Myślę, że zamierzonym poleceniem było ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Lub lepiej:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas

1
Domyślam się, że w poleceniu istniały backtyki, które w pewnym momencie zostały zjedzone.
płyn do płukania

16

Spowoduje to usunięcie pierwszego 4096*4096=16MBi ostatniego 512*4096=2MBdysku twardego, które zawierają ważne struktury przydatne do odzyskiwania. Zakładam, że ten kod został złośliwie opublikowany.

Nigdy nie spotkałem się z sytuacją, w której wyraźne określenie countinnego niż 1było przydatne. I zostały usunięte pierwszy blok gdybym chciał upewnić się, że nie zostawiając żadnych śladów pupę MBR ...


8
Nie jest to szczególnie złośliwe, miałem kilka złych programów do formatowania, które odmawiają napisania nowej etykiety, jeśli bieżąca jest uszkodzona, więc musiałem ręcznie wyzerować kilka pierwszych takich bajtów.
Shelvacu,

1
@shelvacu Byłbym zaskoczony, gdyby dysk był manipulowany w ten sposób sda. Bardziej prawdopodobne sdblub sdc. Ale oczywiście mogę się mylić ...
yo '

7
To nie jest złośliwe. Usuwa GPT na początku dysku i zapasowy GPT na końcu dysku.
Michael Hampton,

2
@shelvacu: To destrukcyjne. Jeśli destrukcyjne polecenia zostały opublikowane bez wyjaśnienia, co robi, jest złośliwe. Jeśli towarzyszy im wyjaśnienie, dlaczego OP pyta o to tutaj?
Ben Voigt,

2
Kto więc, w doskonałym umyśle, skopiuje / wklei kody znalezione gdziekolwiek, nie znając jego celu? Nie jest złośliwy, ponieważ nie potrząsnę żadnym dziwnym urządzeniem, które mogę znaleźć w metrze.
Magno C

4

Te polecenia zastąpią twoje urządzenie sda ​​zerami - pierwsze zrobi pierwsze 16 MB (rozmiar bloku 4096 i liczba 4096 bloków), a drugie zastąpi ostatnie 2 MB (rozmiar bloku 512 z 4096 bloków) zerami. (nie jest technicznie wymazywany, a to odnosi się do mojego pierwszego punktu poniżej).

(to była część wspomniana już w innych odpowiedziach, w tym tutaj dla kompletności)

Inną rzeczą, o której warto wspomnieć, jest to, że rozmiar bloku ma efekty, ale na ogół są one widoczne tylko w operacjach o dużej objętości. Najbardziej wydajnym (najszybszym) sposobem wykonania polecenia jest to, że rozmiar bloku polecenia odpowiada rozmiarowi dostępu do urządzenia, w przeciwnym razie marnuje się czas.

Jeśli jesteś zainteresowany, możesz spróbować utworzyć plik z milionem fragmentów 1-blokowych i plik z milionem fragmentów 1-blokowych i zobaczyć różnicę:

[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

Jak widać, wielkość bloku ma ogromny wpływ na wydajność. Być może jest to pasek boczny PO, ale wydaje mi się, że nadal jest istotny.

TL; DR: Nie wykonuj niepożądanego kodu, który znajdziesz w sieci, lub komuś, komu nie ufasz. Zrujnuje ci dzień.


7
+1 za Don't execute arbitrary code you find on the netlinię
Sergiy Kolodyazhnyy,

7
„Należy pamiętać, że ten proces jest niezwykle uciążliwy i / lub drogi i wymaga wyjątkowo specyficznego sprzętu.” Przestań rozpowszechniać tę dezinformację. Ostatni raz, gdy było to teoretycznie możliwe, było kilkadziesiąt lat temu w technologii, która od wielu pokoleń jest już przestarzała. Nikt nigdy nie zademonstrował tego rodzaju odzyskiwania na nowoczesnych dyskach, nawet w odpowiedzi na publiczne wyzwania związane z nagrodami pieniężnymi, np. Hostjury.com/blog/view/195/…
Andrew Medico

Usunąłem tę sekcję - myślę, że minęło trochę czasu, odkąd pierwszy raz o tym usłyszałem. Powiem jednak, że „teoretycznie” było słowem operatywnym, ale dygresuję.
Tim S.

2

Inni wyjaśnili, co robią, więc pominę to.

Chodzi ddo to, żeby mieć osobne argumenty bsi countto, że bskontroluje to, ile napisano na raz . Określenie naprawdę dużych wartości bsbędzie wymagało naprawdę dużego bufora w programie, a określenie wartości mniejszych niż rozmiar bloku urządzenia będzie wolne, ponieważ jądro musi zbudować cały blok, aby zapisać na urządzeniu (w takich przypadkach może to prawdopodobnie buforuje zapisy aż do uzyskania pełnego bloku, w innych przypadkach może być konieczne przeczytanie tego, co jest już na płycie). Ponieważ oba polecenia używają różnych wartości dla bs, prowadzi mnie to do wniosku, że mogłeś je znaleźć w dwóch różnych witrynach. Dyski twarde miały rozmiar bloku 512 bajtów, co odpowiadabs=512tego ostatniego polecenia, ale niektóre (chyba 6-8) lata temu zaczęły tworzyć dyski o rozmiarze bloku 4096 bajtów, co bs=4096stanowi lepszy wybór dla współczesnych dysków.


1
Sweet spot dla bsjest znacznie wyższy . Pojedyncza komenda SATA może odczytywać lub zapisywać wiele sektorów, więc jądro scala wejścia / wyjścia przed ich wysłaniem. Wszędzie od bs=64kcelu bs=1024kjest rozsądna (L3 cache size jest często 4-8MiB). Często używam bs=128k, co stanowi połowę wielkości pamięci podręcznej L2 w nowoczesnych procesorach Intela. ( ddobejmuje dwie operacje memcpy: w read(2)źródle (nawet jeśli jest to / dev / zero) i write(2). IIRC sddmiał opcję zapisywania zer, co pozwoliłoby zaoszczędzić trochę czasu procesora. Naprawdę istotne tylko, jeśli miejscem docelowym jest coś inny niż dysk).
Peter Cordes,

Aby zobaczyć iostat -x 4, jak dochodzi do scalania żądań we / wy, spójrz na dane wyjściowe lub coś i zanotuj kolumny rrqm / s (żądania odczytu scalone na sekundę) i wrqm / s.
Peter Cordes,

1

OSTRZEŻENIE: dd if=/dev/zero of=/dev/ służy do czyszczenia dysku lub urządzenia przed kopiowaniem danych przez sąd. Napęd lub urządzenie należy zawsze zdezynfekować przed skopiowaniem informacji z systemu objętego dochodzeniem, aby ograniczyć zanieczyszczenie krzyżowe. Dlatego nie jest to złe polecenie, użytkownik końcowy musi zrozumieć, do czego jest używany, w przeciwnym razie zniszczy swoje dane. Jeśli tego właśnie chcesz, to wykonaj operację zerowania zapisu dd if=/dev/sda | hexdump -C | head.

Źródło: Praktyczny przewodnik po komputerowych badaniach kryminalistycznych autorstwa dr Darrena Hayesa


1

Używam dd if=/dev/zero of=/dev/sdX oflag=syncdo testowania jakości włożonego napędu USB lub karty MicroSD PRZED faktycznym użyciem go z gparted, fdisk lub dd z obrazem dysku. Myślę, że jest to rozsądny pomysł, szczególnie w przypadku nośników MicroSD o niskiej jakości.

Oczywiście uważaj na = sdX, ponieważ nie ma wybaczenia przy przypadkowym wyczyszczeniu dysku. Sprawdź, czy X = litera dysku docelowego celu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.