web-dev-qa-db-ja.com

4.4.0-116カーネルにアップグレードした後のログインループ:グラフィカルログイン画面->黒い画面->グラフィカルログイン画面

apt upgrade && rebootの後にデスクトップ環境にログインできない:パスワードを入力すると、画面がちらつき、ログイン画面に戻ります。端末からログイン(Ctrl+Alt+F1) 正常に動作します。

/var/log/Xorg.0.logのコメント:

(EE)NVIDIA:NVIDIAカーネルモジュールの初期化に失敗しました。をご覧ください
(EE)NVIDIA:追加のエラーメッセージとシステムのカーネルログ
(EE)NVIDIA:詳細については、NVIDIA READMEを参照してください。
(EE)デバイスは検出されません。

$ dmesgのコメント:

nvidia:バージョンマジック「4.4.0-116-generic SMP mod_unload modversions」は「4.4.0-116-generic SMP mod_unload modversions retpoline」である必要があります

Nvidiaドライバーを手動でロードしようとすると失敗します。

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

関連: カーネルのアップグレード後にVirtualBoxが起動しない

5
jfs

問題は、レトポリンをサポートしていないgccバージョンにあります( レトポリンとは何ですか? )。 Ubuntuのバグを参照してください: 4.4.0-116 2/21のカーネルアップデートにより、Nvidiaドライバーが壊れます(14.04および16.04)

私の場合、ppa:ubuntu-toolchain-r/testをパージしてデフォルトのgccバージョンをインストールし、DKMSでnvidiaモジュールを(4.4.0-116カーネルを再インストールすることで)再構築すると、問題が修正されます。バグトラッカーに@cjjefcoatが投稿した の手順を参照してください

ppa:ubuntu-toolchain-r/testのバージョンをパージして、デフォルトのgccを復元します。

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

retpolineをサポートするgccバージョン(Ubuntu 16.04):

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

カーネルを再インストールします。

$ 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

Nvidiaモジュールを確認します。

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

_xxxをご使用のバージョンに置き換えます。modinfo nvidiaの後にTabキーを押すだけです

retpolineは出力にあるはずです。

その後、rebootは正常に完了しました。


互換性のあるgccバージョンがある場合は、カーネルを再インストールせずにdkmsコマンドを使用してnvidiaモジュールを再構築できます。

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

カーネルを再インストールする代わりに、間違ったgccバージョンを使用してDKMSで再構築されたすべてのモジュールを更新することにしました。

8
jfs

Ask Ubuntuがそのたわごとの正しい場所であるかどうかはわかりませんが、私がneed new g++であり、カーネルを定期的に更新しているので、bashスクリプトを書きました( 1)ppa:ubuntu-toolchain-r/testをパージし、(2)選択したカーネルのすべてのDKMSモジュールを再構築します。(3)g++-7をインストールしますback — この回答ごと

スクリプトは「現状のまま」提供され、いかなる種類の保証もありません。
すべての行の意味を理解しない限り、使用しないでください。
手動でできることをするときの時間を節約するためのものです(理解できない「魔法」をするためではありません)。

スクリプト:

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