GRUB confunde kernels / initramfs da instalação do Ubuntu e Arch Linux


9

Eu tenho uma máquina que costumava inicializar o Ubuntu duas vezes (16.04 atualmente) e o Windows 7, com o GRUB do Ubuntu como carregador de inicialização.

Agora acabei de adicionar o Arch Linux como terceiro sistema operacional, seguindo as instruções oficiais de instalação. Não instalei o GRUB a partir do Arch, porque queria usar o controlado pelo Ubuntu. As instruções continham um comando mkinitcpio -p linuxque provavelmente gerou alguns arquivos de inicialização que executei conforme descrito.

Agora, quando tento inicializar o Ubuntu a partir do GRUB por meio da entrada padrão, recebo este erro desagradável (desculpe pela foto da tela):

mensagem de erro

Como resultado do uname -ashow, ele está tentando inicializar o kernel do Arch, mas /dev/sda6é a partição raiz do Ubuntu.

Eu tenho que navegar Advanced options for Ubuntue selecionar uma das Ubuntu, with Linux 4.4.0-*entradas para poder carregar o Ubuntu, mas não consegui encontrar uma entrada que carregasse corretamente o Arch.

A execução sudo update-grubno Ubuntu ( " update-grubé um esboço para a execução grub-mkconfig -o /boot/grub/grub.cfgde um arquivo de configuração do grub2." ) Não muda nada. A grub-customizerferramenta também foi inútil para corrigir isso até agora.

O que causa essa confusão do GRUB e como corrigi-lo para que cada versão do Linux seja inicializada com o kernel correto e a partição correta?

Parece que eu estupidamente instalei o Arch com o Ubuntu / boot montado, então provavelmente colocou seus arquivos de inicialização lá.

Eu estou bem em apagar todas as coisas relacionadas ao Arch para obter o gerenciador de inicialização do Ubuntu novamente e fazer uma instalação limpa do Arch mais tarde.


Atualizações (obrigado a @terdon por seu apoio no chat Ask Ubuntu):

Aqui está o meu /boot/grub/grub.cfg.

Todas as entradas do Linux parecem apontar para minha partição / dev / sda6, que é a raiz do 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

Eu tentei atualizar a configuração do GRUB no 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

Tentei reinstalar o GRUB no MBR do 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.

A propósito, esses são os pacotes de kernel do Ubuntu instalados, tentei dpkg-reconfiguretodos eles, mas sem qualquer efeito sobre o 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

Eu também tentei regenerar o initramfs do 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

Meu layout de partição:

Verificado a partir do sistema Ubuntu. Os rótulos devem se explicar.

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

Minha estrutura de menus do GRUB:

Página principal do GRUB

Opções avançadas para o Ubuntu:
Opções avançadas do GRUB para Ubuntu

Opções avançadas para o Arch:
Opções avançadas do GRUB para Arch


Meu /bootdiretório:

$ 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

Os kernels 4.4.0 e 4.2.0 devem ser o Ubuntu, o Arch deve ter um kernel 4.5.0. Mas como descobrir qual arquivo sem a versão do kernel em seu nome pertence a quê?


Meu diretório raiz do Ubuntu (diretórios excluídos):

$ 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

Meu diretório raiz do Arch não contém nenhum arquivo ou link.


Eu tive o mesmo problema com o boot triplo do ubuntu, windows e arch linux. você precisa consertar o grub manualmente, se necessário, inicializar no arch linux e reconstruir o grub a partir daí, pode ser necessário instalar os-prober. em seguida, executar estes sudo mkinitcpio -p linux, em seguida, sudo grub-mkconfig -o /boot/grub/grub.cfgpor últimosudo grub-install /dev/sda
Edward Torvalds

Quando instalava várias distribuições Linux no meu laptop (enquanto substituia uma antiga, mantendo as janelas intocadas), tive um problema semelhante. O que fiz foi simplesmente excluir a respectiva pasta dos sistemas operacionais mais antigos da efi e fazer uma atualização do grub. Mas, no meu caso, 1. Era o sistema UEFI 2. Não mantive vários SO Linux.
Usuário registrado

Durante a inicialização, você pode modificar dinamicamente o kernel e o initrd para inicializar no Ubuntu? Se você fez isso, qual foi o erro?
SHW 5/05

A tela que você postou contém a mensagem de erro: Root device mounted successfully, but /sbin/init does not exists. Você investigou isso? Está initrealmente faltando? Em caso afirmativo, você deve instalá-lo definitivamente, se estiver presente, alguma idéia de por que não foi encontrado?
MariusMatutiae

