You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04带Secure Boot环境下脚本化安装VirtualBox并创建多虚拟机的技术问询

Ubuntu 20.04带Secure Boot环境下脚本化安装VirtualBox并创建多虚拟机的技术问询

嗨,我来帮你梳理下这个问题的解决方案,毕竟Secure Boot的安全机制确实会给自动化部署虚拟机带来不少限制😉

一、关于VirtualBox模块签名的自动化困境

首先得明确:重启时的Enroll MOK步骤是无法完全通过脚本自动化的——这是Secure Boot的设计初衷,UEFI层面的密钥导入需要用户手动确认,防止恶意程序偷偷注入未授权的内核模块。不过我们可以把其他所有步骤都自动化,只留这唯一的一次手动操作,尽可能减少干预:

可以自动化的前置步骤

  1. 自动生成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
    '
    
  2. 自动签名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
    
  3. 自动触发重启并给出清晰提示
    脚本可以自动重启系统,并提前告知用户后续要做的操作:

    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并创建虚拟机的示例

  1. 安装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
    
  2. 一键创建无人值守虚拟机
    下面的命令会自动下载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:33:15