Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

通过实例存储支持的 实例创建 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 目录。以下 scp 命令中的 -i my-private-key.pem 选项是您用于通过 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.cn:/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 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

      注意

      对于中国(北京) 和 AWS GovCloud (US) 区域,请使用 --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 > sudo /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 命令。

    [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

    重要

    要在 美国东部(弗吉尼亚北部) 之外的区域中注册 AMI,则必须指定带 --region 选项的目标区域以及目标区域中已存在的存储桶路径或可在目标区域中创建的唯一存储桶路径。

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

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

    重要

    如果您在 步骤 2 中指定了带有 -d /path/to/bundle/storage 选项的路径,请使用该路径,而不是 /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

      验证您的实例是否正在使用 GRUB Legacy。

      ubuntu:~$ grub --version grub (GNU GRUB 0.97)
  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. 使用您常用的文本编辑器 (如 vimnano) 编辑 /boot/grub/menu.lst 文件,以更改控制台并将先前确定的参数添加到启动条目中。

    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. 使用安全复制工具 (如 /tmp/certscp) 将您的 X.509 证书和私有密钥从您的计算机复制到您的实例上的 目录。以下 scp 命令中的 -i my-private-key.pem 选项是您用于通过 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.cn:/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 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

    重要

    如果您打算在 美国东部(弗吉尼亚北部) 之外的区域中注册 AMI,则必须指定带 --region 选项的目标区域以及目标区域中已存在的存储桶路径或可在目标区域中创建的唯一存储桶路径。

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

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

    重要

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

  6. 要注册您的 AMI,请如下所示运行 register-image AWS 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 条目的注释;否则,正在运行的实例不会重启。