Jak odinstalować GRUB?

19

Dysk twardy, którego używam tylko do przechowywania danych, nadal ma GRUB z poprzednich instalacji Ubuntu.

Jak mogę usunąć z niego GRUB bez szkody dla reszty danych na dysku?

tło

Czasami przenoszę dysk danych między komputerami z różnymi konfiguracjami kolejności rozruchu, więc chciałbym, aby nie można go było uruchomić , aby uniknąć konieczności dostosowania go do ustawień BIOS każdego komputera.

Po włączeniu komputera, gdy podłączony jest tylko dysk danych, pojawia się następujący komunikat:

error: no such device: fdf38dd4-9e9d-479d-b830-2a6989958503.
grub rescue> 

Mogę potwierdzić ze starych kopii zapasowych, /etc/fstabże był to UUID partycji root, którą niedawno sformatowałem i która już nie istnieje . Oto tabela partycji dysku danych i surowy rekord rozruchowy .

Pamiętaj, że nie interesują mnie obejścia, które nie odpowiadają na moje podstawowe pytanie. Mogę wymyślić kilka sposobów obejścia tego problemu, ale zasadniczo przeszkadza mi to, że nie wiem, jak go bezpośrednio rozwiązać. Każda procedura instalacji powinna zawierać procedurę odinstalowania odpowiednika.

ændrük
źródło
Ciekawe - jeśli usuniesz pliki w / boot / grub (co, jak zakładałem, zrobiłeś), czy kod mbr naprawdę ma znaczenie? Nie sądzę, że zostanie wykorzystany przez coś innego, prawda? Mogę się mylić, ale nie sądzę, że zostanie wykorzystany i nie chciałbym pieprzyć się z czymś na tak niskim poziomie, jeśli zależałoby mi na danych.
Marty Fried
Czy możesz zrzucić surowe dane MBR i opublikować je tutaj? Powinieneś być w stanie zrobić coś takiego sfdisk -d /dev/sdb > sdb.out.
Przełom

Odpowiedzi:

25

Możesz sprawić, że urządzenie nie będzie bootowalne, po prostu tworząc pierwsze bajty na dysku 0x00.

Zazwyczaj (i dotyczy to zarówno grub, grub2, jak i ntldr iirc) pierwszym bajtem dysku będzie instrukcja jmp x86. Dzieje się tak nawet przed etykietą dysku, ponieważ przekazując wykonanie do urządzenia w celu uruchomienia go, po prostu ustawia procesor tak, aby zasysał informacje o urządzeniu jako kod. Jeśli ma niepoprawny kod, wyzwala przerwanie, a BIOS obsługuje wyjątek i przechodzi do następnego urządzenia rozruchowego.

Na przykład początek mojego dysku zaczyna się od:

00000000  eb 63 90 d0 bc 00 7c fb  50 07 50 1f fc be 1b 7c  |.c....|.P.P....||

Pierwszą częścią jest eb 63Jump to offset 0x63 od bieżącego adresu IP (czyli do 0x65).

00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|
00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|

Wykonanie trwa odtąd.

Koniec sektora wygląda następująco:

000001b0  cd 10 ac 3c 00 75 f4 c3  ed db 96 d6 00 00 80 01  |...<.u..........|
000001c0  01 00 83 fe ff ff 3f 00  00 00 c1 07 a6 0e 00 fe  |......?.........|
000001d0  ff ff 83 fe ff ff 00 60  00 11 00 00 38 29 00 fe  |.......`....8)..|
000001e0  ff ff 82 fe ff ff 00 08  a6 0e 00 58 5a 02 00 00  |...........XZ...|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|

Jeśli dysk jest sformatowany jako tablica partycji MBR, potrzebne są tylko dwie rzeczy: tablica partycji z przesunięciem 0x1bei sygnatura MBR, 55aaktóra występuje na samym końcu sektora z przesunięciem 0x1fe. 0x1bema wartość dziesiętną 446.

Następujące (oczywiście) uniemożliwi uruchomienie urządzenia. Ale tego właśnie chcesz. Jeśli nie chcesz, aby urządzenie nie mogło zostać uruchomione, nie rób tego, mmm-kay? Zakładam, że twoje urządzenie jest /dev/sdzpo prostu dlatego, że niewiele osób ma /dev/sdz, a to zmniejsza ryzyko, że jakiś idiota nowicjusz ślepo kopiuje polecenia wklejania.

Najpierw skopiuj MBR do pliku w celu utworzenia kopii zapasowej.

sudo dd if=/dev/sdz of=/some/where/safe/preferably/not/on/dev/sdz/backup.mbr bs=512 count=1

Następnie wykonaj kopię tego pliku:

cp backup.mbr backup.mbr.test

Następnie musimy utworzyć urządzenie sprzężenia zwrotnego (aby zawartość nie została obcięta.) I zastosuj zmiany w naszym fałszywym sektorze 0 jako test:

sudo losetup /dev/loop7 backup.mbr.test
sudo dd if=/dev/zero of=/dev/loop7 bs=446 count=1
sudo losetup -d /dev/loop7

hexdump plik i upewnij się, że cała tabela partycji jest nienaruszona:

sudo hexdump -C backup.mbr.test

Powinieneś zobaczyć coś takiego:

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 01  |................|
000001c0  01 00 83 fe ff ff 3f 00  00 00 c1 07 a6 0e 00 fe  |......?.........|
000001d0  ff ff 83 fe ff ff 00 60  00 11 00 00 38 29 00 fe  |.......`....8)..|
000001e0  ff ff 82 fe ff ff 00 08  a6 0e 00 58 5a 02 00 00  |...........XZ...|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

