全部產品
Search
文件中心

Elastic Compute Service:使用Packer建立並匯入本地鏡像

更新時間:Jun 19, 2024

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

  1. 運行以下命令查看您的本機伺服器是否支援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
  2. 如果您的本機伺服器支援KVM,運行以下命令安裝KVM及相關控制項。

    sudo apt-get update
    sudo apt-get install qemu-kvm qemu virt-manager virt-viewer  libvirt-bin bridge-utils
  3. 確認KVM安裝是否正確。

    1. 運行以下命令檢查KVM核心模組是否已載入。

      sudo lsmod | grep kvm

      如果輸出結果中包含kvmkvm_intelkvm_amd,則表示KVM核心模組已載入。KVM核心

    2. 運行以下命令檢查libvirt是否已安裝。

      sudo dpkg -l libvirt-bin

      如果輸出結果中包含libvirt-bin,則表示libvirt已安裝。libvirt

    3. 運行以下命令檢查QEMU是否已安裝。

      sudo dpkg -l qemu-kvm

      如果輸出結果中包含qemu-kvm,則表示QEMU已安裝。QEMU

    如果以上命令的輸出結果都符合預期,則表示KVM已正確安裝。如果有任何一個命令的輸出結果不符合預期,則可能需要重新安裝KVM。

步驟二:安裝Packer

在本機伺服器上安裝Packer。具體操作,請參見安裝Packer

步驟三:定義Packer模板

以下樣本命令基於CentOS 6.9系統,如果您需要為其他動作系統製作鏡像,請根據需要自訂Packer模板設定檔centos.json。更多資訊,請參見自訂Packer模板

  1. 在本機伺服器上運行以下命令切換所在目錄。

    cd /usr/local
  2. 運行以下命令下載阿里雲官方發行的centos.json設定檔。

    sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/centos.json
  3. 運行以下命令下載阿里雲官方發行的ks.cfg設定檔。

    sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/http/centos-6.8/ks.cfg
  4. 運行以下命令建立目錄,例如http/centos-6.9

    sudo mkdir -p http/centos-6.9
  5. 運行以下命令移動設定檔ks.cfg到目錄http/centos-6.9中。

    sudo mv ks.cfg http/centos-6.9/

步驟四:使用Packer建立並匯入本地鏡像

  1. 在本機伺服器上運行以下命令匯入您的AccessKey ID。

    export ALICLOUD_ACCESS_KEY=<AccessKey ID>

    請將<AccessKey ID>替換為您實際的AccessKey ID。

  2. 運行以下命令匯入您的AccessKey Secret。

    export ALICLOUD_SECRET_KEY=<AccessKey Secret>

    請將<AccessKey Secret>替換為您實際的AccessKey Secret。

  3. 運行以下命令建立本地鏡像並匯入到阿里雲平台。

    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
  4. 登入ECS管理主控台

  5. 在左側導覽列,選擇執行個體與鏡像 > 鏡像

  6. 在頂部功能表列左上方處,選擇centos.json檔案中指定的地區,例如華北2(北京)。

  7. 自訂鏡像頁簽下,鏡像列表中查看產生的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檔案的校正和類型。取值範圍:

  • none:忽略校正和過程,不推薦指定該值

  • md5

  • sha1

  • sha256

  • sha512

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連結,也可以是一個檔案路徑:

  • 如果是HTTP連結,Packer從HTTP連結下載檔案並緩衝運行。

  • 如果是IMG或者QCOW2檔案連結,QEMU直接使用檔案建立自訂鏡像。當您指定了檔案路徑時,請將參數disk_image置為true

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,例如本樣本中的cn-beijing。更多地區資訊,請參見地區和可用性區域

image_name

string

您的本地鏡像的名稱。

  • 由 [2, 128] 位英文或中文字元組成。

  • 必須以大小寫字母或中文字元開始。

  • 可以包含數字、底線(_)或者連字號(-)。

  • 不能以http://或https://開頭。

oss_bucket_name

string

您的OSS Bucket名稱。如果您指定了一個不存在的Bucket名稱,Packer上傳鏡像時自動建立一個同名Bucket。

image_os_type

string

鏡像類型,取值範圍:

  • linux

  • windows

image_platform

string

鏡像發行版本。例如,本樣本中的CentOS。

image_architecture

string

鏡像發行版本的架構平台,取值範圍:

  • i386

  • x86_64

format

string

鏡像的格式,取值範圍:

  • RAW

  • VHD