Odpowiedzi:
Mogą się zdarzyć trzy rzeczy:
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.
Segmentation fault
i twierdzisz, że zakończyło się pomyślnie ...?
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.
Ze mmap
strony 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 mmap
funkcji. Wymagane MAP_PRIVATE
jest mapowanie typów (zajrzyj fs/binfmt_elf.c
do 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 dd
sam 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 dd
wywołania.
Tak. Oczywiście będzie to również kosztowało większość twojego systemu plików, ale prawdopodobnie już wiesz, że ...
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.
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.