Instale o VirtualBox enquanto mantém o Secure Boot

4

Estou tentando instalar o VirtualBox no Ubuntu 16.04 mantendo o Secure Boot. Quando o instalei no Synaptic, me pediram para remover o SecureBoot, eu disse No .

Eu segui estas instruções: Não foi possível carregar o 'vboxdrv' após a atualização para o Ubuntu 16.04 (e quero manter a inicialização segura) e link Ambos são praticamente os mesmos (deixei os arquivos MOK no diretório / root, como no segundo link). Tudo parece funcionar bem, eu reiniciei, coloquei minha senha novamente, reiniciei. Tudo de bom

Mas quando eu tento usar o VirtualBox, ele ainda não funciona. Se eu correr do terminal eu recebo:

WARNING: The character device /dev/vboxdrv does not exist.
     Please install the virtualbox-dkms package and the appropriate
     headers, most likely linux-headers-generic.

     You will not be able to start VMs until this problem is fixed.

Mas esses dois pacotes já estão instalados e atualizados.

Um dos comentários na primeira resposta da outra postagem diz para reinstalar virtualbox-dkms antes de seguir essas instruções. Eu tentei, e mesmo resultado.

Eu tentei a resposta aqui: o problema com a instalação do VirtualBox O que me pede novamente para perguntar se eu quero desabilitar o Secure Boot, para o qual eu digo No , e de volta à estaca zero.

Se eu executar modprobe , obtenho: modprobe: ERROR: could not insert 'vboxdrv': Required key not available

Alguma idéia de como fazer com que o VirtualBox funcione com o SecureBoot ativado (por favor, evite me dizer para removê-lo ...)?

obrigado

    
por ddeunagomez 14.05.2017 / 08:02

1 resposta

4

Eu não tentei nenhum desses procedimentos. No entanto, eu faço isso de uma maneira diferente - mas é um método muito tedioso. Esta descrição fará parecer mais fácil do que isso, porque eu me refiro a uma grande página que eu escrevi que cobre o pior das partes tediosas. Meu procedimento é:

  1. Assuma o controle da inicialização segura - no meu caso, configurei meu computador para que eu incorpore minha própria chave pública de inicialização segura no firmware. Dessa forma, não preciso usar Shim ou MOKs. Eu removi as chaves da Microsoft e adicionei as minhas próprias e as chaves da Canonical ao computador no qual eu uso este procedimento, mas você pode configurar as suas com as teclas que quiser. A parte crítica para os propósitos de sua pergunta é que você deve incluir uma chave que você gere, com uma chave privada que você retenha para fazê-la funcionar. Você também precisará das chaves usadas para assinar os componentes padrão - a chave da Canonical, a chave de mercado público da Microsoft ou ambas. Se você fizer uma dupla inicialização com o Windows, precisará da chave pública para a que a Microsoft usa para assinar seu próprio gerenciador de inicialização. Veja esta página minha para todos os detalhes sangrentos - mas esteja ciente de que este é um tedioso e procedimentos delicados, então você pode passar um bom tempo fazendo essa parte funcionar. Observe que a maioria dos UEFIs facilita bastante a restauração do conjunto de chaves padrão, portanto, o risco envolvido na tentativa desse procedimento é baixo.
  2. Assinar os módulos do VirtualBox - O próximo passo é assinar os módulos do kernel do VirtualBox. Isso é feito praticamente da mesma maneira que as páginas que você vinculou descrevem; no entanto, tenho um script para ajudar a automatizar esse processo (veja abaixo).
  3. Carrega o módulo do VirtualBox - Depois de assinar os módulos, eles devem ser carregados. Isso deve acontecer automaticamente na reinicialização; mas se você quiser usar o VirtualBox sem reinicializar, deve usar explicitamente modprobe para cada um dos módulos ( vboxdrv , vboxnetflt , vboxpci e vboxnetadp ).
  4. Repita os passos 2-3 após cada atualização do kernel - Após a atualização do kernel, os passos 2 e 3 devem ser repetidos.

Por conveniência, escrevi um script para executar as etapas 2 e 3 em um comando. Eu chamo de sign-vbox . Aqui está:

#!/bin/bash
# sign-vbox script, copyright (c) 2017 by Rod Smith
# Distributed under the terms of the GPLv3

if [ "$#" -ne 1 ] && [ "$#" -ne 0 ]; then
    echo "Usage: $0 [ {kernel-version} ]"
    exit 1
fi

if [ "$#" == 0 ]; then
    kernel_version=$(uname -r)
else
    kernel_version="$1"
fi

sign_file=$(find /usr/src/ -name sign-file | tail -n 1)

if [ -z $sign_file ]; then
    echo "Can't find the sign-file binary! Exiting!"
    exit 1
else
    path_to_modules="/lib/modules/$kernel_version/updates/dkms"

    if [ ! -f $path_to_modules/vboxdrv.ko ]; then
        echo "Could not find $path_to_modules/vboxdrv.ko!"
        echo "Is the kernel version correct?"
        exit 1
    fi

    echo "Signing modules for $kernel_version"
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxdrv.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetadp.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetflt.ko
    $sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxpci.ko
    modprobe vboxdrv
    modprobe vboxnetflt
    modprobe vboxpci
    modprobe vboxnetadp
    echo "Loaded vbox modules:"
    lsmod | grep vbox
fi

Para usar este script, basta digitar seu nome. Assina os módulos do VirtualBox associados ao kernel em execução no momento. Se você passar um número de versão do kernel, ele deve assinar os kernels associados a essa versão do kernel, mas não há espaço para erro ao especificar o número da versão do kernel. (Ele espera o mesmo formato que uname -r retornaria se o kernel estivesse em execução.)

Observe que o script espera encontrar chaves privadas ( refind_local.key ) e públicas ( refind_local.cer ) em /etc/refind.d/keys/ . Você precisará alterar esse local para o seu próprio sistema, a menos que você use o rEFInd e use as chaves locais para ele. O arquivo de chave privada deve ser tão seguro quanto você puder, como ter 0400 ( -r-------- ) permissões. Limitar o acesso ao diretório em si também pode ser útil. Melhor ainda, coloque-o em uma unidade flash USB que você conecte somente quando executar este comando.

Além disso, escrevi este script para meu uso pessoal. Provavelmente tem erros, especialmente se usados de uma maneira que eu não esperava. Certamente, ele falhará bastante se os arquivos de origem do kernel não estiverem instalados.

É concebível que este script funcione com os métodos baseados em MOK que você tentou usar se o apontasse para os arquivos de chaves que você gerou, o arquivo público do qual você carregou no MOK. Eu não posso prometer isso, porém, e é claro, seus problemas podem ser devidos a módulos do kernel ou problemas incorretamente assinados no final do Shim / MOK. Usar este script ajudaria apenas se os módulos do seu kernel não estivessem corretamente assinados.

    
por Rod Smith 14.05.2017 / 17:29