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
問題は、レトポリンをサポートしていない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で再構築されたすべてのモジュールを更新することにしました。
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