通过实例存储支持的实例创建 AMI - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过实例存储支持的实例创建 AMI

下列步骤用于从实例存储支持的实例创建实例存储支持的 AMI。在开始之前,请您务必阅读先决条件

通过实例存储支持的 Amazon Linux 实例创建 AMI

本节介绍如何通过 Amazon Linux 实例创建 AMI。以下过程可能不适用于运行其他 Linux 发行版的实例。有关特定于 Ubuntu 的过程,请参阅 通过实例存储支持的 Ubuntu 实例创建 AMI

准备使用 AMI 工具 (仅限 HVM 实例)
  1. AMI 工具需要有 GRUB Legacy,才能正确启动。使用以下命令安装 GRUB:

    [ec2-user ~]$ sudo yum install -y grub
  2. 使用以下命令安装分区管理程序包:

    [ec2-user ~]$ sudo yum install -y gdisk kpartx parted
通过实例存储支持的 Amazon Linux 实例创建 AMI

此过程假设您满足先决条件中的先决条件。

在以下示例中,将每个用户输入占位符替换为您自己的信息。

  1. 将您的凭证上传到您的实例。我们使用这些凭证确保只有您和 Amazon EC2 才能访问您的 AMI。

    1. 在您的实例上为凭证创建临时目录,如下所示:

      [ec2-user ~]$ mkdir /tmp/cert

      这使您可以从创建的映像中排除您的凭证。

    2. 使用安全复制工具 (如 scp) 将 X.509 证书和对应的私有密钥从您的计算机复制到实例上的 /tmp/cert 目录。以下 -i my-private-key.pem 命令中的 scp 选项是您用于通过 SSH 连接到实例的私有密钥,而不是 X.509 私有密钥。例如:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    此外,由于这些是纯文本文件,所以您可以在文本编辑器中打开证书和密钥,并将其内容复制到 /tmp/cert 中的新文件。

  2. 通过从您的实例内部运行 ec2-bundle-vol 命令,准备捆绑包以便上传到 Amazon S3。请务必指定 -e 选项以排除用于存储您的凭证的目录。默认情况下,捆绑过程不包括可能包含敏感信息的文件。这些文件包括 *.sw*.swo*.swp*.pem*.priv*id_rsa**id_dsa* *.gpg*.jks*/.ssh/authorized_keys*/.bash_history。要包括所有这些文件,请使用 --no-filter 选项。要包括其中部分文件,请使用 --include 选项。

    重要

    默认情况下,AMI 捆绑过程在表示根卷的 /tmp 目录中创建经过压缩和加密的文件集合。如果您在 /tmp 中没有足够的可用磁盘空间来存储捆绑,则需要使用 -d /path/to/bundle/storage 选项指定不同的位置来存储捆绑。某些实例会在 /mnt/media/ephemeral0 上挂载您可以使用的临时存储,您还可以创建连接挂载新 Amazon Elastic Block Store(Amazon EBS)卷以存储捆绑。

    1. 您必须以根用户身份运行 ec2-bundle-vol 命令。对于大部分命令,您可以使用 sudo 获取提升的权限,但是在这种情况下,您应运行 sudo -E su 以保留环境变量。

      [ec2-user ~]$ sudo -E su

      请注意,在 bash 提示符下现在将您标识为根用户,并且美元符号已替换为哈希标签,表示您现在处于 root Shell 中:

      [root ec2-user]#
    2. 要创建 AMI 捆绑,请如下所示运行 ec2-bundle-vol 命令:

      [root ec2-user]# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 123456789012 -r x86_64 -e /tmp/cert --partition gpt
      注意

      对于中国(北京)和 Amazon GovCloud(美国西部)区域,请使用 --ec2cert 参数并根据先决条件指定证书。

      创建映像可能需要几分钟时间。该命令完成后,您的 /tmp (非默认) 目录会包含捆绑 (image.manifest.xml 以及多个 image.part.xx 文件)。

    3. 从 root Shell 退出。

      [root ec2-user]# exit
  3. (可选)要添加更多实例存储卷,请在 image.manifest.xml 文件中为您的 AMI 编辑块储存设备映射。有关更多信息,请参阅块设备映射

    1. 创建 image.manifest.xml 文件的备份。

      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. 重新设置 image.manifest.xml 文件的格式,使其更易于阅读和编辑。

      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. 使用文本编辑器编辑 image.manifest.xml 中的块储存设备映射。以下示例显示了 ephemeral1 实例存储卷的一个新条目。

      注意

      有关排除的文件的列表,请参阅ec2-bundle-vol

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. 保存 image.manifest.xml 文件并退出文本编辑器。

  4. 要将捆绑上传到 Amazon S3,请如下所示运行 ec2-upload-bundle 命令。

    [ec2-user ~]$ ec2-upload-bundle -b my-s3-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    重要

    要在US East (N. Virginia)之外的区域中注册 AMI,则必须指定带 --region 选项的目标区域和目标区域中已存在的存储桶路径或可在目标区域中创建的唯一存储桶路径。

  5. (可选)将捆绑上传到 Amazon S3 之后,您可以使用以下 /tmp 命令将捆绑从实例上的 rm 目录中删除:

    [ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    重要

    如果您在 -d /path/to/bundle/storage 中使用 步骤 2 选项指定了路径,请使用该路径,而不是 /tmp

  6. 要注册您的 AMI,请按以下所示运行 register-image 命令。

    [ec2-user ~]$ aws ec2 register-image --image-location my-s3-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    重要

    如果您先前为 ec2-upload-bundle 命令指定了某个区域,请为该命令再次指定该区域。

通过实例存储支持的 Ubuntu 实例创建 AMI

本节介绍如何在将实例存储卷作为根卷的情况下从 Ubuntu Linux 实例创建 AMI。以下过程可能不适用于运行其他 Linux 发行版的实例。有关特定于 Amazon Linux 的过程,请参阅 通过实例存储支持的 Amazon Linux 实例创建 AMI

准备使用 AMI 工具 (仅限 HVM 实例)

AMI 工具需要有 GRUB Legacy,才能正确启动。不过,Ubuntu 配置为使用 GRUB 2。您必须检查您的实例是否使用传统 GRUB,如果未使用,您需要安装并配置它。

HVM 实例还需要安装分区工具,以便 AMI 工具可以正常工作。

  1. GRUB Legacy(版本 0.9x 或更早版本)必须安装在您的实例上。检查传统 GRUB 是否存在,并根据需要安装它。

    1. 检查您的 GRUB 安装版本。

      ubuntu:~$ grub-install --version grub-install (GRUB) 1.99-21ubuntu3.10

      在该示例中,GRUB 版本高于 0.9x,因此您必须安装传统 GRUB。继续执行步骤 2。如果传统 GRUB 已存在,您可以跳到步骤 2

    2. 使用以下命令安装 grub 程序包。

      ubuntu:~$ sudo apt-get install -y grub
  2. 使用您的发行版的软件包管理器安装以下分区管理软件包。

    • gdisk(此软件包在某些发行版中可能名为 gptfdisk

    • kpartx

    • parted

    使用以下命令。

    ubuntu:~$ sudo apt-get install -y gdisk kpartx parted
  3. 检查您的实例的内核参数。

    ubuntu:~$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.2.0-54-virtual root=UUID=4f392932-ed93-4f8f-aee7-72bc5bb6ca9d ro console=ttyS0 xen_emul_unplug=unnecessary

    请注意内核和根设备参数之后的选项:roconsole=ttyS0xen_emul_unplug=unnecessary。您的选项可能有所不同。

  4. 检查 /boot/grub/menu.lst 中的内核条目。

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=hvc0 kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single kernel /boot/memtest86+.bin

    请注意,console 参数指向 hvc0 而不是 ttyS0,并且缺少 xen_emul_unplug=unnecessary 参数。同样,您的选项可能有所不同。

  5. 使用您常用的文本编辑器(如 /boot/grub/menu.lstvim)编辑 nano 文件,以更改控制台并将先前确定的参数添加到启动条目中。

    title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual (recovery mode) root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, memtest86+ root (hd0) kernel /boot/memtest86+.bin
  6. 验证您的内核条目现在是否包含正确参数。

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/memtest86+.bin
  7. [仅适用于 Ubuntu 14.04 及更高版本] 从 Ubuntu 14.04 开始,实例存储支持的 Ubuntu AMI 使用 GPT 分区表和装载在 /boot/efi 中的单独 EFI 分区。ec2-bundle-vol 命令不会捆绑此引导分区,因此您需要为 EFI 分区的 /etc/fstab 条目添加注释,如下所示。

    LABEL=cloudimg-rootfs / ext4 defaults 0 0 #LABEL=UEFI /boot/efi vfat defaults 0 0 /dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
通过实例存储支持的 Ubuntu 实例创建 AMI

此过程假设您满足先决条件中的先决条件。

在以下示例中,将每个用户输入占位符替换为您自己的信息。

  1. 将您的凭证上传到您的实例。我们使用这些凭证确保只有您和 Amazon EC2 才能访问您的 AMI。

    1. 在您的实例上为凭证创建临时目录,如下所示:

      ubuntu:~$ mkdir /tmp/cert

      这使您可以从创建的映像中排除您的凭证。

    2. 使用安全复制工具(如 scp)将您的 X.509 证书和私有密钥从您的计算机复制到您实例上的 /tmp/cert 目录。以下 -i my-private-key.pem 命令中的 scp 选项是您用于通过 SSH 连接到实例的私有密钥,而不是 X.509 私有密钥。例如:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    此外,由于这些是纯文本文件,所以您可以在文本编辑器中打开证书和密钥,并将其内容复制到 /tmp/cert 中的新文件。

  2. 通过从您的实例内运行 ec2-bundle-vol 命令,准备捆绑包以便上传到 Amazon S3。请务必指定 -e 选项以排除用于存储您的凭证的目录。默认情况下,捆绑过程不包括可能包含敏感信息的文件。这些文件包括 *.sw*.swo*.swp*.pem*.priv*id_rsa**id_dsa* *.gpg*.jks*/.ssh/authorized_keys*/.bash_history。要包括所有这些文件,请使用 --no-filter 选项。要包括其中部分文件,请使用 --include 选项。

    重要

    默认情况下,AMI 捆绑过程在表示根卷的 /tmp 目录中创建经过压缩和加密的文件集合。如果您在 /tmp 中没有足够的可用磁盘空间来存储捆绑,则需要使用 -d /path/to/bundle/storage 选项指定不同的位置来存储捆绑。某些实例会在 /mnt/media/ephemeral0 上挂载您可以使用的临时存储,您还可以创建连接挂载新 Amazon Elastic Block Store(Amazon EBS)卷以存储捆绑。

    1. 您必须以根用户身份运行 ec2-bundle-vol 命令。对于大部分命令,您可以使用 sudo 获取提升的权限,但是在这种情况下,您应运行 sudo -E su 以保留环境变量。

      ubuntu:~$ sudo -E su

      请注意,在 bash 提示符下现在将您标识为根用户,并且美元符号已替换为哈希标签,表示您现在处于 root Shell 中:

      root@ubuntu:#
    2. 要创建 AMI 捆绑,请如下所示运行 ec2-bundle-vol 命令。

      root@ubuntu:# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u your_aws_account_id -r x86_64 -e /tmp/cert --partition gpt
      重要

      对于 Ubuntu 14.04 及更高版本的 HVM 实例,请添加 --partition mbr 标志以正确捆绑启动指令;否则,新创建的 AMI 不会启动。

      创建映像可能需要几分钟时间。该命令完成后,您的 tmp 目录会包含捆绑 (image.manifest.xml 以及多个 image.part.xx 文件)。

    3. 从 root Shell 退出。

      root@ubuntu:# exit
  3. (可选)要添加更多实例存储卷,请在 image.manifest.xml 文件中为您的 AMI 编辑块储存设备映射。有关更多信息,请参阅块设备映射

    1. 创建 image.manifest.xml 文件的备份。

      ubuntu:~$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. 重新设置 image.manifest.xml 文件的格式,使其更易于阅读和编辑。

      ubuntu:~$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. 使用文本编辑器编辑 image.manifest.xml 中的块储存设备映射。以下示例显示了 ephemeral1 实例存储卷的一个新条目。

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. 保存 image.manifest.xml 文件并退出文本编辑器。

  4. 要将捆绑上传到 Amazon S3,请如下所示运行 ec2-upload-bundle 命令。

    ubuntu:~$ ec2-upload-bundle -b my-s3-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    重要

    如果您打算在US East (N. Virginia)之外的区域中注册 AMI,则必须指定带 --region 选项的目标区域和目标区域中已存在的存储桶路径或可在目标区域中创建的唯一存储桶路径。

  5. (可选)将捆绑上传到 Amazon S3 之后,您可以使用以下 /tmp 命令将捆绑从实例上的 rm 目录中删除:

    ubuntu:~$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    重要

    如果您在 -d /path/to/bundle/storage 中指定了带有 步骤 2 选项的路径,请在下面使用该路径,而不是 /tmp

  6. 要注册您的 AMI,请按以下所示运行 register-image Amazon CLI 命令。

    ubuntu:~$ aws ec2 register-image --image-location my-s3-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    重要

    如果您先前为 ec2-upload-bundle 命令指定了某个区域,请为该命令再次指定该区域。

  7. [仅适用于 Ubuntu 14.04 及更高版本] 在 /etc/fstab 中取消对 EFI 条目的注释;否则,正在运行的实例不会重启。