Może dd zastąpić sąsiednie partycje

15

By

dd if=/dev/zero of=somepartition bs=512

czy wyczyścić partycje po somepartitionlub zatrzymać na końcu somepartition?

LogicBreaker
źródło
5
Zablokuj urządzenia reprezentujące partycje, np. /dev/sda1Są tworzone przez jądro w taki sposób, że nie można uzyskać dostępu do sąsiedniej pamięci przez nie (zakładając, że tablica partycji nie została zmieniona po ostatnim czytaniu przez jądro). Jeśli w ten sposób uzyskasz dostęp do sąsiedniego magazynu, będzie to uważane za ogromny błąd.
David Foerster,

Odpowiedzi:

18

Nadpisz partycję za pomocą dd

ddjest bardzo potężnym, ale także niebezpiecznym narzędziem. Robi to, co mu każesz, bez pytań. Więc jeśli powiesz mu, żeby wyczyściło zdjęcia rodzinne, ... a to pomniejszy błąd w pisaniu.

Ale jeśli sprawdzisz i sprawdzisz dwukrotnie, możesz go użyć.

dd if=/dev/zero of=somepartition bs=512

lub sugerowałbym

dd if=/dev/zero of=/dev/sdxn bs=4096

gdzie xjest literą dysku i nnumerem partycji, a rozmiar bloku 4096 bajtów przyspiesza proces zapisu.

W tym przypadku ważne jest zapisanie na partycji . Jeśli napiszesz na cały dysk (po stronie głowicy), /dev/sdxcały dysk zostanie zastąpiony. Ale zapis do partycji zostanie przerwany na końcu partycji, a partycje za nią zostaną zachowane. (Testowałem teraz na pendrive USB w Lubuntu 16.04 LTS, więc wiem, że tak to działa.)

Wyjątek dla partycji rozszerzonej

Istnieje wyjątek dla partycji rozszerzonej (która jest kontenerem dla partycji logicznych, aby mieć więcej niż cztery partycje w tabeli partycji MSDOS). Jest to opisane w poniższym linku,

Czy mogę zrobić obraz partycji „rozszerzonej” za pomocą dd?

Ale jest też inny problem. Przetestowałem twoje polecenie w środowisku testowym i dd odczytałem tylko jeden kibibajt (1024 bajty), kiedy chciałem, aby utworzył obraz partycji rozszerzonej.

Przetestowałem to również teraz na pendrive USB w Lubuntu 16.04 LTS, i dotyczy to pisania (jak również czytania). Tylko pierwszy kibibajt jest nadpisywany.

Podsumowując, nadpisywanie partycji podstawowych i partycji logicznych działa zgodnie z głównym opisem w tej odpowiedzi. Ale nie używaj tej metody do zastępowania rozszerzonej partycji, ponieważ tylko pierwszy kibibajt zostanie zastąpiony. Partycje logiczne partycji rozszerzonej nie będą już znajdować się w tabeli partycji, ale przechowywane w nich dane nadal tam są.

sudodus
źródło
Już zaakceptowałem, ale jeśli tak, to powinna być poprawna odpowiedź.
LogicBreaker
3
@LogicBreaker, Może możesz przenieść akceptację. Ale to nie jest ważne. Ważniejsze jest, abyś zrozumiał, jak używać ddi że jest to ryzykowne, abyś był bardzo ostrożny podczas jego używania. Powodzenia :-) Ogólnie powinieneś zawsze mieć kopię zapasową wszystkich plików, których nie możesz utracić.
sudodus
1
Pisząc do nagich partycji, nie masz wielu alternatyw. Przeprowadziłem się, w przeciwnym razie byłoby to mylące dla innych.
LogicBreaker
1
Dlatego użytkownicy zwykle nie mają dostępu do plików / dev / * „files”.
Thorbjørn Ravn Andersen
1
Jeśli jest to jedyna kopia twoich zdjęć rodzinnych bez kopii zapasowej, możesz stracić je w dowolnym momencie przez kradzież, pożar, wypadek lub zwykłą awarię sprzętu :-)
user334639,
4

Zapisuje na partycji urządzenie nie będzie zapisywać poza tą partycją, z dd lub czymkolwiek innym. Aby uzyskać jakikolwiek efekt poza jedną partycją, musisz użyć urządzenia z pełnym dyskiem.

(Uwaga: chyba że twój dysk ma tablicę partycji z nakładającymi się partycjami, co nigdy nie powinno się zdarzyć).

Hobbs
źródło
3
Kolejne zastrzeżenie: jeśli używasz czegoś takiego jak LVM, pisanie na wolumin fizyczny może oczywiście wpływać na wiele woluminów logicznych.
Maks.
4

Myślę, że twoje pytanie opiera się na fundamentalnym nieporozumieniu na temat tego, jak dd(a właściwie w ogóle systemy operacyjne uniksopodobne) działają:

ddnie można nadpisać sąsiednich partycji, po prostu dlatego, że ddnie można nadpisać partycji, kropka .

ddpo prostu zapisuje do plików . Otóż ​​to.

Teraz, jeśli masz przekazać ddplik, który reprezentuje wiele partycji, a następnie ddnadpisuje ten plik . Ale w takim przypadku nie ddpisze się poza końcem partycji. ddnadal będzie zapisywać do końca pliku i tylko do końca pliku.

