GRUB confonde kernel / initramfs dell'installazione di Ubuntu e Arch Linux


9

Ho una macchina che usava dual-boot Ubuntu (attualmente 16.04) e Windows 7, con Ubuntu GRUB come boot loader.

Ora ho appena aggiunto Arch Linux come terzo sistema operativo, seguendo le istruzioni di installazione ufficiali. Non ho installato GRUB da Arch perché volevo usare quello controllato da Ubuntu. Le istruzioni contenevano un comando mkinitcpio -p linuxche probabilmente generava alcuni file di avvio che ho eseguito come descritto.

Ora, quando provo ad avviare Ubuntu da GRUB attraverso la sua voce predefinita, ottengo questo spiacevole errore (scusate la foto dello schermo):

messaggio di errore

Come l'output di uname -aspettacoli, sta cercando di avviare il kernel Arch, ma /dev/sda6è la partizione root di Ubuntu.

Devo navigare Advanced options for Ubuntue selezionare una delle Ubuntu, with Linux 4.4.0-*voci per poter caricare Ubuntu, ma non sono riuscito a trovare una voce che avrebbe caricato correttamente Arch.

L'esecuzione sudo update-grubda Ubuntu ( " update-grubè uno stub per l'esecuzione grub-mkconfig -o /boot/grub/grub.cfgper generare un file di configurazione grub2" ) non cambia nulla. Lo grub-customizerstrumento è stato anche inutile nel risolvere questo problema finora.

Cosa causa questa confusione di GRUB e come posso risolverlo in modo che ogni versione di Linux si avvii con il kernel corretto e dalla partizione corretta?

Sembra che io abbia installato stupidamente Arch con Ubuntu / boot montato, quindi probabilmente ha inserito i suoi file di avvio.

Sto bene cancellando tutte le cose relative ad Arch per riavviare il caricatore di avvio di Ubuntu e fare un'installazione pulita di Arch in seguito.


Aggiornamenti (grazie a @terdon per il suo supporto nella chat Ask Ubuntu):

Qui è la mia /boot/grub/grub.cfg.

Tutte le voci di Linux sembrano puntare alla mia partizione / dev / sda6, che è la radice di 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

Ho provato ad aggiornare la configurazione di GRUB da 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

Ho provato a reinstallare GRUB sull'MBR da 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.

Questi sono i pacchetti del kernel Ubuntu installati tra l'altro, ho provato a dpkg-reconfiguretutti loro, ma senza alcun effetto sul problema:

$ 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

Ho anche provato a rigenerare gli initramfs di 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

Il mio layout di partizione:

Controllato dal sistema Ubuntu. Le etichette dovrebbero spiegarsi.

$ 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]

La mia struttura del menu di GRUB:

Pagina principale di GRUB

Opzioni avanzate per Ubuntu:
Opzioni avanzate di GRUB per Ubuntu

Opzioni avanzate per Arch:
Opzioni avanzate di GRUB per Arch


La mia /bootdirectory:

$ 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

I kernel 4.4.0 e 4.2.0 dovrebbero essere Ubuntu, Arch dovrebbe avere un kernel 4.5.0. Ma come faccio a sapere quale file senza versione del kernel nel suo nome appartiene a cosa?


La mia directory principale di Ubuntu (directory escluse):

$ 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

La mia directory principale di Arch non contiene alcun file o collegamento.


Ho avuto lo stesso problema con il triplo avvio di Ubuntu, Windows e Arch Linux. è necessario riparare grub manualmente se necessario, avviare arch linux quindi ricostruire grub da lì, potrebbe essere necessario installare os-prober. quindi eseguire questi sudo mkinitcpio -p linuxpoi sudo grub-mkconfig -o /boot/grub/grub.cfginfinesudo grub-install /dev/sda
Edward Torvalds

Quando stavo installando varie distribuzioni Linux sul mio laptop (mentre sostituivo quella precedente, mantenendo intatta Windows) ho avuto un problema simile: quello che ho fatto è stato semplicemente eliminare la rispettiva cartella dei vecchi sistemi operativi da efi e fare un aggiornamento grub. Ma nel mio caso, 1. Era il sistema UEFI 2. Non ho tenuto più sistemi operativi Linux.
Utente registrato

Durante l'avvio, puoi modificare dinamicamente il kernel e initrd per avviare Ubuntu? Se lo hai fatto, qual è l'errore?
SHW,

La schermata che hai postato contiene il messaggio di errore: Root device mounted successfully, but /sbin/init does not exists. Hai indagato su questo? È initdavvero manca? Se è così, dovresti assolutamente installarlo, se invece è presente, hai idea del perché non può essere trovato?
MariusMatutiae,

Risposte:


5

Alla fine l'ho risolto nuotando dall'orbita la partizione Arch e i suoi file di avvio nella /bootdirectory di Ubuntu . Ubuntu ora funziona di nuovo bene, tutte le voci rimanenti di GRUB funzionano di nuovo.

Ecco un elenco di ciò che ho fatto:

  • Elimina i initramfsfile di Arch :

    sudo rm /boot/initramfs-linux*
    
  • Elimina il vmlinuzfile di Arch :

    sudo rm vmlinuz-linux
    
  • Formatta la partizione Arch ( /dev/sda8) usando GParted

  • Aggiorna la configurazione di GRUB:

    sudo update-grub
    
  • Riavvia e divertiti!


Penso che la prima riga codificata initramfs-linuxnon dovrebbe contenere...ranfs...
Anwar l'

1
@Anwar Certo, grazie per aver prestato attenzione. Ho corretto l'errore di battitura.
Byte Commander,

1

Riparare grub.cfg a mano (non raccomandato)

Guardando il tuo grub.cfg

la voce di Ubuntu è rotta (e anche una delle seguenti)

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
}

Le ultime due righe sono il comando emesso da grub per caricare kernel e initrd e attualmente stanno cercando il kernel ARCH e initiramfs. Inoltre, li cerca /nella partizione in identificata dalla uuid=eee18451-b607-4875-8a88-c9cb6c6544c8quale potrebbe o meno ospitare i file Ubuntu previsti.

È possibile risolvere questo problema:

sudo blkid

per ottenere l'UUID della tua partizione root di Ubuntu.

Quindi sostituisci le ultime due righe con il collegamento simbolico al tuo ultimo kernel e alle immagini initrd (poiché questo è il modo in cui Ubuntu si aspetta che sia)

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

Se ciò non lo risolve immediatamente, potrebbe essere necessaria qualche altra correzione. Puoi scoprirli "copiando" una delle voci testate e funzionanti, e ti consiglio di usare quella più vaniglia (es. Nessun upstart o altri parametri del kernel come il nomodeset che viene passato).

Questo dovrebbe essere un buon candidato:

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'

La voce Arch è rotta in modo simile, in quanto probabilmente cerca Arch initramfs e il kernel nella partizione root di Ubuntu. Il percorso predefinito di questi è in / boot. Regola le ultime due righe della voce Arch correggendo la posizione e controllando che la partizione radice uuid sia quella contenente la radice Arch.

Una (più) parola / e di avvertimento:

In generale NON è consigliabile per gli utenti Ubuntu fare confusione a grub.cfgmano. Sicuramente ne fai una copia e fai attenzione nel suo editing. Preparati alla remota possibilità che il tuo sistema diventi non avviabile (ma sarai in grado di resuscitarlo usando la procedura di avvio descritta nella mia vecchia risposta).

Inoltre, mentre questo potrebbe risolvere il tuo problema questa volta, potrebbe tornare a morderti la prossima volta che dovrai ripopolare il tuo menu di grub. Per qualche ragione, il sondaggio os di grub sotto Ubuntu viene confuso dalla presenza del kernel Arch sotto / boot. Immagino che un'utilità come boot-repair dovrebbe essere in grado di rendere correttamente avviabili tutte le distro, ma se ricordo bene non ha funzionato per te.

Una correzione permanente potrebbe consistere nell'installare il kernel arch e le immagini in una directory diversa rispetto a default / boot. Questo è complicato e dovresti consultare la voce grub di Arch wiki su come farlo correttamente.

RISPOSTA VECCHIA (consigliato se intendi passare a Arch a lungo termine) Ecco cosa farei, e in qualche modo l'ho fatto qualche mese fa.

Vai alla pagina arch wiki grub e leggi la sezione pertinente per la tua tabella delle partizioni (probabilmente sei UEFI, quindi leggi ESP e così via).

Avvio in Arch manualmente

Questa è un'esperienza altamente formativa che consiglio di provare. Supponendo che il kernel Arch Linux si trovi da qualche parte sul disco, premere cal prompt di grub e digitare ls per visualizzare un elenco di dispositivi e partizioni (hd0,msdos1),(hd1,gpt1),.... Puoi vedere ognuno di essi per vedere il contenuto.

Devi scoprire tre cose:

  • Dov'è la tua /partizione root Arch
  • Dov'è il tuo kernel Arch vmlinuz
  • Dov'è il tuo arco intiramfs-linux.img

una volta posseduti questi tre, eseguirai tre comandi in grub> prompt qualcosa di simile a questo.

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

Si noti che grub può trovare, ad es

grub> find /sbin/init

