Por que minha partição grub independente do sistema operacional é capaz de inicializar corretamente no Ubuntu usando uma versão mais antiga do kernel, mas não com uma versão mais recente?

Por que minha partição grub independente do sistema operacional é capaz de inicializar corretamente no Ubuntu usando uma versão mais antiga do kernel, mas não com uma versão mais recente?

Eu tenho um único disco rígido com a seguinte configuração de partição: insira a descrição da imagem aqui

  • sda1 e 2 são partições do Windows
  • sda4 é uma partição estendida contendo as partições lógicas sda5&6
  • sda5 é a partição swap para o Ubuntu
  • sda6 é a partição raiz do Ubuntu (versão 20.04)
  • sda3 é uma partição que contém apenas arquivos grub, o computador inicializa a partir daqui e carrega em cadeia o Windows ou os bootloaders do Ubuntu, dependendo do que está selecionado no menu grub

Basicamente, tenho tentado personalizar meu menu grub usando o Grub Customizer, uma interface gráfica para editar os arquivos de configuração do grub e gerar o grub.cfg. Embora tenha sido personalizado com sucesso com uma duração de tempo limite diferente e uma imagem de fundo, depois de escolher inicializar no Ubuntu, ele eventualmente trava mostrando o seguinte log "[OK]" (não sei como chamá-lo): insira a descrição da imagem aqui

Observe que ainda posso fazer login neste momento sem GUI usando ctrl+alt+f2.

Usei o comando diff para confirmar que o Grub Customizer gera o mesmo grub.cfg que o comando grub-mkconfig (quase equivalente a update-grub de acordo comesta discussão), de modo que isolou o problema na própria configuração do grub. Depois de usar o kdiff3 e experimentar extensivamente, descobri que se eu alterasse manualmente a entrada do menu do ubuntu no grub.cfg (aquele na partição do grub, é claro) da seguinte maneira, o problema desapareceria, mantendo as personalizações desejadas:

inicialização com defeito:

### BEGIN /etc/grub.d/10_linux_proxy ###

function gfxmode {
    set gfxpayload="${1}"
    if [ "${1}" = "keep" ]; then
        set vt_handoff=vt.handoff=7
    else
        set vt_handoff=
    fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode



menuentry "Ubuntu" --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c1cf0131-85a4-4147-b74c-38df34cd47cc' {
    recordfail
    savedefault
    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,msdos6'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 --hint='hd0,msdos6'  c1cf0131-85a4-4147-b74c-38df34cd47cc
    else
      search --no-floppy --fs-uuid --set=root c1cf0131-85a4-4147-b74c-38df34cd47cc
    fi
    linux   /boot/vmlinuz-5.4.0-45-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
    initrd  /boot/initrd.img-5.4.0-45-generic
}
### END /etc/grub.d/10_linux_proxy ###

inicialização de trabalho:

...
    linux   /boot/vmlinuz-5.4.0-42-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
    initrd  /boot/initrd.img-5.4.0-42-generic
}
### END /etc/grub.d/10_linux_proxy ###

(Eu simplesmente mudei vmlinuz-5.4.0-45-generic e initrd.img-5.4.0-45-generic para vmlinuz-5.4.0-42-generic e initrd.img-5.4.0-42-generic respectivamente)

Eu gostaria de:

  1. saiba como usar as imagens 5.4.0-42 em vez das 5.4.0-45 faz alguma diferença
  2. encontre as opções corretas de configuração do grub que funcionam com os "45s", para que eu não precise editar o grub.cfg manualmente toda vez que quiser personalizá-lo.

ATUALIZAÇÃO 11:31 UTC+2, 09/09/20: Há apenas uma hora baixei o novo kernel do Linux (5.4.0-47) e tentei usá-lo para inicializar, mas apareceu o mesmo problema do 5.4.0-45. Então editei o grub.cfg de volta para 5.4.0-42. Então agora tenho 3 kernels diferentes disponíveis para uso: 5.4.0-{42,45,47}. Apenas uma ideia, mas considerando que o desktop gnome parece iniciar com sucesso de acordo com o log de inicialização "[OK]" (ainda não sei qual é o nome), não é esse o principal suspeito? Isso e o daemon da nvidia falhando mais perto do topo do log.

ATUALIZAÇÃO 13:14 UTC+2 09/09/20: Aqui está o resultado sudo systemctl status nvdia-persistenced.serviceapós uma falha na inicialização da GUI:

● nvidia-persistenced.service - NVIDIA Persistence Daemon
     Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; static; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2020-09-09 11:54:44 EEST; 1min 43s ago
    Process: 876 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced --no-persistence-mode --verbose (code=exited, status=1/FAILURE)
    Process: 896 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced (code=exited, status=0/SUCCESS)

Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Failed to query NVIDIA devices. Please ensure that the NVIDIA device files (/dev/nvidia*) exist, and that user 126 has read and write permissions for those files.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file unlocked.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file closed.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: The daemon no longer has permission to remove its runtime data directory /var/run/nvidia-persistenced
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[876]: nvidia-persistenced failed to initialize. Check syslog for more details.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Shutdown (882)
Σεπ 09 11:54:42 george-Aspire-E5-571G systemd[1]: Starting NVIDIA Persistence Daemon...
Σεπ 09 11:54:43 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Control process exited, code=exited, status=1/FAILURE
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Failed with result 'exit-code'.
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: Failed to start NVIDIA Persistence Daemon.

Responder1

Acontece que eu estava executando uma versão mais antiga do driver da Nvidia que não era compatível com os kernels mais recentes. Remover os drivers antigos da nvidia e instalar os mais novos dos repositórios do Ubuntu resolveu o problema.

Supondo que o driver da nvidia fosse o culpado, executei uma manobra de alto risco e alta recompensa executando este script (versão ligeiramente modificada de um encontradoaqui) para desinstalar todos os drivers da nvidia e instalar os mais novos dos repositórios do Ubuntu:

#!/bin/bash

sudo apt remove --purge '^nvidia-.*' -y
sudo apt install ubuntu-desktop -y
sudo apt --purge remove "*cublas*" "cuda*" -y
sudo apt --purge remove "*nvidia*" -y
sudo add-apt-repository --remove ppa:graphics-drivers/ppa -y
sudo trash /etc/X11/xorg.conf
sudo apt autoremove -y

sudo ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
sudo reboot

Depois de instalar os novos drivers da nvidia, não modifiquei o grub.cfg para usar o kernel mais novo (5.0.4-47) para ver como o kernel mais antigo (5.0.4-42) funcionaria. Isso resultou no mesmo erro descrito na pergunta. Depois disso, mudei a versão do kernel em grub.cfg para 5.0.4-47 e finalmente consegui inicializar corretamente o desktop gnome.

Minha conclusão é que afinal o problema foi causado pela incompatibilidade entre o kernel do Linux e o driver gráfico da nvidia. Se você tiver um problema semelhante, sugiro manter o kernel do Linux e os drivers gráficos atualizados, reinstalando os drivers da nvidia se necessário.

informação relacionada