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
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.
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