Respostas:


5

Eu finalmente resolvi colocando a partição Arch e seus arquivos de inicialização no /bootdiretório do meu Ubuntu a partir da órbita. O Ubuntu está bom novamente agora, todas as entradas restantes do GRUB estão funcionando novamente.

Aqui está uma lista do que eu fiz:

  • Exclua os initramfsarquivos do Arch :

    sudo rm /boot/initramfs-linux*
    
  • Exclua o vmlinuzarquivo do Arch :

    sudo rm vmlinuz-linux
    
  • Formate a partição do Arch ( /dev/sda8) usando GParted

  • Atualize a configuração do GRUB:

    sudo update-grub
    
  • Reinicie e divirta-se!


Eu acho que a primeira linha de código deve conter initramfs-linuxnão...ranfs...
Anwar

1
@ Anwar Claro, obrigado por prestar atenção. Corrigi o erro de digitação.
Byte Commander

1

Reparando o grub.cfg manualmente (não recomendado)

Olhando para o seu grub.cfg

a entrada do Ubuntu está quebrada (e algumas das seguintes também)

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
}

As duas últimas linhas são seu comando emitido pelo grub para carregar o kernel e o initrd, e atualmente estão procurando o kernel ARCH e o initiramfs. Além disso, ele os procura /na partição in identificada pela uuid=eee18451-b607-4875-8a88-c9cb6c6544c8qual pode ou não hospedar os arquivos Ubuntu desejados.

Você pode corrigir isso:

sudo blkid

para obter o uuid da sua partição raiz do ubuntu.

Em seguida, substitua as duas últimas linhas pelo simlink para as imagens mais recentes do kernel e do initrd (já que é assim que o ubuntu espera que seja)

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

Se isso não for corrigido imediatamente, alguma outra correção poderá ser necessária. Você pode descobri-los "copiando" uma das entradas testadas e funcionando, e eu recomendo que você use a mais baunilha (por exemplo, nenhum parâmetro inicial ou outro parâmetro do kernel, como o conjunto de nós que está sendo aprovado).

Este deve ser um bom 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'

A entrada do Arch também é quebrada, pois provavelmente procura o initramfs e o kernel do Arch na partição raiz do Ubuntu. O local padrão desses está em / boot. Ajuste as duas linhas finais da entrada do Arch, corrigindo o local e verificando se o uuid da partição raiz é o que contém a raiz do Arch.

Uma (várias) palavra (s) de advertência:

Em geral, NÃO é recomendado que os usuários do Ubuntu mexam com a grub.cfgmão. Definitivamente faça uma cópia e seja cuidadoso em sua edição. Esteja preparado para a chance de seu sistema não ser inicializado (mas você poderá ressuscitá-lo usando o procedimento de inicialização descrito na minha antiga resposta).

Além disso, embora isso possa resolver seu problema desta vez, ele pode voltar a mordê-lo na próxima vez em que você precisar preencher novamente o menu do grub. Por alguma razão, a investigação do grub no ubuntu fica confusa com a presença do kernel do Arch em / boot. Eu acho que um utilitário como o reparo de inicialização deve poder tornar corretamente todas as suas distros inicializáveis, mas se bem me lembro, não funcionou para você.

Uma correção permanente pode consistir na instalação do kernel do arco e das imagens em um diretório diferente do padrão / boot. Isso é complicado e você deve consultar a entrada grub do Arch wiki sobre como fazê-lo corretamente.

RESPOSTA ANTIGA (recomendado se você planeja mudar para o Arch a longo prazo) Aqui está o que eu faria e, de alguma forma, fiz alguns meses atrás.

Vá para a página do wiki do arch wiki e leia a seção relevante para sua tabela de partições (você provavelmente é UEFI, leia sobre ESP e assim por diante).

Inicializando no Arch manualmente

Esta é uma experiência altamente formativa que recomendo tentar. Supondo que seu kernel do Arch Linux esteja localizado em algum lugar do seu disco, pressione cno prompt do grub e digite ls para ver uma lista de dispositivos e partições parecidos (hd0,msdos1),(hd1,gpt1),.... Você pode ls cada um deles para ver o conteúdo.

Você precisa descobrir três coisas:

  • Onde está sua /partição raiz do Arch
  • Onde está seu kernel do Arch vmlinuz
  • Onde está o seu arco intiramfs-linux.img

depois de possuir esses três, você executará três comandos no grub> prompt, algo semelhante a este.

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

