Linux怎么在命令行下使用Packer制作通用的虚拟机标准化镜像

千敏君_6966

千敏君_6966

2026-10-15

768人浏览

原创

packer不生成跨hypervisor通用镜像,而是通过复用模板并行调用qemu、vmware等builder产出特定格式镜像;linux本地构建需确保qemu/kvm就绪,qemu builder必须配置source_path、format和http_directory三要素,且provisioner须避让cloud-init启动时序,最终镜像需验证ssh连通性、cloud-init状态及磁盘扩容效果。

linux怎么在命令行下使用packer制作通用的虚拟机标准化镜像

能做,但“通用”二字要打引号——Packer 本身不生成跨 hypervisor 通吃的镜像,它按 builder 类型产出特定格式(如 qemu 出 .qcow2,vmware-iso 出 .vmdk),所谓“通用”实际是靠模板复用 + 多 builder 并行实现的多平台适配。

必须先确认本地 QEMU/KVM 是否就绪

绝大多数 Linux 下的本地标准化镜像构建走的是 qemu builder 路线,因为它轻量、免云账号、支持 cloud-init。但失败常卡在这一步:

  • lsmod | grep kvm 返回空?说明内核模块没加载,需 sudo modprobe kvm-intel(Intel)或 sudo modprobe kvm-amd(AMD)
  • ls -l /dev/kvm 权限为 crw-------?CI runner 或当前用户必须在 kvm 组里:sudo usermod -aG kvm $USER,然后重新登录
  • qemu-system-x86_64 --version 报 command not found?Ubuntu/Debian 需装 qemu-kvm,CentOS/RHEL 装 qemu-kvm-core

template.json 里最关键的三个 builder 字段

一个能真正落地的 qemu builder 不只写个 type 就完事,下面三项漏任何一项都会导致启动失败或 cloud-init 不生效:

  • source_path 必须指向一个可引导的原始镜像(如 Ubuntu Cloud Image 的 ubuntu-24.04-server-cloudimg-amd64.img),不能是 ISO —— ISO 是安装介质,不是运行时镜像
  • format 显式设为 "qcow2"(别依赖默认值),否则 Packer 可能输出 raw 格式,Multipass 或 libvirt 加载时出错
  • http_directory 必须指定含 meta-data 和 user-data 的目录路径(哪怕 meta-data 是空文件),这是 cloud-init 启动识别的硬性约定

示例片段:

Zynq Linux Hardware Debug
Zynq Linux Hardware Debug

Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

下载
"builders": [{
  "type": "qemu",
  "source_path": "./ubuntu-24.04-server-cloudimg-amd64.img",
  "format": "qcow2",
  "http_directory": "./cloud-data",
  "ssh_username": "ubuntu",
  "ssh_password": "ubuntu",
  "vm_name": "ubuntu-standard"
}]

provisioner 顺序和 cloud-init 冲突必须规避

很多人把 shell provisioner 放最前,结果发现预装的 Docker 启动不了——因为 cloud-init 在首次 boot 时会重置网络、重写 /etc/hosts、甚至重启 systemd,导致 provisioner 里启动的服务被干掉。

  • 所有需要开机自启、且依赖网络/主机名的服务(如 Docker、Node.js、监控 agent),必须通过 user-data 注入,而不是靠 shell provisioner 的 systemctl enable
  • shell provisioner 只适合做离线操作:apt/yum 安装包、写配置文件、调优内核参数(sysctl)、禁用不需要的服务(systemctl disable snapd)
  • 若真要用 shell 启服务,加 "execute_command": "echo 'packer' | {{ .Vars }} sudo -S -E sh -c '{{ .Script }}'" 确保以 root 执行,且避开 cloud-init 的 timing race

构建后镜像怎么才算“可交付”

跑完 packer build template.json 只是第一步。一个能进 CI 流水线的标准化镜像,必须满足三个验证点:

  • 手动用 qemu-system-x86_64 -drive file=output-qemu/packer-qemu,format=qcow2 -netdev user,id=n1 -device virtio-net,netdev=n1 启动,确认能 SSH 进去、cloud-init status --wait 返回 done
  • 检查 output-qemu/packer-qemu 文件大小是否合理(Ubuntu 24.04 标准镜像压缩后约 400–600MB;如果只有 200MB,大概率没成功注入 cloud-init)
  • 运行 qemu-img info output-qemu/packer-qemu,确认 virtual size 是 20G+(不是 1.2G 这种原始 cloud image 大小),说明 resize 操作已生效(通常由 cloud-init 完成)

真正容易被忽略的是:你构建出的 .qcow2 文件,对 Multipass 是开箱即用的,但对 libvirt/virsh 需要额外 virt-install --import 并指定 --os-variant ubuntu24.04;对 VirtualBox 则必须转成 vmdk(qemu-img convert -f qcow2 -O vmdk ...)。所谓“通用”,从来不是格式通用,而是构建逻辑与验证标准通用。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4010

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3433

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2593

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6310

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5942

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3473

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2965

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3199

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习