Проблема связана с версией gcc, которая не поддерживает retpoline (что такое retpoline и как она работает?). См. Ошибка Ubuntu: 4.4.0-116 Обновление ядра на 2/21 прерывает драйверы Nvidia (14.04 и 16.04).
В моем случае очистка ppa:ubuntu-toolchain-r/test для установки версии gcc по умолчанию и перестройка с помощью DKMS модуль nvidia (путем переустановки ядра 4.4.0-116) исправляет проблему. См. Что такое retpoline и как это работает? .
Восстановить значение по умолчанию gcc, очистив версию ppa:ubuntu-toolchain-r/test:
$ sudo apt-get install ppa-purge
$ sudo ppa-purge ppa:ubuntu-toolchain-r/test
версия gcc (на Ubuntu 16.04) с поддержкой retpoline:
$ 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 с вашей версией - просто нажмите TAB после modinfo nvidia
retpoline должен быть на выходе.
После этого успешно завершена reboot.
Если у вас уже есть совместимая версия gcc, вы можете перестроить модуль nvidia с помощью команды dkms, не переустанавливая ядро:
# dkms remove nvidia-xxx/yyy.zzz -k 4.4.0-116-generic
# dkms install nvidia-xxx/yyy.zzz -k 4.4.0-116-generic
Я решил переустановить ядро вместо этого обновите все модули, которые были перестроены с помощью DKMS, используя неправильную версию gcc.
Если вы хотите проверить, установлен ли какой-либо инструмент, который вы запускаете из командной строки, следующая строка:
if [ "`which someCommand`" = "" ]
Команда which проверяет полное имя файла исполняемого файла someCommand, и если файл не найден, выполняется оператор if.
Однако это предполагает, что someCommand - это команда, которую вы можете запустить из командной строки (терминал и т. д.), .
В вашем случае вы, вероятно, захотите проверить, существует ли файл /usr/share/perl5/getopts.pl.
В соответствии с этим вопросом это можно сделать, используя следующую проверку:
Этот оператор проверяет, существует ли какой-либо файл не ...
Если вы хотите проверить, установлен ли какой-либо инструмент, который вы запускаете из командной строки, следующая строка:
if [ "`which someCommand`" = "" ]
Команда which проверяет полное имя файла исполняемого файла someCommand, и если файл не найден, выполняется оператор if.
Однако это предполагает, что someCommand - это команда, которую вы можете запустить из командной строки (терминал и т. д.), .
В вашем случае вы, вероятно, захотите проверить, существует ли файл /usr/share/perl5/getopts.pl.
В соответствии с этим вопросом это можно сделать, используя следующую проверку:
if [ ! -f /usr/share/perl5/getopts.pl ]
Этот оператор проверяет, существует ли какой-либо файл не ...
Если вы хотите проверить, установлен ли какой-либо инструмент, который вы запускаете из командной строки, следующая строка:
if [ "`which someCommand`" = "" ]
Команда which проверяет полное имя файла исполняемого файла someCommand, и если файл не найден, выполняется оператор if.
Однако это предполагает, что someCommand - это команда, которую вы можете запустить из командной строки (терминал и т. д.), .
В вашем случае вы, вероятно, захотите проверить, существует ли файл /usr/share/perl5/getopts.pl.
В соответствии с этим вопросом это можно сделать, используя следующую проверку:
if [ ! -f /usr/share/perl5/getopts.pl ]
Этот оператор проверяет, существует ли какой-либо файл не ...