Observe que o grub pode encontrar, por exemplo

grub> find /sbin/init

(o grub não pode ser encontrado automaticamente e causando pânico no kernel;))

Tudo isso eu aprendi aqui , uma fonte que eu recomendo. Se você pode gerenciar, pule para corrigir o grub! De outra forma...

Arco de inicialização a partir de uma chave ativa! Obtenha um ambiente ao vivo do Arch e siga o wiki de instalação chrootno Arch da mesma maneira que você fez na primeira vez.

Grub de fixação

De dentro do Arch, instale os pacotes grub relevantes e, em particular, os-proberpara permitir grub-installdetectar seu outro sistema. Siga cuidadosamente o guia de instalação e você poderá (pelo menos) inicializar o arch e o ubuntu no menu grub. A instalação de comandos terminará assim.

** Aviso ** Não execute estes comandos, eles são uma exemplificação, você precisa descobrir os adequados ao seu sistema

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

** Se todo o resto falhar **

Infelizmente, isso é tão específico quanto é dado o número limitado de informações e o SE não é realmente um fórum para esses problemas, portanto, minha resposta "genérica" ​​se refere a recursos úteis.

Se você não conseguir descobrir, talvez visite os fóruns do Arch e, desde que você tenha tentado o melhor e lido os documentos com antecedência, poderá encontrar ajuda.

Fazer tudo isso através do Arch foi uma experiência de aprendizado fundamental para mim.


1
Obrigado pela sua resposta. Primeiro, é um sistema BIOS com disco particionado MBR. Segundo, eu quero usar o pacote grub e a configuração do Ubuntu, reinstalar o GRUB do Arch não é o que planejo. Também duvido que isso faça alguma alteração ... E posso inicializar no Ubuntu através da entrada GRUB em algum lugar nas opções Avançadas. O problema é que, de alguma forma, o GRUB parece não ser capaz de determinar qual kernel ou ramdisk inicial ou o que pertence a qual sistema em qual partição.
Byte Commander

Essencialmente, as mesmas etapas se aplicam. grub-install e grub-mkconfig (que fazem de você um novo arquivo grub.cfg) são os comandos grub que também estão disponíveis no ubuntu. Verifique se o os-prober também está disponível ou algo similar (isso permite ao mkconfig encontrar outros sistemas de arquivos). Isso o corrige, assumindo que as imagens do kernel estão no lugar certo, relendo sua postagem. Não tenho certeza se esse é o caso. Inspecione sua partição / boot para garantir que todos os kernels e .img estejam lá. Você pode ter sobrescrito seu linux initrd.img com o initramfs do arch. Acesse os fóruns do ubuntu ou o askubuntu.
3 Diag

Como escrevi, executei o grub-mkconfig já sem sucesso, mas vou verificar as imagens disponíveis no / boot quando voltar para casa. E existem alguns scripts os-prober.
Byte Commander

Desculpe, perdi isso. Então você provavelmente substituiu seu kernel do ubuntu e initrd pelos do arch. Você pode pop-los no lugar, executando a sua seqüência de atualização / atualização do ubuntu fallback kernel (eu acho)
Três Diag

Os kernels do Ubuntu devem estar bem, pois eu posso inicializar todos eles no menu "Opções avançadas para o Ubuntu". Se algo estiver errado lá, pode ser apenas o link simbólico para o kernel padrão ... Vai verificar isso esta noite.
Byte Commander

0

Minha solução é mais simples. Eu uso o terminal e faço o seguinte:

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

Se você tiver mais problemas, basta usar boot-repair, que é um download gratuito, pequeno o suficiente para gravar em um disco de CD.


O OP já foi executado update-grub. É muito improvável que o reparo de inicialização ajude com esse problema específico.
terdon

O grub e alguns processos de reparo ou atualização de inicialização assumem que o que está em /boot/grub/grub.cfg é atraente e correto. Mas faça alterações, como uma reformatação de partição, você obtém um novo UUID, que o coloca no grub-rescue> Para lidar com isso, faça o seguinte: sudo rm /boot/grub/grub.cfg; sudo update-grub. Todas as entradas no grub.cfg serão novas e atuais.
BAD-Boop 07/05

Sim, mas novamente, o OP já fez isso e não ajudou. Sei que a pergunta é grande e é fácil errar, mas sudo grub-mkconfig -o /boot/grub/grub.cfgestá aí. update-grubé um shell script muito simples que é executado grub-mkconfig -o /boot/grub/grub.cfg . Você pode ver isso com cat /usr/sbin/update-grub.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.