it-swarm.com.de

Anmeldeschleife nach dem Upgrade auf 4.4.0-116 Kernel: grafischer Anmeldebildschirm -> schwarzer Bildschirm -> grafischer Anmeldebildschirm

Anmeldung in der Desktop-Umgebung nach apt upgrade && reboot nicht möglich: Nach Eingabe des Kennworts flackert der Bildschirm auf einem schwarzen Bildschirm und kehrt zum Anmeldebildschirm zurück. Login über das Terminal (Ctrl+Alt+F1) funktioniert gut.

/var/log/Xorg.0.log sagt:

(EE) NVIDIA: NVIDIA-Kernelmodul konnte nicht initialisiert werden. Bitte sehen Sie sich ... an
(EE) NVIDIA: Systemkernprotokoll für zusätzliche Fehlermeldungen und
(EE) NVIDIA: Einzelheiten finden Sie in der NVIDIA README.
(EE) Keine Geräte erkannt.

$ dmesg sagt:

nvidia: version magic '4.4.0-116-generic SMP mod_unload modversions' sollte '4.4.0-116-generic SMP mod_unload modversions retpoline' sein

Der Versuch, den nvidia-Treiber manuell zu laden, schlägt fehl:

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

Verwandte: VirtualBox startet nach Kernel-Upgrade nicht

5
jfs

Das Problem ist, dass die gcc-Version kein Retpoline unterstützt ( Was ist ein Retpoline und wie funktioniert es? ). Siehe Ubuntu-Fehler: 4.4.0-116 Kernel-Update auf 2/21 bringt Nvidia-Treiber zum Erliegen (auf 14.04 und 16.04) .

In meinem Fall behebt das Löschen von ppa:ubuntu-toolchain-r/test, um die Standard-GCC-Version zu installieren, und das Neuerstellen des NVIDIA-Moduls mit DKMS (durch Neuinstallation des Kernels 4.4.0-116) das Problem. Siehe Anweisungen von @cjjefcoat im Bug-Tracker .

Stellen Sie den Standard-gcc wieder her, indem Sie die Version von ppa:ubuntu-toolchain-r/test löschen:

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

gcc version (unter Ubuntu 16.04) mit retpoline unterstützung:

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

Kernel neu installieren:

$ 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

Überprüfen Sie das NVIDIA-Modul:

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

ersetze _xxx durch deine Version - drücke einfach TAB nach modinfo nvidia

retpoline sollte in der Ausgabe sein.

Danach wurde reboot erfolgreich abgeschlossen.


Wenn Sie bereits eine kompatible gcc-Version haben, können Sie das nvidia-Modul mit dem Befehl dkms neu erstellen, ohne den Kernel erneut zu installieren:

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

Ich habe beschlossen, den Kernel neu zu installieren, um alle Module zu aktualisieren, die mit DKMS unter Verwendung einer falschen gcc-Version neu erstellt wurden.

8
jfs

Ich weiß nicht, ob Ask Ubuntu der richtige Ort für diese Scheiße ist, aber - da ich einen neuen g++ benötige und den Kernel dennoch regelmäßig aktualisiere - Ich habe ein Bash-Skript geschrieben, das (1) ppa:ubuntu-toolchain-r/test löscht, (2) alle DKMS-Module für ausgewählte Kernel neu erstellt, (3) g++-7 back - per diese Antwort .

Das Skript wird "wie besehen" bereitgestellt, ohne jegliche Gewährleistung.
Bitte verwenden Sie es nur, wenn Sie die Bedeutung jeder Zeile verstehen.
Es soll Zeit sparen, wenn Sie Dinge tun, die Sie manuell tun können (nicht für "Magie", die Sie nicht verstehen).

Das Drehbuch:

#!/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