Serwer Ubuntu, tablica partycji gpt, mdadm, błąd uruchamiania gruba

9

Podstawowe szczegóły systemu roboczego:

Użyłem płyty CD z serwerem Ubuntu 12.04, aby zainstalować serwer.

Mam 4 dyski. Na wszystkich dyskach zrobiłem następujące, podobne do tego howto :

  • utworzył partycję wymiany 2 GB
  • utworzono partycję 256 GB / boot
  • utworzył partycję RAID10 64 GB (dla roota)
  • utworzył dużą partycję RAID10 zajmującą resztę miejsca

Sformatowałem boot jako ext3. Skonfigurowałem RAID10 na partycji głównej i dużych partycjach. Sformatowałem root jeden ext4. Na dużym utworzyłem wolumin logiczny i sformatowałem go ext4.

Powstały system działa dobrze i uruchamia się dobrze.

Szczegóły problemu:

Następnie postanowiłem udokumentować procedurę niepowodzenia. Jako pierwszy krok postanowiłem ponownie zainstalować grub.

# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..

Wygląda na to, że się nie udało, ale wydaje się, że się poddał i nie wprowadził żadnych zmian. Więc zrestartowałem się. Uruchomienie nie powiodło się. Po prostu wisi na czarnym ekranie z migającym kursorem około 4 linii w dół. Jeśli uruchomię, przytrzymując klawisz „Shift”, po lewej stronie kursora pojawia się słowo „GRUB”, ale nie ma interaktywnego monitu.

W tym momencie użyłem dysku rozruchowego do wygenerowania tego raportu: http://paste.ubuntu.com/966531/

Uwaga w powyższym raporcie mówi, że bootloader nie wskazuje poprawnego sektora dla core.img. (sda jest wirtualnym cd; sdb jest dyskiem rozruchowym; sdc jest lustrem sdb, ale boot nie jest dublowany, istnieje tylko osobna niepowiązana partycja i sformatowana ext3; sdd i sde mają miejsce na boot, ale nie są sformatowane)

Następnie uruchomiłem system z dysku CD serwera Ubuntu, uruchomiłem system ratunkowy i wydałem następujące polecenia, które zakończyły się bez błędów (gdzie sda ​​to wirtualny dysk CD, a b, c, d, e to dyski, które były a, b, c , d we wcześniejszych poleceniach grub):

# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

W tym momencie użyłem dysku rozruchowego do wygenerowania tego raportu: http://paste.ubuntu.com/966561/

Zauważ, że w powyższym raporcie problem dotyczący core.img zniknął. Wydaje się wskazywać na właściwy sektor.

Teraz, gdy spróbuję uruchomić, otrzymuję monit o grub. Jeśli uruchomię „set”, widzę, że root został znaleziony i ustawiony. Jeśli uruchomię „ls /”, widzę mój katalog główny z woluminu rajdowego, w tym plik jądra vmlinuz. Jeśli wpiszesz „ls / vmlinuz”, pojawi się komunikat „błąd: nie znaleziono pliku”. Mówi ten sam błąd, jeśli użyję polecenia „linux”, aby spróbować załadować jądro. Plik vmlinuz nie jest wymieniony, jeśli użyję „ls -l /”.

Zbyt szczegółowe informacje, na wypadek, gdybyś chciał przestrzegać:

Zauważyłem, że nie ma również /boot/grub/grub.cfg, więc pobiegłem

# grub-mkconfig -o /boot/grub/grub.cfg

Ale problem pozostaje.

Jeśli użyję narzędzia „gptsync”, to zachowanie się nie zmieni.

Dysk rozruchowy nie naprawi systemu, ponieważ chce, żebym uruchomił system z włączonym EFI. Krótko się temu przyjrzałem, ale nie wiem, jak to działa. Znalazłem powłokę UEFI w moich opcjach uruchamiania, ale nic o tym nie wiem i nie wiem, jak zmienić stamtąd start (np. Aby uruchomić CD z tej powłoki EFI).

Przeczytałem również tę stronę , ale Ubuntu nie ma polecenia „grub”, więc nie mogę dokładnie go wykonać. Mógłbym po prostu zainstalować to polecenie, ale bardziej ciekawi mnie, jak instalator Ubuntu zdołał go zainstalować, zamiast mieć inną konfigurację. Czy używał list blokujących?

