GRUB myli jądra / initramfs instalacji Ubuntu i Arch Linux

9

Mam komputer, który używał do podwójnego uruchamiania Ubuntu (obecnie 16.04) i Windows 7, z GRUB Ubuntu jako programem ładującym.

Właśnie dodałem Arch Linux jako trzeci system operacyjny, zgodnie z oficjalnymi instrukcjami instalacji. Nie zainstalowałem GRUB-a z Arch, ponieważ chciałem użyć kontrolowanego przez Ubuntu. Instrukcje zawierały polecenie, mkinitcpio -p linuxktóre prawdopodobnie wygenerowało niektóre pliki rozruchowe, które uruchomiłem zgodnie z opisem.

Teraz, gdy próbuję uruchomić Ubuntu z GRUB-a za pomocą domyślnego wpisu, pojawia się ten nieprzyjemny błąd (przepraszam za zdjęcie na ekranie):

Komunikat o błędzie

Jako wynik uname -aprogramów próbuje uruchomić jądro Arch, ale /dev/sda6jest partycją główną Ubuntu.

Muszę nawigować Advanced options for Ubuntui wybrać jeden z Ubuntu, with Linux 4.4.0-*wpisów, aby móc załadować Ubuntu, nie mogłem jednak znaleźć wpisu, który poprawnie załadowałby Arch.

Uruchamianie sudo update-grubz Ubuntu ( update-grubto grub-mkconfig -o /boot/grub/grub.cfgskrót do uruchamiania w celu wygenerowania pliku konfiguracyjnego grub2.” ) Nic nie zmienia. grub-customizerNarzędzie było również bezużyteczna przy ustalaniu tego do tej pory.

Co powoduje to zamieszanie w GRUB-ie i jak to naprawić, aby każda wersja Linuksa uruchamiała się z prawidłowym jądrem i z właściwej partycji?

Wygląda na to, że głupio zainstalowałem Archa z zamontowanym Ubuntu / boot, więc prawdopodobnie umieścił tam swoje pliki rozruchowe.

Nie mam nic przeciwko usuwaniu wszystkich rzeczy związanych z Archiem, aby ponownie uruchomić program ładujący Ubuntu i wykonać czystą instalację Archa później.


Aktualizacje (dzięki @terdon za wsparcie w czacie Ask Ubuntu):

Tu jest mój /boot/grub/grub.cfg.

Wszystkie wpisy w Linuksie wydają się wskazywać na moją partycję / dev / sda6, która jest głównym katalogiem Ubuntu:

$ grep ' linux /' /boot/grub/grub.cfg
    linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset

Próbowałem zaktualizować konfigurację GRUB z Ubuntu:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
dpkg: warning: version 'linux' has bad syntax: version number does not start with a digit
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found linux image: /boot/vmlinuz-4.2.0-35-generic
Found initrd image: /boot/initrd.img-4.2.0-35-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
Found Arch on /dev/sda8
done

Próbowałem ponownie zainstalować GRUB do MBR z Ubuntu:

$ sudo grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

$ sudo grub-install --recheck /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

Nawiasem mówiąc, są to zainstalowane pakiety jądra Ubuntu, starałem się je dpkg-reconfigurewszystkie, ale bez żadnego wpływu na problem:

$ dpkg -l linux-image* | grep ^ii
ii  linux-image-4.2.0-35-generic       4.2.0-35.40  amd64        Linux kernel image for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-21-generic       4.4.0-21.37  amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.2.0-35-generic 4.2.0-35.40  amd64        Linux kernel extra modules for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-21-generic 4.4.0-21.37  amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

Próbowałem także zregenerować initramfs Ubuntu:

$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-4.4.0-21-generic
update-initramfs: Generating /boot/initrd.img-4.2.0-35-generic

Mój układ partycji:

Sprawdzone z systemu Ubuntu. Etykiety powinny się wyjaśnić.

$ lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  ntfs   win7-boot   90DCF3A5DCF3842E                     /win/boot
├─sda2  ntfs   windows7    482C7A572C7A3FCC                     /win/c
├─sda3  ext4   grub-boot   6dbb8633-dadd-4b5e-8d85-b0895fde9dfb /boot
├─sda5  ext4   images      81dc42c4-a161-4ccd-b704-6e5c09298943 /images
├─sda6  ext4   ubuntu-1604 eee18451-b607-4875-8a88-c9cb6c6544c8 /
├─sda7  ext4   ubuntu-home 485b3ef1-7216-4053-b25c-f656d529e8e6 /home
├─sda8  ext4   arch-root   8d281a0c-969c-44cf-ba6a-1d3c7b4be7ec 
├─sda9  ext4   arch-home   32522902-a53d-44c8-90f2-6bbf14c40f1f 
└─sda10 swap   linux-swap  8b05bd9b-bc42-46f6-8c18-50711a3c48b9 [SWAP]

Struktura menu mojego GRUBA:

Strona główna GRUB

Zaawansowane opcje dla Ubuntu:
Zaawansowane opcje GRUB dla Ubuntu

Zaawansowane opcje Arch:
Zaawansowane opcje GRUB-a dla Arch


Mój /bootkatalog:

$ ls -la /boot
total 118480
drwxr-xr-x  4 root root     4096 Apr 24 20:50 .
drwxr-xr-x 28 root root     4096 Apr 24 19:44 ..
-rw-r--r--  1 root root  1313029 Mär 16 01:45 abi-4.2.0-35-generic
-rw-r--r--  1 root root  1239577 Apr 19 00:21 abi-4.4.0-21-generic
-rw-r--r--  1 root root   184888 Mär 16 01:45 config-4.2.0-35-generic
-rw-r--r--  1 root root   189412 Apr 19 00:21 config-4.4.0-21-generic
drwxr-xr-x  6 root root     4096 Apr 26 19:58 grub
-rw-r--r--  1 root root 18598360 Apr 24 20:59 initramfs-linux-fallback.img
-rw-r--r--  1 root root  3516429 Apr 24 20:59 initramfs-linux.img
-rw-r--r--  1 root root 33642388 Apr 24 18:31 initrd.img-4.2.0-35-generic
-rw-r--r--  1 root root 36143341 Apr 24 19:51 initrd.img-4.4.0-21-generic
drwx------  2 root root    16384 Okt 28 17:43 lost+found
-rw-r--r--  1 root root   182704 Jan 28 13:44 memtest86+.bin
-rw-r--r--  1 root root   184380 Jan 28 13:44 memtest86+.elf
-rw-r--r--  1 root root   184840 Jan 28 13:44 memtest86+_multiboot.bin
-rw-------  1 root root  3745312 Mär 16 01:45 System.map-4.2.0-35-generic
-rw-------  1 root root  3853719 Apr 19 00:21 System.map-4.4.0-21-generic
-rw-------  1 root root  6829104 Mär 16 01:45 vmlinuz-4.2.0-35-generic
-rw-------  1 root root  7013968 Apr 19 00:21 vmlinuz-4.4.0-21-generic
-rw-r--r--  1 root root  4435552 Apr 14 19:20 vmlinuz-linux

Jądra 4.4.0 i 4.2.0 powinny być Ubuntu, Arch powinien mieć jądro 4.5.0. Ale jak mogę się dowiedzieć, który plik bez wersji jądra w nazwie należy do czego?


Mój katalog główny Ubuntu (z wyłączeniem katalogów):

$ ls -la / | grep ^[^d]
total 124
lrwxrwxrwx   1 root      root         32 Apr 24 19:44 initrd.img -> boot/initrd.img-4.4.0-21-generic
lrwxrwxrwx   1 root      root         32 Apr  5 17:45 initrd.img.old -> boot/initrd.img-4.2.0-35-generic
lrwxrwxrwx   1 root      root         29 Apr 24 19:44 vmlinuz -> boot/vmlinuz-4.4.0-21-generic
lrwxrwxrwx   1 root      root         29 Apr  5 17:45 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic

Katalog główny My Arch nie zawiera żadnych plików ani łączy.

