Czy to polecenie: dd if=/dev/zero of=/dev/sda bs=1M
powiedzie się, jeśli polecenie dd było pierwotnie w katalogu / dev / sda? Czy to się skończy, ponieważ dd jest wtedy w pamięci?
10
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.
źródło
Ze
mmap
strony w systemie Linux:Pliki wykonywalne są mapowane do pamięci przez jądro poprzez wewnętrzne wywołanie
mmap
funkcji. WymaganeMAP_PRIVATE
jest mapowanie typów (zajrzyjfs/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.źródło
Tak. Oczywiście będzie to również kosztowało większość twojego systemu plików, ale prawdopodobnie już wiesz, że ...
źródło
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.
źródło
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.
źródło