(l'unico grub non riesce a trovare automagicamente e darti il ​​panico del kernel;))

Tutto ciò che ho imparato qui , una fonte che consiglio vivamente. Se ce la fai, passa a grub di fissaggio! Altrimenti...

Avvia Arch da una chiave live! Ottieni un ambiente Arch live e segui il wiki di installazione chrootsu Arch nello stesso modo in cui lo hai fatto la prima volta.

Grub di fissaggio

Dall'interno di Arch, installare i relativi pacchetti grub, e in particolare os-proberper consentire il grub-installrilevamento dell'altro sistema. Segui attentamente la guida all'installazione e dovresti essere in grado (almeno) di avviare sia arch che ubuntu dal menu di grub. L'installazione dei comandi finirà così.

** Avviso ** Non eseguire questi comandi, sono esemplificativi, è necessario elaborare quelli appropriati per il proprio sistema

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

** Se tutti gli altri falliscono **

Sfortunatamente, questo è tanto specifico in quanto viene dato il numero limitato di informazioni e SE non è in realtà un forum per tali problemi, quindi la mia risposta "generica" ​​si riferisce a risorse utili.

Se non riesci a capirlo, magari dai forum di Arch, e purché tu abbia fatto del tuo meglio e letto prima i documenti, potresti trovare aiuto.

Fare tutto questo attraverso Arch è stata per me un'esperienza di apprendimento fondamentale.


1
Grazie per la risposta. Innanzitutto, è un sistema BIOS con disco partizionato MBR. In secondo luogo, voglio usare il pacchetto grub e la configurazione da Ubuntu, reinstallare GRUB da Arch non è quello che pianifico. Dubito anche che ciò comporterebbe qualsiasi cambiamento ... E posso avviare Ubuntu tramite la voce di GRUB da qualche parte nelle opzioni avanzate. Il problema è che GRUB in qualche modo sembra non essere in grado di determinare quale kernel o ramdisk iniziale o qualunque cosa appartenga a quale sistema su quale partizione.
Byte comandante

In sostanza, si applicano gli stessi passaggi. grub-install e grub-mkconfig (che ti rende un nuovo file grub.cfg) sono comandi di grub che sono disponibili anche in Ubuntu. Controlla se os-prober è anche disponibile o qualcosa di simile (questo consente a mkconfig di trovare altri filesystem). Questo risolve supponendo che le immagini del kernel siano nel posto giusto, rileggendo il tuo post non sono del tutto sicuro che sia così. Ispeziona la tua partizione / boot per assicurarti che tutti i kernel e .img siano presenti. Potresti aver sovrascritto il tuo linux initrd.img con initramfs di arch. Hit forum di Ubuntu o askubuntu.
Tre Diag,

Come ho scritto, ho eseguito grub-mkconfig già inutilmente, ma quando torno a casa controllerò le immagini disponibili in / boot. E ci sono alcuni script os-prober.
Byte comandante

Scusa, mi sono perso. Quindi probabilmente hai sovrascritto il tuo kernel Ubuntu e initrd con quelli arch. Puoi metterli a posto eseguendo la sequenza di aggiornamento / aggiornamento dal kernel di fallback di Ubuntu (penso)
Three Diag

I kernel di Ubuntu dovrebbero andare bene dato che posso avviarli tutti dal menu "Opzioni avanzate per Ubuntu". Se qualcosa non va lì, potrebbe essere solo il collegamento simbolico al kernel predefinito ... Andando a controllare che stasera.
Byte comandante

0

La mia soluzione è più semplice. Uso il terminale e faccio quanto segue:

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

Se hai ulteriori problemi, basta usare boot-repair, che è un download gratuito, abbastanza piccolo da poter essere masterizzato su un disco CD.


L'OP è già in esecuzione update-grub. È molto improbabile che la riparazione del boot aiuti con questo particolare problema.
terdon

grub e alcuni processi di riparazione o aggiornamento del boot presuppongono che ciò che è in /boot/grub/grub.cfg sia corretto e corretto. Tuttavia, apportando modifiche, come una riformattazione della partizione, si ottiene un nuovo UUID, che ti mette in grub-rescue> Per gestire questo, basta fare questo: sudo rm /boot/grub/grub.cfg; sudo update-grub. Tutte le voci in grub.cfg saranno nuove e aggiornate.
BAD-Boop,

Sì, ma ancora una volta l'OP ha già fatto questo e non ha aiutato. Mi rendo conto che la domanda è grande ed è facile da perdere ma sudo grub-mkconfig -o /boot/grub/grub.cfgè proprio lì. update-grubè uno script di shell molto semplice che viene eseguito grub-mkconfig -o /boot/grub/grub.cfg . Puoi vederlo con cat /usr/sbin/update-grub.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.