Bajt Dowódca
źródło
Miałem ten sam problem z potrójnym uruchomieniem Ubuntu, Windows i Arch Linuxa. w razie potrzeby musisz ręcznie naprawić GRUB, uruchom system Linux, a następnie przebuduj stamtąd GRUB, być może będziesz musiał zainstalować os-prober. następnie uruchom je, sudo mkinitcpio -p linuxa na sudo grub-mkconfig -o /boot/grub/grub.cfgkoniecsudo grub-install /dev/sda
Edward Torvalds
Kiedy instalowałem różne dystrybucje Linuksa na moim laptopie (podczas wymiany starszego, nie zmieniając systemu Windows) miałem podobny problem. Po prostu usunąłem odpowiedni folder starszego systemu operacyjnego z efi i zrobiłem aktualizację grub. Ale w moim przypadku 1. Był to system UEFI 2. Nie miałem wielu systemów operacyjnych Linux.
Zarejestrowany użytkownik
Czy podczas uruchamiania możesz dynamicznie modyfikować jądro i initrd, aby uruchamiał się w Ubuntu? Jeśli to zrobiłeś, to jaki był błąd?
SHW
Ekran zostanie zaksięgowana zawiera komunikat o błędzie: Root device mounted successfully, but /sbin/init does not exists. Zbadałeś to? Czy initnaprawdę brakuje? Jeśli tak, zdecydowanie powinieneś go zainstalować, jeśli zamiast tego jest obecny, jakiś pomysł, dlaczego nie można go znaleźć?
MariusMatutiae

Odpowiedzi:

5

W końcu rozwiązałem go, nukując partycję Arch i jej pliki rozruchowe w katalogu mojego Ubuntu /bootz orbity. Ubuntu znów jest w porządku, wszystkie pozostałe wpisy GRUBa znów działają.

Oto lista tego, co zrobiłem:

  • Usuń initramfspliki Arch :

    sudo rm /boot/initramfs-linux*
    
  • Usuń vmlinuzplik Arch :

    sudo rm vmlinuz-linux
    
  • Sformatuj partycję Arch ( /dev/sda8) za pomocą GParted

  • Zaktualizuj konfigurację GRUB:

    sudo update-grub
    
  • Uruchom ponownie i ciesz się!

Bajt Dowódca
źródło
Myślę, że pierwszy zakodowany wiersz powinien zawierać initramfs-linuxnie...ranfs...
Anwar
1
@Anwar Oczywiście, dziękuję za uwagę. Naprawiłem literówkę.
Byte Commander
1

Ręczne naprawianie grub.cfg (niezalecane)

Patrzę na ciebie grub.cfg

wpis Ubuntu jest uszkodzony (a także niektóre z poniższych)

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-eee18451-b607-4875-8a88-c9cb6c6544c8' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos3'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    else
      search --no-floppy --fs-uuid --set=root 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    fi
    linux   /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro  
    initrd  /initramfs-linux.img
}

Ostatnie dwa wiersze to wydane przez gruba polecenie załadowania jądra i initrd i obecnie szukają jądra ARCH i initiramfs. Ponadto, szuka ich na /partycji in zidentyfikowanej przez, uuid=eee18451-b607-4875-8a88-c9cb6c6544c8która może, ale nie musi hostować zamierzone pliki Ubuntu.

Możesz to naprawić poprzez:

sudo blkid

aby uzyskać identyfikator UUID partycji root Ubuntu.

Następnie zamień dwa ostatnie wiersze na link simlink do twojego najnowszego jądra i obrazów initrd (ponieważ tak właśnie oczekuje ubuntu)

linux   /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro  
initrd  /initrd.img

Jeśli to nie naprawi tego od razu, może być wymagana inna korekta. Możesz je znaleźć, „kopiując” jeden z testowanych i działających wpisów, i polecam użycie najbardziej waniliowego (np. Brak przekazywanych parametrów jądra lub innych parametrów jądra, takich jak nomodeset).

To powinien być dobry kandydat:

menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-eee18451-b607-4875-8a88-c9cb6c6544c8'