Teraz 0x1bejest to miejsce, w którym widzisz 80na zrzucie szesnastkowym, może to być również 00i nadal być poprawne. (Jest to flaga „bootowalna” w tablicy partycji, możesz ją zostawić w spokoju, ponieważ jest ona całkowicie ignorowana przez większość współczesnych BIOS-ów). Bajt na 0x1bfprawie nigdy nie będzie 0x00(najczęściej, 0x01ale może przyjmować inne wartości) możesz porównać to z twoim, backup.mbraby upewnić się, że nic przeszłego się nie 0x1bezmieniło.

Po upewnieniu się, że zmiana została poprawnie zastosowana, możesz bezpośrednio skopiować plik na pierwszą część dysku. Powodem, dla którego chcesz zrobić plik, a nie /dev/zeroponownie, jest bezpieczeństwo przed literówkami. Jeśli przypadkowo zapomnisz, count=1że będziesz miał zły czas, kopiowanie pliku z drugiej strony nigdy nie będzie przebiegać poza EOF. Więc jest bezpieczniej.

sudo dd if=backup.mbr.test of=/dev/sdz

Następnie hexdumpdysk, aby upewnić się, że zmiany zostały wykonane zgodnie z oczekiwaniami.

hexdump -C /dev/sdz | head

Porównaj w porównaniu 0x200z, backup.mbr.testaby upewnić się, że to, czego chcesz.

Wreszcie, jeśli coś zepsuje z jakiegokolwiek powodu, możesz po prostu skopiować kopię zapasową MBR z powrotem na dysk za pomocą:

sudo dd if=backup.mbr of=/dev/sdz

Mam nadzieję że to pomoże.

OmnipotentEntity
źródło
1
Daję ci plus za przewidywanie i zapobieganie poważnemu błędowi noob.
psitae
Dziękuję, starałem się, aby zapobiec jak największej liczbie błędów noob: tworzenie kopii zapasowej, nie pisanie bezpośrednio do urządzenia blokowego na wypadek countzapomnienia, nie używanie bezpośrednio wspólnej nazwy urządzenia blokowego, określając, że plik kopii zapasowej powinien zostać utworzony po zmianie urządzenia, przykład tego, jak wygląda udane czyszczenie, jak cofnąć, jeśli coś spieprzysz. Sądzę, że jeśli masz wystarczającą wiedzę, aby wiedzieć, o co mi chodzi, możesz przebić się przez kroki dziecka i po prostu zrobić to wszystko za pomocą jednego polecenia. Ale nie dam ci tego polecenia, jeśli nadal się uczysz. ;)
OmnipotentEntity
2

OSTRZEŻENIE: NIEZWYKLE NIEBEZPIECZNE

Możesz użyć polecenia dd z samego systemu Linux (usuwa tablicę partycji):

 # dd if=/dev/null of=/dev/sdX bs=512 count=1

Po prostu usuń MBR bez tablicy partycji (patrz komentarz poniżej):

# dd if=/dev/null of=/dev/sdX bs=446 count=1

Zastąp /dev/hdXrzeczywistą nazwą urządzenia, np /dev/hda. Użyj fdisk -lpolecenia, aby znaleźć nazwę urządzenia:

# fdisk -l

