Ubuntu 20.04带Secure Boot环境下脚本化安装VirtualBox并创建多虚拟机的技术问询
Ubuntu 20.04带Secure Boot环境下脚本化安装VirtualBox并创建多虚拟机的技术问询
嗨,我来帮你梳理下这个问题的解决方案,毕竟Secure Boot的安全机制确实会给自动化部署虚拟机带来不少限制😉
一、关于VirtualBox模块签名的自动化困境
首先得明确:重启时的Enroll MOK步骤是无法完全通过脚本自动化的——这是Secure Boot的设计初衷,UEFI层面的密钥导入需要用户手动确认,防止恶意程序偷偷注入未授权的内核模块。不过我们可以把其他所有步骤都自动化,只留这唯一的一次手动操作,尽可能减少干预:
可以自动化的前置步骤
自动生成MOK密钥对
用openssl和expect工具自动生成密钥并导入MOK列表,避免手动输入密码:# 生成无密码的密钥对(自动化场景下必须,生产环境需谨慎评估风险) openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox Module Signing Key/" # 用expect自动处理mokutil的密码输入(临时密码设为"temp123",可自行修改) expect -c ' spawn mokutil --import MOK.der expect "input password:" send "temp123\r" expect "input password again:" send "temp123\r" exit 0 '自动签名VirtualBox内核模块
找到内核的签名工具,批量签名三个需要的模块:# 定位当前内核的sign-file工具 SIGN_FILE=$(find /usr/src/linux-headers-$(uname -r) -name sign-file) # 签名VirtualBox模块 $SIGN_FILE sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/misc/vboxdrv.ko $SIGN_FILE sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/misc/vboxnetadp.ko $SIGN_FILE sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/misc/vboxnetflt.ko # 更新模块依赖 depmod -a自动触发重启并给出清晰提示
脚本可以自动重启系统,并提前告知用户后续要做的操作:echo "=== 重要提示:系统即将重启,请完成以下步骤 ===" echo "1. 重启后出现Enroll MOK界面时,选择「Enroll MOK」" echo "2. 确认要导入的密钥,选择「Continue」" echo "3. 输入临时密码「temp123」完成密钥导入" echo "4. 系统会再次重启,之后VirtualBox即可正常使用" reboot这次手动操作完成后,后续所有VirtualBox的使用和虚拟机创建都可以完全脚本化,不需要再处理签名问题。
二、完全无手动操作的替代方案:KVM虚拟化
如果你的核心需求是全程无人工干预,那更推荐用Linux原生的KVM虚拟化方案:
- KVM是Ubuntu官方支持的内核模块,已经被签名过,在Secure Boot开启的情况下可以直接加载,不需要额外签名操作;
- 用
virt-install工具可以完全脚本化创建、配置虚拟机,支持无人值守安装。
脚本化安装KVM并创建虚拟机的示例
安装KVM及依赖工具
sudo apt update && sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-install # 将当前用户加入libvirt组,避免后续操作需要sudo sudo usermod -aG libvirt $USER sudo systemctl restart libvirtd一键创建无人值守虚拟机
下面的命令会自动下载Ubuntu 20.04镜像,创建一个2核2G内存、20G磁盘的虚拟机,全程无交互:virt-install \ --name ubuntu-vm-1 \ --ram 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/ubuntu-vm-1.qcow2,size=20 \ --os-variant ubuntu20.04 \ --network bridge=virbr0 \ --graphics none \ --console pty,target_type=serial \ --location 'http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/' \ --extra-args 'console=ttyS0,115200n8 serial' \ --unattended你可以把这段代码放到循环里,批量创建多个虚拟机。
三、总结
- 若坚持使用VirtualBox:只能做到签名步骤自动化,第一次重启后的MOK密钥导入必须手动完成一次,之后即可完全脚本化管理虚拟机;
- 若要求全程无手动操作:KVM是更适配Secure Boot环境的选择,原生支持自动化部署,没有签名困扰。
备注:内容来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