Wpis Arch jest podobnie uszkodzony, ponieważ prawdopodobnie szuka Arch initramfs i jądra w partycji root Ubuntu. Domyślna lokalizacja tych plików to / boot. Dostosuj dwa ostatnie wiersze wpisu Arch, poprawiając lokalizację i sprawdzając, czy identyfikator użytkownika partycji root jest tym, który zawiera Arch Arch.

(Kilka) słów ostrzeżenia:

Zasadniczo NIE zaleca się użytkownikom Ubuntu bałagania się grub.cfgręcznie. Z pewnością wykonaj jego kopię i zachowaj ostrożność podczas jej edycji. Przygotuj się na przypadek, że twój system przestanie się uruchamiać (ale będziesz mógł go wskrzesić za pomocą procedury rozruchu opisanej w mojej starej odpowiedzi).

Ponadto, chociaż tym razem może to rozwiązać problem, może wrócić do gryzienia następnym razem, gdy będziesz musiał ponownie wypełnić menu grub. Z jakiegoś powodu sondowanie systemu operacyjnego grub pod Ubuntu jest mylone przez obecność jądra Arch pod / boot. Domyślam się, że narzędzie takie jak naprawa rozruchu powinno być w stanie poprawnie uruchomić wszystkie Twoje dystrybucje, ale jeśli dobrze pamiętam, nie działało to dla ciebie.

Jedna stała poprawka może polegać na zainstalowaniu jądra arch i obrazów w innym katalogu niż domyślny / boot. Jest to nieporadne i powinieneś skonsultować się z wpisem Arch Wiki o tym, jak to zrobić poprawnie.

OLD ODPOWIEDŹ (zalecane, jeśli planujesz przejść na Arch długoterminowo) Oto, co bym zrobił i jakoś zrobił kilka miesięcy temu.

Przejdź do strony Arch Arch Grub i przeczytaj odpowiednią sekcję dla swojej tabeli partycji (prawdopodobnie jesteś UEFI, więc czytaj o ESP i tak dalej).

Ręczne uruchamianie w Arch

Jest to bardzo kształtujące doświadczenie, które polecam spróbować. Zakładając, że jądro Arch Linux znajduje się gdzieś na twoim dysku, naciśnij cw wierszu poleceń grub i wpisz ls, aby zobaczyć listę wyglądających urządzeń i partycji (hd0,msdos1),(hd1,gpt1),.... Możesz ls każdy z nich, aby zobaczyć zawartość.

Musisz dowiedzieć się trzech rzeczy:

  • Gdzie jest twoja /główna partycja Arch
  • Gdzie jest twoje jądro Arch vmlinuz
  • Gdzie jest twój Arch intiramfs-linux.img

po posiadaniu tych trzech uruchomisz trzy polecenia w wierszu poleceń grub> coś podobnego do tego.

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /intiramfs-linux.img
grub> boot

Zauważ, że grub może znaleźć, np

grub> find /sbin/init

(ten jeden grub nie może znaleźć się automatycznie i wywołuje panikę w jądrze;))

Tego wszystkiego się tutaj nauczyłem , źródła, które gorąco polecam. Jeśli dasz radę, przejdź do naprawiania grub! Inaczej...

Boot Arch z klucza na żywo! Pobierz środowisko Arch na żywo i śledź wiki instalacyjne chrootna Arch w podobny sposób, jak za pierwszym razem.

Naprawianie grub

Z poziomu Arch zainstaluj odpowiednie pakiety grub, aw szczególności, os-proberaby umożliwić grub-installwykrycie twojego innego systemu. Postępuj dokładnie według instrukcji instalacji i powinieneś (przynajmniej) uruchomić zarówno arch, jak i ubuntu z menu grub. Zainstalowanie poleceń skończy się tak.

** Ostrzeżenie ** Nie uruchamiaj tych poleceń, są one przykładami, musisz wypracować te odpowiednie dla twojego systemu

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

** Jeśli wszystko inne zawiedzie **

Niestety, jest to tak szczegółowe, jak to możliwe, biorąc pod uwagę ograniczoną liczbę informacji, a SE nie jest tak naprawdę forum dla takich problemów, stąd moja „ogólna” odpowiedź odnosząca się do przydatnych zasobów.