Ale jeśli prześlesz ddplik, który reprezentuje tylko jedną partycję, ddnie zapisuje się poza końcem tej partycji. Ponownie nie ma to nic wspólnego dd. ddpo prostu zapisuje do pliku, do którego chcesz go zapisać. Fakt, że ten plik reprezentuje pojedynczą partycję jest (w tym przypadku) zapewniony przez sterownik urządzenia blokowego w jądrze. ddnie ma z tym nic wspólnego.

W skrócie: ddzapisuje do plików. To, co reprezentują te pliki, nie stanowi ddproblemu. ddnic nie wie o partycjach.

Jörg W Mittag
źródło
Mmm ... z dd tylko do zapisu do plików, nie można go używać do zapisywania na surowych partycjach.
LogicBreaker
1
Poprawny. Nie można używać dddo zapisywania na surowych partycjach. Możesz pisać tylko do plików. Ty można oczywiście zapisać do pliku urządzenia blokowego, który stanowi przegrodę (takich jak /dev/sda1), ale nie można napisać do surowego partycji. A ponieważ możesz zapisywać tylko do pliku reprezentującego partycję, nie możesz zapisywać poza końcem partycji, ponieważ plik reprezentuje tylko partycję, a nie partycję i nieco za nią.
Jörg W Mittag
3
Jorg odnosi się do jednej z głównych idei filozofii Uniksa - „wszystko jest plikiem”. Jako takie, jądro prezentuje pliki, urządzenia, porty itp. Jako pliki. W rezultacie każdy program, który może zapisywać do pliku, może być używany do zapisu na partycji lub urządzeniu. Jądro wymusza granice partycji. Możesz otworzyć /dev/sdaw edytorze tekstu i zmienić dane, ddnie różni się od żadnego innego programu pod względem dostępu do partycji. Bardzo dobra odpowiedź!
Sergey
1

Istnieje niebezpieczny, ale rzadki specjalny scenariusz, w którym może się to zdarzyć nawet w przypadku niezablokowanych sterowników urządzeń blokowych:

  • Tabela partycji na dysku jest zmieniana w taki sposób, że zmiana rozmiaru partycji x kończy się na dolnej granicy niż wcześniej. Albo partycja y za nią ma rozmiar górnego początku na dolnej granicy lub nowa partycja y jest dodawana do przestrzeni.
  • Partycja y jest wypełniona odpowiednimi danymi w sposób niezależny od tablicy partycji, np. Za pomocą dd z opcjami pomijania / zliczania na urządzeniu blokowym całego dysku (np. / Dev / sda)
  • Ioctl, który każe jądru ponownie przeczytać tablicę partycji, nie jest wydawany lub kończy się niepowodzeniem z powodu zajętych urządzeń
  • Partycja x jest zapisywana przez dowolny proces, który próbuje na niej zapisać, dopóki nie napotka warunku błędu.
rackandboneman
źródło
0

Musisz być ostrożny z dd, jakbyś popełnił błąd, możesz nadpisać więcej, niż się spodziewałeś, i zależy to od tego, do czego używasz dd (OP był niejasny w jego użyciu dd i dokładnej składni dd Komenda).

Jeśli określisz partycję , będzie ona zapisywać na niej aż do jej zapełnienia.

Jeśli popełnisz błąd i umieścisz cały dysk, na przykład = / dev / sda, dd zapisze na całym dysku, aby zakończyć ignorowanie (i nadpisywanie) tablicy partycji.

Możesz również użyć dd na partycji w celu zastąpienia usuniętych plików (usunięte pliki mogą pozostać na partycji i wykryte przez różne narzędzia odzyskiwania z różnym powodzeniem, dopóki nie zostaną nadpisane. W takim przypadku możesz użyć dd, aby wypełnić wolne miejsce przez zapis do pliku.

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

Jednak w zależności od tego, co robisz, możesz użyć alternatywnego narzędzia do bezpiecznego usuwania plików. Zobacz Jak bezpiecznie usunąć plik (i)? dla opcji.

Pantera
źródło
6
Gdybyś mógł pisać do / dev / sdcX i zarządzać zapisywaniem przez granice partycji, to nie byłoby dd ignorowanie tablicy partycji - byłby to sterownik urządzenia blokowego w jądrze, który jest błędny i ignoruje tablicę partycji.
rackandboneman
1
@sudodus ddnie jest tak niski. W rzeczywistości większość rzeczy, które ludzie robią, ddmożna zrobić tak samo cat. W rzeczywistości catjest nieco szybszy, ponieważ używa większych bloków niż dddomyślnie. Cały kod niskiego poziomu znajduje się w jądrze. A kierowca tak naprawdę nie dba o to, czy używasz ddlub cat.
kasperd
1
@sudodus - przepraszam za zamieszanie, nie byłem tak jasny, jak zamierzałem. dd na pewno może pisać dalej, zależy od tego, co mu powiesz. dd if=/dev/zero of=/dev/sda bs=512 count=1lub dd if=/dev/zero of=/dev/sda bs=512są przykładami. Drugim poleceniem będzie kontynuował zapisywanie i zapełnił cały dysk „ignorując” tablicę partycji. Jeśli określisz partycję, dd if=/dev/zero of=/dev/sda1nie wyjdzie ona poza partycję. Rodzaj zależy od tego, co chcesz zrobić z dd.
Panther
1
@Panther Pytanie wyraźnie mówi of=somepartition, więc przypadek, w którym piszesz na całe urządzenie dyskowe, nie ma zastosowania. ddnie można obejść ograniczeń sterownika urządzenia.
Barmar
1
@Bamar czytał, już to skomentowałem. Widziałem wielu użytkowników mylących $ somepartition dla / dev / sda
Panther