Oto dane wyjściowe parted podczas rozruchu na dysku rozruchowym (gdzie tutaj sdb jest pierwszym dyskiem twardym, sda po uruchomieniu z dysku, a „boot” zmienia się na „bios_grub” w linku 2 wklej):

Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name   Flags
1      17.4kB  2000MB  2000MB  linux-swap(v1)  swap1
2      2000MB  2256MB  256MB   ext3            boot1  boot (this says bios_grub in 2nd link)
3      2256MB  66.3GB  64.0GB                  root1  raid
4      66.3GB  3001GB  2934GB                  data1  raid

Oto niepowiązana super stara maszyna wirtualna do porównania (dla każdego, kto nie zna dysku rozruchowego ): http://paste.ubuntu.com/966799/

Oto najnowsza pasta z systemu problemów, po uruchomieniu powyższego grub-mkconfig, a także ustawieniu „bios_grub” z powrotem na „boot”. http://paste.ubuntu.com/966808/

Porównując oba, wygląda to interesująco:

sdb2: __________________________________________________________________________

File system:       
Boot sector type:  Grub2's core.img
Boot sector info: 
Mounting failed:   mount: unknown filesystem type ''

md/bcserver8:0: ________________________________________________________________

File system:       ext4
Boot sector type:  -
Boot sector info: 
Operating System:  Ubuntu 12.04 LTS
Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img

Wygląda na to, że raid ma pliki rozruchowe, a sdb2 nie jest sformatowany. (pomimo tego system uruchomił się przed uruchomieniem grub-install). Z ratunkowej płyty CD „mount -t ext3 / dev / sdb2 / boot” kończy się niepowodzeniem. Ale ma to sens, że wprowadzałoby to zamieszanie, ponieważ grub używa jawnie partycji 2 (2 w poleceniu parted, które włącza bios_grub).

Zrobiłem więc coś takiego:

# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

Następnie uruchomiłem ponownie i znów mam czarny ekran, bez monitu. http://paste.ubuntu.com/966848/

Więc w tym momencie, zgaduję, że kiedy ustawiony jest bios_grub, grub nie instaluje się w MBR, a nie w systemie plików ext3 na ext3, ale na samej partycji, tak jakby to była EFI ... co oczywiście bałagan tam system plików ext3. I po krótkim czytaniu o EFI, brzmiało to tak, jakby EFI zakładało, że pierwsza partycja to boot, ale w moim przypadku pierwszą jest zamiana, a także powinna to być FAT, a nie coś niemożliwego do ... sens, wciąż jestem całkowicie zagubiony bez pojęcia. [EDYCJA: teraz mam wskazówkę ... pomiń trochę w celu aktualizacji]

A teraz, kiedy klikam naprawę na dysku rozruchowym, pojawia się pytanie o coś innego. Ostatnim razem błąd został ukryty pod oknem i musiałem odciągnąć drugiego, aby go zobaczyć. Tym razem główne okno zniknęło, a nowe okno mówi:

GPT detected.       You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?

Więc kliknąłem tak i powiedziałem, że naprawiono pomyślnie, i utworzyłem kolejną pastę: http://paste.ubuntu.com/966862/

Ale nadal mam czarny ekran z migającym kursorem.

Teraz moją teorią jest to, że boot został nadpisany przez beztłuszczową rzecz nie będącą EFI, która jest po prostu grubowskim kodem, który wcześniej byłby w sektorach 0-63. Na szczęście natrafiłem na bardzo jasne stwierdzenie na tej stronie, które prawdopodobnie zakończyło moje zrozumienie, co to wszystko oznacza. A potem, kiedy to odkryłem, Jeremy opublikował odpowiedź, która, jeśli jest prawdziwa, potwierdza, że ​​jest to brakująca koncepcja klucza. http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

Pytania:

Co się dzieje? Dlaczego grub nie powinien się uruchomić? Dlaczego mówi „nie znaleziono pliku”?

Dlaczego Grub nie chce instalować bez tego ustawienia, które ustawiłem z parted (które nie zostało ustawione przez instalator Ubuntu)? Myślałem, że wszystko, co potrzebne do zainstalowania, to osobny / boot, który nie znajduje się w LVM ani w programowej macierzy RAID, ponieważ mój root jest w RAID, a tablica partycji to GPT.