Źródło

  1. http://www.cyberciti.biz/faq/linux-how-to-uninstall-grub/
Tachyony
źródło
Te liczby bajtów wyglądają nieprzyjemnie arbitralnie. Czy wiesz, czy są takie same dla GRUB2?
ændrük
1
Liczba bajtów wynika z faktu, że tablica partycji mieści się w przedziale od 446 do 512. To oczywiście nasuwa pytanie, dlaczego chcesz usunąć grub MBR ... nie rani niczego, co tylko siedzi tam nieużywane. Jeśli zamiast tego chcesz zainstalować inny moduł ładujący, zainstaluj go, a zastąpi on grub.
psusi
3
Wow, tego typu odpowiedź powinna zawierać „OSTRZEŻENIE: NIEZWYKLE NIEBEZPIECZNE” napisane dużymi czerwonymi literami. Jestem pewien, że OP jest w stanie to zrobić, ale nie chciałbym, aby jakiś nowicjusz kopiował i wklejał pierwsze polecenie do terminala, nawet nie wiedząc, co to jest „tablica partycji”
Sergey
1
Czy nie to zrobić . Pierwsze polecenie wyczyści tablicę partycji (jak wspomniano OP), ale drugie polecenie spowoduje niezdefiniowane zachowanie, jeśli MBR nie zostanie poprawnie skonfigurowany.
Przełom
1
Umm .. Nie wiem, dlaczego wariujecie, polecenia wklejone przez tachyony nic nie robią. Można przetestować z touch testfile, dd if=/dev/urandom of=testfile bs=512 count=1, sudo losetup /dev/loop7 testfile, sudo dd if=/dev/null of=/dev/loop7 bs=446 count=1, sudo hexdump -Cv /dev/loop7. Jak widać, /dev/nullnie jest to źródło 0, to źródło EOF. ddnie można i nie będzie kopiować niczego, /dev/nullczego potrzebujesz /dev/zero. Po drugie @Przełomowe zachowanie nie jest możliwe, jeśli pierwszy bajt sektora 0 to 0x00. Nie wiem, dlaczego tak myślisz.
OmnipotentEntity
1

Moje doświadczenie z

sudo install-mbr -i n -p D -t 0 /dev/sda

jest to, że pomyślnie odinstalował grub2 z /dev/sda(gdzie jest zainstalowany mój Windows 7), więc pierwsza część pytania „Jak usunąć grub z / dev / sda?” zostało odebrane.

Jednak druga część pytania, czyli „Jak przywrócić MBR z / dev / sda?” nie udzielono odpowiedzi, ponieważ install-mbrpolecenie nie przywróciło MBR. W rezultacie system Windows już się nie uruchamia, a menedżer rozruchu systemu Windows zgłasza błąd dotyczący uszkodzonego MBR i prosi użytkownika o naprawę z dysku CD naprawy systemu Windows.

użytkownik ubuntu-13.10
źródło
1

Po przeczytaniu artykułu w Wikipedii na ten temat chciałbym zaproponować kilka dodatkowych rozwiązań:

  1. Zmień kolejność rozruchu w systemie BIOS :)

  2. Najlepsza i najbezpieczniejsza: służy fdiskdo usuwania flagi „bootowalnej” z dowolnej partycji na tym dysku. Większość MBR szuka „rozruchowej” partycji, z której można załadować łańcuch, więc spodziewałbym się, że GRUB nic nie zrobi, jeśli takich partycji nie będzie. Jednak nie testowałem.

    Jeśli powyższe nie pomoże, spróbuj zainstalować bezpłatny klon standardowego kodu MBR:

  3. Zainstaluj mbrpakiet i użyj następującego install-mbrpolecenia:

    sudo apt-get install mbr
    sudo install-mbr -i n -p D -t 0 /dev/sda
    

Kredyty: W JAKI SPOSÓB: Odzyskiwać MBR systemu Windows za pomocą płyty Ubuntu LIVE CD

Po przeczytaniu artykułu z Wikipedii mam wrażenie, że jedyną rzeczą, która identyfikuje MBR, jest jego podpis znajdujący się na samym końcu sektora (bajty 510 i 511). Pierwsze 446 bajtów MBR powinno zawierać instrukcje maszynowe. BIOS powinien przekazać kontrolę do bootloadera bez względu na faktyczną zawartość pierwszych 446 bajtów, pod warunkiem obecności sygnatury MBR:

