Ubuntu 16.04(Linux 内核 4.4)引起的在安全启动模式下无法打开 VMware 的问题
问题描述
在 Ubuntu 16.04 下,如果安装了VM之后可能会遇到打不开VM的问题,提示 /dev/vmmon 不存在的问题,如下图所示 :
如果使用 sudo /etc/init.d/vmware start 的话,会报错显示如下:
问题分析
这主要是由于在安全启动模式下,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
近期评论