Jeśli nie możesz tego rozgryźć, być może wpadnij na fora Arch i pod warunkiem, że postarałeś się jak najlepiej i przeczytałeś dokumenty przedtem, możesz znaleźć pomoc.

Robienie tego wszystkiego za pomocą Arch było dla mnie podstawowym doświadczeniem.

Three Diag
źródło
1
Dzięki za twoją odpowiedź. Po pierwsze, jest to system BIOS z dyskiem partycjonowanym MBR. Po drugie, chcę użyć pakietu grub i konfiguracji z Ubuntu, ponowna instalacja GRUB z Arch nie jest tym, co planuję. Wątpię również, czy wprowadziłoby to jakąkolwiek zmianę ... I mogę uruchomić system Ubuntu poprzez wpis GRUB gdzieś w Opcjach zaawansowanych. Problem polega na tym, że GRUB w jakiś sposób nie jest w stanie określić, które jądro, początkowy ramdysk lub cokolwiek należy do którego systemu na której partycji.
Byte Commander
Zasadniczo obowiązują te same kroki. grub-install i grub-mkconfig (co czyni cię nowymi plikami grub.cfg) to polecenie grub, które jest również dostępne w Ubuntu. Sprawdź, czy os-prober jest również dostępny lub coś podobnego (pozwala to mkconfig znaleźć inne systemy plików). To rozwiązuje problem, zakładając, że obrazy jądra znajdują się we właściwym miejscu. Ponowne czytanie Twojego postu Nie jestem pewien, czy tak jest. Sprawdź swoją partycję / boot, aby upewnić się, że są tam wszystkie jądra i .img. Być może nadpisałeś swój linux initrd.img archami initramfs. Zajrzyj na fora ubuntu lub askubuntu.
Three Diag
Jak napisałem, uruchomiłem grub-mkconfig już bezskutecznie, ale sprawdzę dostępne obrazy w katalogu / boot, kiedy wrócę do domu. I jest kilka skryptów os-prober.
Byte Commander
Przepraszam, przegapiłem to. Wtedy prawdopodobnie nadpisałeś swoje jądro ubuntu i initrd arch. Możesz wstawić je na miejsce, uruchamiając sekwencję aktualizacji / aktualizacji z jądra rezerwowego systemu Ubuntu (tak myślę)
Three Diag
Jądra Ubuntu powinny być w porządku, ponieważ mogę je wszystkie uruchomić z menu „Zaawansowane opcje Ubuntu”. Jeśli coś jest nie tak, może to być tylko dowiązanie symboliczne do domyślnego jądra ... Sprawdzę to tego wieczoru.
Byte Commander
0

Moje rozwiązanie jest prostsze. Korzystam z terminala i wykonuję następujące czynności:

sudo rm /boot/grub/grub.cfg
sudo update-grub

Jeśli masz dalsze problemy, skorzystaj boot-repairz bezpłatnego pliku do pobrania, wystarczająco małego, aby nagrać na dysk CD.

BAD-Boop
źródło
PO już działa update-grub. Naprawienie rozruchu jest bardzo mało prawdopodobne w przypadku tego konkretnego problemu.
terdon
grub i niektóre procesy naprawy lub aktualizacji rozruchu zakładają, że to, co jest w /boot/grub/grub.cfg, jest ctrrent i poprawne. Ale dokonaj zmian, takich jak formatowanie partycji, otrzymujesz nowy identyfikator UUID, który wprowadza cię w GRUB-Rescue> Aby sobie z tym poradzić, po prostu zrób to: sudo rm /boot/grub/grub.cfg; sudo update-grub. Wszystkie wpisy w grub.cfg będą nowe i aktualne.
BAD-Boop
Tak, ale znowu OP już to zrobił i to nie pomogło. Zdaję sobie sprawę, że pytanie jest duże i łatwo je przeoczyć, ale sudo grub-mkconfig -o /boot/grub/grub.cfgjest właśnie tam. update-grubto bardzo prosty skrypt powłoki, który działa grub-mkconfig -o /boot/grub/grub.cfg . Możesz to zobaczyć za pomocą cat /usr/sbin/update-grub.
terdon