Я только что обновил свою систему с 15.10 до 16.04 через sudo do-release-upgrade
. Во время этого процесса он вывел экран со следующим сообщением:
В вашей системе включена функция UEFI Secure Boot. UEFI Secure Boot несовместима с использованием сторонних драйверов.
(...) Ubuntu по-прежнему сможет загружаться на вашей системе, но эти сторонние драйверы будут недоступны для вашего оборудования.
Отключить UEFI Secure Boot? (да | нет)
Поскольку единственные сторонние драйверы, которые я использую, это графические драйверы NVIDIA, и поскольку они отлично работают с Ubuntu 15.10 и включенной функцией Secure Boot, я выбрал здесь вариант «нет». Я не вижу, почему я должен отключать это без веской причины, и я предположил, что могу просто переустановить сторонний драйвер через графический интерфейс системных настроек после обновления.
Увы, нет. После перезагрузки мой экран входа оказался в очень низком разрешении. При попытке входа меня сразу же выкидывает на экран входа.
Чтобы исправить ситуацию, я попробовал сделать следующее:
sudo apt-get purge nvidia*
sudo reboot
Это приводит к фиолетовому экрану и никакой реакции на Ctrl-Alt-F1. Зайдя через SSH, я сделал следующее:
sudo apt-get install nvidia-current
sudo reboot
что снова возвращает меня к предыдущему сценарию с экраном входа в систему очень низкого разрешения и отсутствием возможности войти в систему.
Это довольно плохой опыт обновления. У кого-нибудь еще было такое, и что я могу сделать, чтобы это исправить? (при включенном UEFI Secure Boot) Спасибо.
решение1
В Ubuntu 15.10 обработка Secure Boot в Ubuntu остановилась на GRUB — то есть версия Shim в Ubuntu запускала версию GRUB в Ubuntu, которая запускалалюбойЯдро Linux, независимо от того, было ли оно подписано. Это была очень низкая планка поддержки Secure Boot. Для сравнения, GRUB Fedora запускал только подписанные ядра Linux, а ядра Fedora, когда обнаруживали, что Secure Boot активен, загружали только подписанные двоичные файлы ядра. Целью более надежной поддержки Secure Boot в Fedora была защита системы от «мошеннических» модулей ядра, которые могли, теоретически, захватить компьютер на очень низком уровне. Ubuntu 15.10 и более ранние версии не имели такой защиты.
Начиная с версии 16.04, Ubuntu следует более строгому модулю Secure Boot, больше похожему на то, что Fedora делает уже довольно давно. Это дает преимущества в плане безопасности, но, как вы видели, у него также есть проблемы. Если сторонний драйвер не подписан криптографическим ключом, который версия ядра Linux для Ubuntu распознает как действительный, он не будет загружен. Это в основном влияет на закрытые видеодрайверы Nvidia и AMD/ATI, но есть и другие драйверы, которые также могут быть затронуты.
Есть (или может быть) несколько способов решения этой проблемы:
- Отключить безопасную загрузку-- Это самое простое решение. Вы можете сделать это, повозившись с настройками прошивки или (я думаю) настроив параметры Shim. (Я не уверен, как это сделать, настроив параметры Shim, но я почти уверен, что это возможно.)
- Не используйте сторонние модули ядра-- Если вы ограничитесь драйверами с открытым исходным кодом, включенными в стандартное ядро Linux Ubuntu, то все будет в порядке, поскольку Canonical подписывает все такие драйверы (AFAIK). Обратите внимание, что должна быть довольно хорошая поддержка Nvidia, использующей такие драйверы; ваша система, вероятно, вернулась к неоптимальным драйверам, поскольку посчитала, что доступны драйверы с закрытым исходным кодом. Я не знаю навскидку, как переключиться с одного на другой, ноэтот вопросречь идет о том, как это сделать с драйверами AMD/ATI, поэтому это может быть полезной отправной точкой.
- Подпишите соответствующие модули-- Теоретически, самостоятельное подписание коммерческих модулей должно заставить их работать. К сожалению, у меня нет указателя на инструкции, как это сделать, и на самом деле я даже не совсем уверен, что это возможно сделать с базовым ядром Ubuntu; такое ядро может принимать только модули, подписанные ключом Canonical, которого у вас, конечно, нет.
- Скомпилируйте свое собственное ядро-- Если вы компилируете собственное ядро, вы можете установить его параметры по своему усмотрению, включая ослабление ограничений на загрузку неподписанных модулей. Затем вам нужно будет подписать ядро собственным ключом EFI и добавить публичную версию этого ключа в свой список MOK.Вотвопросы и ответы о компиляции собственного ядра.
- Переключиться на старую версию GRUB-- Поскольку старый GRUB будет запускать неподписанные ядра, вы можете установить такой GRUB (из Ubuntu 15.10 или более ранней версии) и заставить его запускать неподписанное ядро. Обратите внимание, что поддержка этого старого GRUB, скорее всего, будет мучением.
- Переключитесь на загрузчик, который не поддерживает Secure Boot-- Если бы вы подписали загрузчик типа SYSLINUX или ELILO своим собственным ключом и добавили публичную версию этого ключа в свой список MOK, этот загрузчик проигнорировал бы настройки Secure Boot, как и старая версия GRUB. Затем вы могли бы запустить неподписанное ядро.
Обратите внимание, что единственные два из этих вариантов, в которых я на 100% уверен, сработают, — это отключение Secure Boot или отказ от сторонних модулей ядра. Я избегаю сторонних модулей ядра как чумы, поэтому у меня нет личного опыта использования их в среде Secure Boot. Помимо отключения Secure Boot, сборка собственного ядра может быть следующим по вероятности сработать, за которым следует использование старого GRUB или использование загрузчика, который не поддерживает Secure Boot. Сборка собственного ядра когда-то была обычным делом, но мало кто этим занимается сейчас, а с современными ядрами затраты времени на изучение того, как настроить ядро, не говоря уже о том, чтобы сделать это, могут быть значительными. Использование старого GRUB или другого загрузчика может быть проще, но вам нужно будет знать достаточно, чтобы иметь возможность настроить его. Вероятно, более простым способом будет двойная загрузка со старой версией Ubuntu, которую вы установите второй, но учтите, что Ubuntu 16.04, скорее всего, в какой-то момент восстановит свой GRUB, после чего вам придется переустановить GRUB старой версии Ubuntu.