Co się stanie, jeśli dodam zera do dysku, na którym znajduje się dd?

10

Czy to polecenie: dd if=/dev/zero of=/dev/sda bs=1Mpowiedzie się, jeśli polecenie dd było pierwotnie w katalogu / dev / sda? Czy to się skończy, ponieważ dd jest wtedy w pamięci?

agz
źródło

Odpowiedzi:

40

Mogą się zdarzyć trzy rzeczy:

  1. Polecenie uruchamia się, działa do zakończenia i następuje powrót do monitu. Ponieważ dysk jest skutecznie wyczyszczony, nie możesz już wiele z tego zrobić, chociaż możesz mieć szczęście dzięki niektórym poleceniom wbudowanym w powłokę.
  2. Komenda się rozpoczyna. W pewnym momencie zostaje wywołane z powodu presji pamięci. Zwykle nie stanowi to problemu, ponieważ jego części można po prostu ponownie załadować z dysku (niezmienione dane) z wymiany. Jeśli jednak właśnie je wyczyścisz, polecenie dd częściowo się nie powiedzie podczas zapełniania dysku.
  3. Trzecia opcja to coś z BSD. MBR na zamontowanym dysku jest chroniony przed nadpisaniem. Nawet jeśli uruchomisz polecenie jako root. Istnieją dziesiątki dystrybucji Linuksa, wszystkie są nieco inne. Jest całkiem możliwe, że niektóre z nich naśladują to.


Do tej pory dla teorii. Teraz praktyczny test.

Zainstalowałem świeżego Ubuntu 12.10 na maszynie wirtualnej. (Stacja robocza VMware na Win7-x64, z domyślnymi opcjami i dyskiem wirtualnym 10 GB).

Polecenie dd zakończyło się pomyślnie i zostałem cofnięty po tym, co wydawało się działającym monitem. Mógłbym wprowadzać nowe polecenia, choć z oczywistych powodów zawiodłyby.

Zrzut ekranu maszyny Wirtualnej Ubuntu po wyczyszczeniu dysku

Hennes
źródło
9
Duża +1 za test praktyczny!
Doug Harris
10
Widzę Segmentation faulti twierdzisz, że zakończyło się pomyślnie ...?
Alvin Wong
1
Zawsze. Sprawiło, że dysk był nieczytelny. Myślę, że to był cel. W celu bezpiecznego wymazywania naprawdę powinieneś spróbować czegoś innego (na przykład polecenia bezpiecznego wymazywania).
Hennes
jedna z najlepszych odpowiedzi, jakie kiedykolwiek otrzymałem. Dzięki!
agz
6

Szybki eksperyment na maszynie wirtualnej przy użyciu Damn Small Linux wskazuje, że polecenie dd rzeczywiście zostało wykonane zgodnie z oczekiwaniami; program jest początkowo ładowany do pamięci w celu uruchomienia i nie ma większego sensu ładowanie pliku wykonywalnego wielokrotnie podczas procesu. Ostatecznie dd zakończy działanie i zgłosi „brak miejsca na urządzeniu”.

Potem system operacyjny wydaje się normalnie funkcjonować na pierwszy rzut oka, ale zawiesza się po pierwszym poleceniu, nie może już wykonać z oczywistych powodów i przestaje odpowiadać. Krótka kontrola zawartości dysku twardego pokazuje, że partycja rzeczywiście została wyzerowana.

Marcks Thomas
źródło
4

Ze mmapstrony w systemie Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Pliki wykonywalne są mapowane do pamięci przez jądro poprzez wewnętrzne wywołanie mmapfunkcji. Wymagane MAP_PRIVATEjest mapowanie typów (zajrzyj fs/binfmt_elf.cdo drzewa źródeł jądra).

Sprowadza się to zatem do zachowania mmap: czy zmiany w pliku lub leżące u jego podstaw urządzenie blokowe, do którego odwołuje się ten plik, są propagowane z powrotem na strony mapowania, które zostały już stronicowane i są obecne.