W jaki sposób instalator CD Ubuntu instaluje go bez tego problemu i bez ustawienia bios_grub?

Zastanowiłbym się również nad wykorzystaniem EFI. Jeśli jest to dobry pomysł i istnieje standardowy sposób, aby go skonfigurować, zawsze jestem gotów uczyć się nowych rzeczy.

Najszybszą odpowiedzią, która sprawiłaby mi radość, nawet bez odpowiedzi na wszystkie moje pytania, byłby zestaw poleceń, które mogłem uruchomić z ratunkowej płyty CD, aby naprawić bootloader w taki sam sposób, jak zrobiła to instalacyjna płyta CD. Byłoby również bardzo miło, gdybym mógł uruchomić je z uruchomionym systemem, zamiast z CD.

Piotr
źródło
Czy możesz dodać wydruk z parted?
Jeremy
Widać to w 2 wklejach linków w linii 993, ale na żądanie dołączę to do mojego pytania.
Peter

Odpowiedzi:

8

Rozwiązaniem jest użycie partycji bios_grub, która nie jest taka sama jak partycja / boot.

Domyślnie partycja bios_grub ma rozmiar 1 MB i musi być oflagowana jako bios_grub. Mój jest pierwszą partycją na moim dysku. Jeśli twoja partycja 2 jest w rzeczywistości / boot, jak sugeruje to parted, nie byłoby to poprawne i powinieneś utworzyć kolejną partycję 1MiB.

W przypadku GPT i GRUB2 minimalny system plików ma trzy partycje: bios_grub, root, swap. (nie do końca pewna, czy wymagana jest zamiana)

Dlaczego grub nie uruchamia się po prostu po uruchomieniu „grub-install”?

Nieznany ... Można by pomyśleć, że nic by to nie zmieniło, gdyby było jasne, że nie można osadzić, więc nie może działać.

Dlaczego mówi „nie znaleziono pliku”?

/ vmlinuz to dowiązanie symboliczne korzystające z partycji rozruchowej, a partycja rozruchowa jest uszkodzona. Kod bios_grub został napisany na górze swojej struktury ext3. Prawdopodobnie oznaczało to, że / boot nie został zamontowany, a widoczne w nim pliki grub znajdowały się w systemie głównym, który nie zawierał jądra.

Dlaczego grub nie chce instalować bez tego ustawienia, które ustawiłem z parted

W tabeli partycji GPT nie ma miejsca na moduł ładujący, w przeciwieństwie do MBR. Dlatego należy utworzyć określoną partycję, aby przechowywać kod rozruchowy. Przed uruchomieniem „grub-install” określ tę partycję za pomocą polecenia:

    parted /dev/sda set 1 bios_grub on

Myślałem, że wszystko, czego potrzebowałem, to osobny / boot. W jaki sposób instalator CD Ubuntu instaluje go bez ustawienia bios_grub?

To wymaganie wydaje się być wszystkim, co jest potrzebne dla instalatora Ubuntu, ale tworzy niestandardowy system, który łatwo się psuje.

Kiedy GRUB mówi „Ta etykieta partycji GPT nie ma partycji rozruchowej BIOS ”, oznacza to partycję bios_grub, a nie / boot.

Jeremy
źródło
Dziękuję Ci. W rzeczywistości jest to bardzo zbliżone do tego, nad czym teraz pracuję. Zobacz moje „Nadal jestem całkowicie zagubiony bez pojęcia”. sekcja powyżej. Teraz moją teorią jest to, że boot został nadpisany przez beztłuszczową rzecz nie będącą EFI, która jest po prostu grubowskim kodem, który wcześniej byłby w sektorach 0-63. Pracuję nad eksperymentem, a następnie dam znać, jak to wygląda.
Peter
Czy używasz Ubuntu? Czy istnieje sposób, aby instalator Ubuntu mógł poprawnie zainstalować przy użyciu partycji bios_grub?
Peter
@Peter Używam Ubuntu, a jeśli wykonujesz partycjonowanie z przewodnikiem, instalator powinien go poprawnie skonfigurować. Wiem, że zrobiło to dla mnie z instalatorem 11.10.
Jeremy
Dziękuję Ci bardzo. Oto odpowiedź. Następnie spróbuję z bardziej złożonymi ustawieniami (raid i lvm przy rozruchu), a następnie zmodyfikuję twoją odpowiedź ze szczegółami.
Peter