如何在Packer中使用guest_additions_mode "attach"安装VirtualBox增强工具?
在Packer中使用
guest_additions_mode = "attach"安装VirtualBox增强工具 我之前配置Packer构建VirtualBox镜像时也碰到过这个问题,官方文档确实没细说挂载点的处理细节,这里分享一套我实际用过的完整配置方案,涵盖模板设置和不同Linux发行版的安装脚本。
第一步:配置Packer VirtualBox Builder
先在你的Packer模板里,给VirtualBox builder指定guest_additions_mode = "attach",还可以按需指定增强工具ISO的路径(不填的话Packer会自动找VirtualBox安装目录下的对应ISO):
source "virtualbox-iso" "ubuntu-server" { iso_url = "https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso" iso_checksum = "sha256:0e0f488548794495d976a594a74d411945d6958e428b9ed4a43e78687a04736b" ssh_username = "ubuntu" ssh_password = "ubuntu" shutdown_command = "sudo shutdown -P now" guest_additions_mode = "attach" # 可选:手动指定增强工具ISO路径,适合VirtualBox非默认安装的场景 # guest_additions_path = "/opt/virtualbox/VBoxGuestAdditions.iso" } build { sources = ["source.virtualbox-iso.ubuntu-server"] provisioner "shell" { script = "install-vbox-guest-additions.sh" } }
第二步:编写安装脚本(分发行版)
当guest_additions_mode设为attach时,VirtualBox只会把增强工具ISO作为CD-ROM设备连接到虚拟机,不会自动挂载,所以需要我们在shell脚本里手动处理挂载、安装、卸载的全流程。
适用于Debian/Ubuntu的脚本(install-vbox-guest-additions.sh)
#!/bin/bash set -e # 安装编译内核模块必需的依赖 sudo apt-get update sudo apt-get install -y build-essential linux-headers-$(uname -r) dkms # 创建临时挂载点 sudo mkdir -p /mnt/vboxiso # 挂载增强工具ISO(兼容/dev/cdrom和/dev/sr0两种常见设备路径) if [ -b /dev/cdrom ]; then sudo mount /dev/cdrom /mnt/vboxiso elif [ -b /dev/sr0 ]; then sudo mount /dev/sr0 /mnt/vboxiso else echo "无法识别VirtualBox增强工具ISO设备" exit 1 fi # 运行安装脚本,跳过X Window相关步骤(适合无GUI服务器镜像) sudo /mnt/vboxiso/VBoxLinuxAdditions.run --nox11 # 卸载ISO并清理临时挂载点 sudo umount /mnt/vboxiso sudo rmdir /mnt/vboxiso # 可选:重启系统让增强工具生效(部分场景需要) # sudo reboot
适用于RHEL/CentOS/Rocky Linux的脚本
#!/bin/bash set -e # 安装依赖包 sudo dnf install -y gcc kernel-devel kernel-headers dkms make bzip2 perl # 创建临时挂载点 sudo mkdir -p /mnt/vboxiso # 挂载ISO sudo mount /dev/cdrom /mnt/vboxiso # 执行安装脚本 sudo /mnt/vboxiso/VBoxLinuxAdditions.run # 清理操作 sudo umount /mnt/vboxiso sudo rmdir /mnt/vboxiso # 可选重启 # sudo reboot
关键细节说明
- 设备路径兼容:大多数Linux系统里,CD-ROM设备会被识别为
/dev/cdrom或/dev/sr0,脚本里做了双判断,避免因系统差异导致挂载失败。 - 依赖必须安装:内核头文件、编译工具是增强工具内核模块编译的必要条件,缺了会直接导致安装失败。
- --nox11参数:如果构建的是无GUI的服务器镜像,加上这个参数可以跳过X相关组件的安装,减少不必要的报错。
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

