loop de login após a atualização para o kernel 4.4.0-116: tela de login gráfica - tela preta - tela de login gráfica

4

Não é possível fazer login no ambiente de área de trabalho após apt upgrade && reboot : ao digitar a senha, a tela pisca em uma tela preta e retorna à tela de login. O login através do terminal ( Ctrl + Alt + F1 ) funciona bem.

/var/log/Xorg.0.log diz:

  

(EE) NVIDIA: Falha ao inicializar o módulo do kernel da NVIDIA. Por favor, veja o
  (EE) NVIDIA: log do kernel do sistema para mensagens de erro adicionais e
  (EE) NVIDIA: consulte o NVIDIA README para detalhes.
  (EE) Nenhum dispositivo detectado.

$ dmesg diz:

  

nvidia: version magic '4.4.0-116-genérico SMP mod_unload modversions' deve ser '4.4.0-116-genérico SMP mod_unload modversions retpoline'

Tentando carregar o driver nvidia manualmente falha:

$ sudo modprobe nvidia
modprobe: ERROR: could not insert 'nvidia': Exec format error

Relacionados: VirtualBox não inicia após atualização do kernel

    
por jfs 25.02.2018 / 21:20

2 respostas

7

O problema está na versão do gcc que não suporta retpolina ( O que é uma retpolina e como funciona? ). Veja o bug do Ubuntu: 4.4.0-116 Atualização do kernel em 2/21 quebra Nvidia drivers (em 14.04 e 16.04) .

No meu caso, limpando ppa:ubuntu-toolchain-r/test para instalar a versão padrão do gcc e reconstruindo com o DKMS, o módulo nvidia (reinstalando o kernel 4.4.0-116) corrige o problema. Veja as instruções postadas por @cjjefcoat no rastreador de bugs .

Restaurar o gcc padrão removendo a versão de ppa:ubuntu-toolchain-r/test :

$ sudo apt-get install ppa-purge
$ sudo ppa-purge ppa:ubuntu-toolchain-r/test

versão gcc (no Ubuntu 16.04) com suporte à retpolina:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

Reinstalar o kernel:

$ sudo apt-get purge linux-headers-4.4.0-116 linux-headers-4.4.0-116-generic linux-image-4.4.0-116-generic linux-image-extra-4.4.0-116-generic linux-signed-image-4.4.0-116-generic
$ sudo apt-get install linux-generic linux-signed-generic

Verifique o módulo nvidia:

$ modinfo nvidia_xxx -k 4.4.0-116-generic | grep vermagic
vermagic:       4.4.0-116-generic SMP mod_unload modversions retpoline 

substitua _xxx pela sua versão - basta pressionar TAB após modinfo nvidia

retpoline deve estar na saída.

Depois disso, reboot foi concluído com sucesso.

Se você já tem uma versão gcc compatível, você pode reconstruir o módulo nvidia usando o comando dkms sem reinstalar o kernel:

# dkms remove nvidia-xxx/yyy.zzz -k 4.4.0-116-generic
# dkms install nvidia-xxx/yyy.zzz -k 4.4.0-116-generic

Eu decidi reinstalar o kernel ao invés de atualizar todos os módulos que foram re-compilados com o DKMS usando uma versão errada do gcc.

    
por jfs 25.02.2018 / 21:20
1

Eu não sei se o Ask Ubuntu é um lugar correto para essa merda, mas - como eu preciso de novo g++ e ainda atualizo periodicamente o kernel - eu escrevi um script bash que (1) expurga ppa:ubuntu-toolchain-r/test , (2) reconstrói todos os módulos DKMS para os kernels escolhidos, (3) instala g++-7 de volta - por esta resposta .

O script é fornecido "como está", sem garantias de qualquer tipo.
Por favor, não o use a menos que você entenda o significado de cada linha.
Ele é destinado a economizar tempo ao fazer coisas que você pode fazer manualmente (não para fazer "mágica" que você não entende).

O script:

#!/bin/bash -e

for list in /etc/apt/sources.list.d/ubuntu-toolchain-r*.list; do
    sudo cp -a "$list" "$list.backup"
    echo "Backed up $list to $list.backup"
done
sudo ppa-purge ppa:ubuntu-toolchain-r/test

readarray -t kernels < <(ls -1 /lib/modules)
echo "Kernels: ${kernels[*]}"
for kernel in "${kernels[@]}"; do
    dkms_modules=($(sudo dkms status -k "$kernel" | sed -r 's#^([^,]+), ([^,]+), .*$#/#'))
    while true; do
        echo
        read -p "Reinstall DKMS-modules (${dkms_modules[*]}) on kernel $kernel? [Y/n] " choice
        if [ "${choice^^}" = N ]; then continue 2; fi
        if [ "${choice^^}" = Y ] || [ -z "$choice" ]; then break; fi
        echo "Expected 'y', 'n' or '', but got '$choice'"
    done
    echo
    for dkms_module in "${dkms_modules[@]}"; do
        sudo dkms remove -k "$kernel" "$dkms_module"
        sudo dkms install -k "$kernel" "$dkms_module"
    done
    echo
    for module in /lib/modules/"$kernel"/updates/dkms/*.ko; do
        vermagic="$(modinfo -F vermagic $module)"
        echo -n "Vermagic for $(basename ${module%.ko}): $vermagic -- "
        fgrep -q retpoline <<<"$vermagic" && echo ok || echo "'retpoline' is missing!!!"
    done
done

for list in /etc/apt/sources.list.d/ubuntu-toolchain-r*.list; do
    sudo mv "$list.backup" "$list"
    echo "Restored $list from $list.backup"
done
sudo apt update
sudo apt install g++-7
sudo apt dist-upgrade
    
por Sasha 23.04.2018 / 13:23