Ubuntu 16.04(Linux 内核 4.4)引起的在安全启动模式下无法打开 VMware 的问题

问题描述

在 Ubuntu 16.04 下,如果安装了VM之后可能会遇到打不开VM的问题,提示 /dev/vmmon 不存在的问题,如下图所示 :

Ubuntu 16.04 VM Error

如果使用 sudo /etc/init.d/vmware start 的话,会报错显示如下:

VM Error

 

问题分析

这主要是由于在安全启动模式下,linux 4.4 内核在加载驱动的时间会校验签名,并自动屏蔽掉没有签名的或签名不可信的驱动,然而VM加载的驱动(vmmon, vmnet)并没有任何签名,于是就出现了不可以使用的问题

 

解决问题

解决办法分为两种,一种是关闭安全启动(不推荐),另一种则是为VM的驱动手动添加可信签名,这里采取第二种办法:

生成签名

由于要添加可信签名到驱动,然而系统内置的可信签名只有公钥,私钥不可能共享出来,所以我们只能自己生成一个带公钥和私钥的签名了:

生成代码如下

openssl req -new -x509 -newkey rsa:2048 -keyout Uefi.priv -outform DER -out Uefi.der -nodes -days 36500 -subj "/CN=self_lutty/"

签名驱动

然后就是给驱动签名喽,驱动签名脚本 linux 内核已经提供,直接拿来使用(这里的目录结构为Ubuntu,如果为其他系统,结构可能需要自行调整)即可:

/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./Uefi.priv ./Uefi.der $(modinfo -n vmmon)
/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./Uefi.priv ./Uefi.der $(modinfo -n vmnet)

添加信任

签名已经完成了,但是我们的签名系统还是不信任的,那么,我们将签名加入到系统信任列表(这里使用工具 mokutil)中

mokutil --import Uefi.der

此步骤要求输入一个密码,这个密码会在稍后的步骤中使用

重启电脑

密码输入完成后重启电脑进入公钥导入工作

导入公钥

由于刚刚导入了新的公钥,这时间会触发 shim 操作,在蓝色的导入界面下选择 enroll key ,找到里面的 self_lutty ,然后按下回车,输入刚才的密码即可

如果密码输入正确,系统将会自动重新启动,启动完成后,VM应该可以正常启动了吧。

 

导入脚本

顺手写了一个导入脚本如下:

#!/bin/bash

apt update
apt dist-upgrade -y

openssl req -new -x509 -newkey rsa:2048 -keyout Uefi.priv -outform DER -out Uefi.der -nodes -days 36500 -subj "/CN=self_lutty/"
/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./Uefi.priv ./Uefi.der $(modinfo -n vmmon)
/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./Uefi.priv ./Uefi.der $(modinfo -n vmnet)

echo this password is important! please remember it !!

mokutil --import Uefi.der

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据