Ta strona jest oparta na standardach API, a nie na zachowaniu jądra, stąd „nieokreślony”. Rzeczywiste zachowanie polega na tym, że zmiany w pliku nie są propagowane z powrotem na już obecne strony. Oczywiście, jeśli program nagle przeskoczy na stronę kodu, która nie była stronicowana, a usuwanie już miało miejsce, wówczas otrzyma stronę ze wszystkimi zerami.

Ale najprawdopodobniej, zanim ddsam się wymazuje, stronicuje na wszystkich stronach kodu, których potrzebuje, aby kontynuować pętlę kasowania. Istnieje możliwość, że gdy pętla się zakończy, może natrafić na kod, który znajduje się na nieobecnej stronie: powiedzmy, że funkcja rozciąga się poza granicę strony, więc aby dotrzeć do instrukcji return, strona musi zostać pobrana.

Ale ta strona może być również buforowana z poprzedniego ddwywołania.

Kaz
źródło
1

Tak. Oczywiście będzie to również kosztowało większość twojego systemu plików, ale prawdopodobnie już wiesz, że ...

Aaron Miller
źródło
0

Ostatnio popełniłem błąd. Zamierzałem dodać 2 GB obrazu na kartę SD, ale przez pomyłkę to zrobiłem dd if=rasberrypi.img of=/dev/sda. Zrozumiałem mój błąd i anulowałem dd, ale do tego czasu zapisano ~ 600 MB (na dysku z użytym ~ 500 GB). Tabela partycji została zniszczona.

Pulpit (z pamięcią 10 GB i tygodniami) działał przez kilka godzin, jeśli nic się nie wydarzyło. Udało się, aby ostatnio zmienić ważne pliki w Dropbox, normalnie przeglądane w chrome. W rzeczywistości mogłem uruchomić dd na kartę SD, tak jak pierwotnie chciałem, działał dobrze.

Po kilku godzinach mój system plików przeszedł w tryb tylko do odczytu i losowe programy zaczęły umierać. Zostałem wpuszczony do wielu innych systemów, mogłem nadal korzystać z tych sesji, ale tworzenie nowej sesji dało błąd, że nie mogę znaleźć programu ssh. W tej chwili mogłem przełączać otwarte karty w chromie, ale zawartość kart wydaje się „zawieszona”. Jeśli się odświeżę, na zawsze otrzymam biały ekran. rsyslogd z jakiegoś powodu pobierał 100% procesora (1 rdzeń), prawdopodobnie było zdezorientowane, dlaczego nie mogło opróżnić logów na dysk ... może.

Miałem 350 MB filmu otwartego (i wstrzymanego) w VLC, nadal mogłem go odtworzyć i przejść do dowolnej części filmu. Prawdopodobnie od czasu ostatniego pobrania.

Mógłbym zamknąć system normalnie za pomocą GUI, bez błędów.

To nie odpowiada dokładnie na twoje pytanie, ale mówi, co się stanie, jeśli wyczyścisz początek dysku.

Większość rzeczy na dysku wciąż można odzyskać, ale nie będę się tym przejmować, ponieważ (mam nadzieję) wszystko, co jest dla mnie ważne, zostało zapisane.

sajal
źródło
-1

Najprawdopodobniej się nie zakończy, ponieważ jakiś inny wykonujący element zażąda brakującego pliku i spanikuje jądro. jeśli naprawdę chcesz wyzerować dysk, użyj płyty CD na żywo; w przeciwnym razie nigdy nie możesz zagwarantować wyniku.

Frank Thomas
źródło
2
Żądanie brakującego pliku nie spowoduje paniki w jądrze. Gdyby tak się stało, maszyny uległyby awarii, gdyby miały tylko jeden zawodny dysk.
David Schwartz
@DAvid Schwartz, gdyby tak było, wówczas #rm -rf / usunąłby cały system plików. Wiem z eksperymentów, że tak nie jest. system nie może długo działać całkowicie z pamięci RAM, chyba że zostanie zaimplementowana jakaś technologia ramdysku, co nie jest standardem.
Frank Thomas
@FrankThomas: Czy jądro wpadło w panikę?
David Schwartz
tak, wyłączenie czarnego ekranu.
Frank Thomas