web-dev-qa-db-fra.com

boucle de connexion après la mise à niveau vers la version 4.4.0-116 du noyau: écran de connexion graphique -> écran noir -> écran de connexion graphique

Impossible de se connecter à l'environnement de bureau après apt upgrade && reboot: lors de la saisie du mot de passe, l'écran scintille en un écran noir et revient à l'écran de connexion. Connexion via le terminal (Ctrl+Alt+F1) fonctionne bien.

/var/log/Xorg.0.log dit:

(EE) NVIDIA: Échec d'initialisation du module de noyau NVIDIA. S'il vous plaît voir le
(EE) NVIDIA: journal du noyau du système pour d’autres messages d’erreur et
(EE) NVIDIA: consultez le fichier NVIDIA README pour plus de détails.
(EE) Aucun périphérique détecté.

$ dmesg dit:

nvidia: la version magique '4.4.0-116-générique SMP mod_unload modversions' devrait être '4.4.0-116-générique SMP mod_unload modversions retpoline'

La tentative de chargement manuel du pilote nvidia échoue:

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

Connexes: VirtualBox ne démarre pas après la mise à niveau du noya

5
jfs

Le problème concerne la version de gcc qui ne prend pas en charge retpoline ( Qu'est-ce qu'une rétpoline et comment ça marche? ). Voir le bogue Ubuntu: 4.4.0-116 La mise à jour du noyau sur 2/21 rompt les pilotes Nvidia (les 14.04 et 16.04) .

Dans mon cas, purger ppa:ubuntu-toolchain-r/test pour installer la version par défaut de gcc et reconstruire avec DKMS le module nvidia (en réinstallant le noyau 4.4.0-116) corrige le problème. Voir instructions postées par @cjjefcoat sur le traqueur de bugs .

Restaurez gcc par défaut en purgeant la version de ppa:ubuntu-toolchain-r/test:

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

version gcc (sur Ubuntu 16.04) avec support retpoline:

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

Réinstallez le noyau:

$ 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

Vérifiez le module nvidia:

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

remplacez _xxx par votre version - appuyez simplement sur TAB après modinfo nvidia

retpoline devrait être dans la sortie.

Après que reboot se soit terminé avec succès.


Si vous avez déjà une version compatible de gcc, vous pouvez reconstruire le module nvidia à l'aide de la commande dkms sans réinstaller le noyau:

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

J'ai décidé de réinstaller le noyau pour mettre à jour tous les modules reconstruits avec DKMS en utilisant une version incorrecte de gcc.

8
jfs

Je ne sais pas si Ask Ubuntu est un endroit approprié pour cette merde, mais - comme j'ai besoin de nouveau g++ et que je mets régulièrement à jour le noyau - j'ai a écrit un script bash qui (1) purge ppa:ubuntu-toolchain-r/test, (2) reconstruit tous les modules DKMS pour les noyaux choisis, (3) installe g++-7 en retour - par cette réponse .

Le script est fourni "en l'état", sans garantie d'aucune sorte.
S'il vous plaît, ne l'utilisez pas si vous ne comprenez pas la signification de chaque ligne.
Il est conçu pour gagner du temps lorsque vous effectuez des tâches que vous êtes capable de faire manuellement (pas pour faire de la "magie" que vous ne comprenez pas).

Le scénario:

#!/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#^([^,]+), ([^,]+), .*$#\1/\2#'))
    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
1
Sasha