Na komputerach kompatybilnych z IBM PC oprogramowanie ładujące zawarte w ROM BIOS ładuje i wykonuje główny rekord rozruchowy. [14] ... Tak więc oczekuje się, że początek MBR będzie zawierać instrukcje języka maszynowego w trybie rzeczywistym. [14] BIOS odczytuje MBR z urządzenia pamięci masowej do pamięci fizycznej, a następnie kieruje mikroprocesor na początek kodu rozruchowego.

Ze względu na ograniczony rozmiar sekcji kodu MBR zwykle zawiera on tylko mały program, który kopiuje dodatkowy kod (np. Moduł ładujący) z urządzenia pamięci masowej do pamięci. Kontrola jest następnie przekazywana do tego kodu, który jest odpowiedzialny za ładowanie rzeczywistego systemu operacyjnego.

...

Sekwencja ładowania początkowego w systemie BIOS załaduje pierwszy prawidłowy MBR, który znajdzie do pamięci fizycznej komputera pod adresem 0x7C00. Ostatnią instrukcją wykonaną w kodzie BIOS będzie „skok” do tego adresu, w celu bezpośredniego wykonania na początek kopii MBR. Podstawową weryfikacją większości BIOSów jest podpis 0xAA55 na końcu, chociaż implementator BIOS może zdecydować się na włączenie innych kontroli, takich jak sprawdzenie, czy MBR zawiera prawidłową tablicę partycji bez wpisów odnoszących się do sektorów przekraczających zgłaszaną pojemność dysku.

Rozumiem więc, że MBR zawsze powinien zawierać program ładujący, a wyzerowanie pierwszych 446 bajtów nie powstrzyma BIOS-u przed próbą uruchomienia z dysku - ale prawdopodobnie zawiesi komputer podczas próby wykonania nieprawidłowego kodu.

AKTUALIZACJA: Ponadto w tym artykule sugeruje się, że aby dysk wyglądał na „niemożliwy do rozruchu” w systemie BIOS, należy właściwie edytować podpis MBR w sektorze i (za pomocą dowolnego edytora dysku). Nie jestem pewien, czy to wpłynie na system operacyjny, widząc tablicę partycji na dysku ... ale przynajmniej zawsze możesz zmodyfikować te bajty z powrotem ...

Siergiej
źródło
0

Kolejne prostsze rozwiązanie.

W moim przypadku miałem Debiana na Linuksie, ale chciałem używać Mandrivy, będę również działał dla innych

Wyłącz komputer, a następnie wyjmij dysk, którego rozruchu nie chcesz uruchamiać (który ma gruba)

Po prostu włóż bootowalną pamięć USB wykonaną z Mandriva ISO lub innego wariantu, który chcesz zainstalować. Są narzędzia do tworzenia bootowalnych pamięci USB z plików ISO za pomocą Google (lub możesz nam wypalonego instalatora z CD ROM)

Teraz większość instalatorów linuxa daje ci wybór, co robić, spróbuj grać / używać do oceny lub przenośnego linuxa lub uruchomić instalację, aby go zainstalować. W tym momencie po prostu czekamy (przesuń kursor w górę, aby ekran poczekał, ale nie naciskaj enter lub klikaj myszą).

Przypomnij, że w tym momencie urządzenie USB / lub / CDRom zostało uruchomione i działa. teraz nadszedł czas, aby ponownie podłączyć dysk twardy, który tymczasowo usunęliśmy, poczekaj minutę (niektóre biografie wymagają krótkiego odczekania minuty, to więcej niż wystarcza)

Kontynuuj proces instalacji, ponieważ większość instalatorów zawiera narzędzia do partycji, które możesz zrobić, co chcesz. Cóż, to proste rozwiązanie, pozbyłem się starej konfiguracji Linuksa po prostu jako początkujący

Piotr
źródło
0

Stare pytanie, ale jak mi się zdarzyło wczoraj, rozwiązałem to w następujący sposób: wyłączyłem komputer, fizycznie odłączyłem obciążony dysk twardy, uruchomiłem ponownie komputer, a następnie

~ $ sudo update-grub

Zrobiłem to, wyłączyłem komputer, ponownie podłączyłem dysk twardy i moja stara partycja Windows 7, która nie istnieje już od 2 lat temu, nie pojawiła się - w końcu.

Rozumiem, że to praktyczne rozwiązanie, ale działa. Pewnego dnia całkowicie wyczyszczę ten dysk twardy, a wszelkie pozostałe ślady GRUB znikną.

ElStellino
źródło