Packer是一款轻量级的镜像定义工具,能够运行在主流操作系统(例如Windows、Linux和macOS)上,并行高效地创建多平台的虚拟机镜像。本文以在Ubuntu 16.04的本地服务器中制作CentOS 6.9操作系统的自定义镜像并上传至阿里云平台为例,介绍使用Packer创建镜像的操作步骤。
前提条件
已创建AccessKey,并获取AccessKey ID和AccessKey Secret。具体操作,请参见创建AccessKey。
说明由于AccessKey权限过大,为防止数据泄露,建议您先创建RAM用户,再使用RAM用户创建AccessKey。创建RAM用户的具体操作,请参见创建RAM用户。
RAM用户的AccessKey Secret只在创建时显示,不支持查看,请妥善保管。
已开通OSS服务。具体操作,请参见开通OSS服务。
背景信息
Packer工具包含Builders(生成器)、Provisioners(配置器)、Post-Processors(后处理器)等组件,通过HCL(HashiCorp Configuration Language)或者JSON格式的模板文件较大地降低了创建自定义镜像的难度,并且将创建镜像的过程从人工的随机过程变成可以配置管理代码,从而减少了用户应用上云的障碍。
操作步骤
本文示例步骤使用了如下版本软件。操作时,请以您的实际软件版本为准。
本地服务器操作系统:Ubuntu 16.04
待制作镜像的操作系统:CentOS 6.9
步骤一:安装KVM
运行以下命令查看您的本地服务器是否支持KVM,本示例的源操作系统为Ubuntu 16.04。
egrep "(svm|vmx)" /proc/cpuinfo
返回如下信息时,表示支持KVM。
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
如果您的本地服务器支持KVM,运行以下命令安装KVM及相关控件。
sudo apt-get update sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils
确认KVM安装是否正确。
运行以下命令检查KVM内核模块是否已加载。
sudo lsmod | grep kvm
如果输出结果中包含
kvm
和kvm_intel
或kvm_amd
,则表示KVM内核模块已加载。运行以下命令检查libvirt是否已安装。
sudo dpkg -l libvirt-bin
如果输出结果中包含
libvirt-bin
,则表示libvirt已安装。运行以下命令检查QEMU是否已安装。
sudo dpkg -l qemu-kvm
如果输出结果中包含
qemu-kvm
,则表示QEMU已安装。
如果以上命令的输出结果都符合预期,则表示KVM已正确安装。如果有任何一个命令的输出结果不符合预期,则可能需要重新安装KVM。
步骤二:安装Packer
在本地服务器上安装Packer。具体操作,请参见安装Packer。
步骤三:定义Packer模板
以下示例命令基于CentOS 6.9系统,如果您需要为其他操作系统制作镜像,请根据需要自定义Packer模板配置文件centos.json。更多信息,请参见自定义Packer模板。
在本地服务器上运行以下命令切换所在目录。
cd /usr/local
运行以下命令下载阿里云官方发行的centos.json配置文件。
sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/centos.json
运行以下命令下载阿里云官方发行的ks.cfg配置文件。
sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/http/centos-6.8/ks.cfg
运行以下命令创建目录,例如http/centos-6.9。
sudo mkdir -p http/centos-6.9
运行以下命令移动配置文件ks.cfg到目录http/centos-6.9中。
sudo mv ks.cfg http/centos-6.9/
步骤四:使用Packer创建并导入本地镜像
在本地服务器上运行以下命令导入您的AccessKey ID。
export ALICLOUD_ACCESS_KEY=<AccessKey ID>
请将
<AccessKey ID>
替换为您实际的AccessKey ID。运行以下命令导入您的AccessKey Secret。
export ALICLOUD_SECRET_KEY=<AccessKey Secret>
请将
<AccessKey Secret>
替换为您实际的AccessKey Secret。运行以下命令创建本地镜像并导入到阿里云平台。
sudo packer build centos.json
示例运行结果如下,以下示例表示将在华北2(北京)地域创建自定义镜像。
qemu output will be in this color. ==> qemu: Downloading or copying ISO qemu: Downloading or copying: http://mirrors.aliyun.com/centos/6.9/isos/x86_64/CentOS-6.9-x86_64-minimal.iso ................................................ ==> qemu: Running post-processor: alicloud-import qemu (alicloud-import): Deleting import source https://oss-cn-beijing.aliyuncs.com/packer/centos_x86_64 Build 'qemu' finished. ==> Builds finished. The artifacts of successful builds are: --> qemu: Alicloud images were created: cn-beijing: XXXXXXXX
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏左上角处,选择centos.json文件中指定的地域,例如华北2(北京)。
在自定义镜像页签下,镜像列表中查看生成的CentOS 6.9镜像。
自定义Packer模板
如果您需要为其他操作系统创建本地镜像,可参见如下所示的CentOS 6.9的JSON文件自定义Packer模板。
{"variables": {
"box_basename": "centos-6.9",
"build_timestamp": "{{isotime \"20060102150405\"}}",
"cpus": "1",
"disk_size": "4096",
"git_revision": "__unknown_git_revision__",
"headless": "",
"http_proxy": "{{env `http_proxy`}}",
"https_proxy": "{{env `https_proxy`}}",
"iso_checksum_type": "md5",
"iso_checksum": "af4axxxxxxxxxxxxxxxxx192a2",
"iso_name": "CentOS-6.9-x86_64-minimal.iso",
"ks_path": "centos-6.9/ks.cfg",
"memory": "512",
"metadata": "floppy/dummy_metadata.json",
"mirror": "http://mirrors.aliyun.com/centos",
"mirror_directory": "6.9/isos/x86_64",
"name": "centos-6.9",
"no_proxy": "{{env `no_proxy`}}",
"template": "centos-6.9-x86_64",
"version": "2.1.TIMESTAMP"
},
"builders":[
{
"boot_command": [
"<tab> text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{user `ks_path`}}<enter><wait>"
],
"boot_wait": "10s",
"disk_size": "{{user `disk_size`}}",
"headless": "{{ user `headless` }}",
"http_directory": "http",
"iso_checksum": "{{user `iso_checksum`}}",
"iso_checksum_type": "{{user `iso_checksum_type`}}",
"iso_url": "{{user `mirror`}}/{{user `mirror_directory`}}/{{user `iso_name`}}",
"output_directory": "packer-{{user `template`}}-qemu",
"shutdown_command": "echo 'vagrant'|sudo -S /sbin/halt -h -p",
"ssh_password": "vagrant",
"ssh_port": 22,
"ssh_username": "root",
"ssh_wait_timeout": "10000s",
"type": "qemu",
"vm_name": "{{ user `template` }}.raw",
"net_device": "virtio-net",
"disk_interface": "virtio",
"format": "raw"
}
],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"yum install cloud-util cloud-init -y"
]
}],
"post-processors":[
{
"type":"alicloud-import",
"oss_bucket_name": "packer",
"image_name": "packer_import",
"image_os_type": "linux",
"image_platform": "CentOS",
"image_architecture": "x86_64",
"image_system_size": "40",
"region":"cn-beijing"
}
]
}
Packer生成器参数说明
Packer使用QEMU Builder生成器创建虚拟机镜像,该生成器的必需参数说明如下表所示。其他可选参数,请参见Packer QEMU Builder。
必需参数 | 类型 | 描述 |
iso_checksum | string | 操作系统的ISO文件的校验和。Packer在启动挂载了ISO的虚拟机之前检查该参数。至少指定iso_checksum或者iso_checksum_url参数;当您指定了参数iso_checksum时,参数iso_checksum_url的值被自动忽略。 |
iso_checksum_type | string | 已指定的操作系统的ISO文件的校验和类型。取值范围:
|
iso_checksum_url | string | 一个包含了操作系统ISO文件校验和的文件链接(URL),样式为GNU或者BSD。您需要至少指定iso_checksum或者iso_checksum_url参数;当您指定了参数iso_checksum时,参数iso_checksum_url的值被自动忽略。 |
iso_url | string | 一个指向ISO并包含安装镜像的URL。这个URL可以是一个HTTP链接,也可以是一个文件路径:
|
headless | boolean | Packer默认通过启动图形化虚拟机界面构建QEMU虚拟机。当您将headless置为True时,将启动一个没有控制台的虚拟机。 |
Packer配置器部分参数说明
Packer配置器中包含了Post-Processor模块,该模块实现自动化上传本地镜像到ECS云平台。Post-Processor模块的必需参数如下表所示。其他可选参数,请参见Post-Processors(后处理器)。
必需参数 | 类型 | 描述 |
access_key | string | 您的AccessKey ID。查询RAM用户AccessKey ID的具体操作,请参见查看RAM用户的AccessKey信息。 |
secret_key | string | 您的AccessKey Secret。RAM用户的AccessKey Secret只在创建时显示,不支持查询。更多信息,请参见创建AccessKey。 |
region | string | 本地镜像上传的阿里云地域ID,例如本示例中的 |
image_name | string | 您的本地镜像的名称。
|
oss_bucket_name | string | 您的OSS Bucket名称。如果您指定了一个不存在的Bucket名称,Packer上传镜像时自动创建一个同名Bucket。 |
image_os_type | string | 镜像类型,取值范围:
|
image_platform | string | 镜像发行版本。例如,本示例中的CentOS。 |
image_architecture | string | 镜像发行版本的架构平台,取值范围:
|
format | string | 镜像的格式,取值范围:
|