VirtualBox + Secure Boot + Ubuntu 18.04 = fail. Или как запустить VirtualBox на Ubuntu с UEFI

Сегодня напоролся на одну, весьма неприятную, особенность работы Secure Boot на Ubuntu (C которой работаю весьма мало, и чисто для работы). Дали мне значит ноут на недельку поработать, а так как я ленивая ж…,  у меня почти максимально автоматизирован процес разворачивания проекта (docker) на любой машине, я не долго думая начал наворачивать всесь необходимый софт, для запуска всего зоопарка, да не тут то было. Вроде все установил, вроде все хорошо, давай я такой docker-machine create –driver virtualbox default, а он мне в ответ: “Дай нормальный VirtualBox, а то работать не буду”. Ну и давай переустанавливать, копать интернет и т.д. Вообщем дальше опишу все, что делал.

Проблема заключалась в том, что все модули ядра, должны быть подписаны ключом, которым доверяет система UEFI, иначе загрузка неудастся. Ubuntu же не подписывает сторонние модули, такие как vbox*, который мне нужен, но дает возможность отключить Secure Boot после установки пакета. Конечно, можно бы было отключить Secure Boot, UEFI и еще много другого, но не тут то было. Почувствовав себя простым юзером, которому не дали пароль от биоса (благо рута дали), пришлось искать другие пути решения проблемы. Ко всему прочему на лептопе стояла еще и Windows 10, которая без UEFI перестала бы загружаться вовсе.

Подопытный: Ubuntu 18.04, Asus ZenBook UX430, Secure Boot, UEFI

Отсылки к решению проблемы на Redhat

http://gorka.eguileor.com/vbox-vmware-in-secureboot-linux-2016-update/

И вопросы на AskUbuntu

http://askubuntu.com/questions/760671/could-not-load-vboxdrv-after-upgrade-to-ubuntu-16-04-and-i-want-to-keep-secur

Шаги по запуску Virtualbox на Ubuntu/Debian с Secure Boot

  1. Устанавливаем пакет virtualbox. Если установщик определит что Secure Boot включен ,вам будет предоставлена возможность отключить безопасную загрузку. Выберите «Нет».
  2. Создаем персональную связку публичного/приватного RSA ключа, который позволит загружать модули ядра. Я выбрал директорию /root/module-signin/ для хранения ключей.
    $ sudo -i
    # mkdir /root/module-signing
    # cd /root/module-signing
    # openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOUR_NAME/"
    [...]
    # chmod 600 MOK.priv
  3. Использывал MOK (“Machine Owner Key”) утилиту для импорта открытого ключа, чтобы система могла доверять ему. Это двухэтапный процесс, когда ключ сначала импортируется, а затем должен быть зарегистрирован, когда машина будет загружатся в слудующий раз. Достаточно использовать простой пароль, так как он предназначен только для временного использования.
    # mokutil --import /root/module-signing/MOK.der
    input password:
    input password again:
  4. Перезагружаем машину. Когда запуститься bootloader, утилита MOK менеджера EFI должна автоматически запустится. Он запросит пароль, установленный на шаге 3. Выбирем «Enroll MOK», затем ключ, импортированный на шаге 3. Завершаем шаги регистрации, а затем продолжаем загрузку. Ядро Linux будет регистрировать загружаемые ключи, и вы сможете увидеть свой ключ с помощью команды: dmesg | grep ‘EFI: Loaded cert’
  5. Используя утилиту подписи, поставляемую с файлами сборки ядра, подписываем все модули VirtualBox, используя закрытый MOKключ, сгенерированный на шаге 2. Помещаем это в маленький скрипт /root/module-signature/sign-vbox-modules, что бы запускать, когдаустанавливаются новые ядра как часть регулярных обновлений:
    #!/bin/bash
    
    for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
      echo "Signing $modfile"
      /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \
                                    /root/module-signing/MOK.priv \
                                    /root/module-signing/MOK.der "$modfile"
    done
    # chmod 700 /root/module-signing/sign-vbox-modules
  6. Запускаем скрипт с шага 5 от рута. Нужно будет запускать скрипт подписи каждый раз, когда будет установлено новое обновление ядра, поскольку это приведет к перестройке сторонних модулей VirtualBox. Используйте сценарий только после загрузки нового ядра, поскольку он использует modinfo -n и uname -r, чтобы указать, какую версию ядра нужно подписать.
  7. Загрузим модуль vboxdrv и запустим Virtualbox
    # modprobe vboxdrv

     

Вышеописанная процедура может быть использована для подписи любово стороннего модуля, например nvidia graphics drivers, если понадобиться (предположение).

 

“Незабываем ставить лайки, подписываться на канал, и писать в коментарии, помог ли метод решить проблему”Related image

комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.