从现有的半虚拟 Linux AMI 创建 AWS HVM Linux AMI

jav*_*vaj 39 linux cloud-computing amazon-ec2

是否可以从现有的半虚拟化 (PV) AMI 创建硬件虚拟机 (HVM) AMI。

我最初的想法是启动一个新的 PV 实例并使用该ec2-create-image命令创建一个新映像,同时将 HVM 指定为虚拟化类型。但是,ec2-create-image没有命令行参数来指定虚拟化类型。

有没有其他方法可以做到这一点?

Jef*_*unk 22

Update

AWS has enabled this feature in the EC2 API. It is available as the --virtualization-type option to aws ec2 register-image in the new Boto based awscli.

Original answer

Yes! Unfortunately, there is not a direct way to do so. Also, some PV instances may need kernel and bootloader modifications.

  1. Create a volume from your existing PV AMI. If it was your own PV AMI, you can make a volume from the snapshot. If it is a 3rd party AMI, you will need to launch an instance and take a snapshot.
  2. 使用任何 AMI 启动 HVM 实例。
  3. 停止该 HVM 实例。
  4. 从该实例中分离根卷。
  5. 将 PV 卷作为根卷(/dev/sda1 或 /dev/sda 如果已分区)附加到 HVM 实例。
  6. ec2-create-image在 HVM 实例上运行。
  7. 使用新的 HVM AMI 启动其他实例。

如果这不起作用,那么在第 5 步之前,您需要将该卷附加到正在运行的实例,设置 chroot,并为您的发行版安装内核和引导加载程序。您可能还想清除日志和任何 cloud-init 缓存。

  • 我尝试了步骤 1-5,但它对我不起作用,因为实例在几秒钟后停止。有人可以详细说明如何设置 chroot,并安装内核和引导加载程序吗?新旧实例都是AMI Linux。谢谢。 (2认同)
  • 我使用 `aws ec2 register-image` 从我的 PV 实例创建了一个 HVM 映像。然后我从该映像启动了一个新的 HVM 实例。但是系统不会启动。 (2认同)

tol*_*orf 13

就我而言,我必须手动进行转换,因为我使用创建的实例aws ec2 register-image没有启动。我的解决方案是基于这篇文章AWS EC2论坛

准备

确保所有卷都在同一个可用区中。

  1. 通过 SSH 连接到要从中迁移的 PV 机器并应用所有更新,然后注销。

  2. 转到 AWS 控制台并通过选择创建 PV 系统的相同基础 AMI(在我的例子中是 Amazon 64 位 Linux AMI)来启动一个新的 HVM 实例。

  3. SSH 到这个新实例并应用所有更新,然后注销。

  4. 转到 AWS 控制台并停止 PV 实例。拍摄根设备的快照并SOURCE VOLUME从此快照创建新卷 ( )。

  5. 停止 HVM 实例。在新实例上拍摄根设备的快照,并TARGET VOLUME从该快照创建一个新卷 ( )。

  6. 使用 AWS 控制台:

    • 附加SOURCE VOLUME到新实例作为/dev/xvdf.
    • 附加TARGET VOLUME到新实例作为/dev/xvdg.

转换过程

  1. SSH 到新实例并获得 root 访问权限:

    sudo su
    
    Run Code Online (Sandbox Code Playgroud)
  2. 挂载源驱动器和目标驱动器。

    mkdir -p /mnt/source && mount /dev/xvdf /mnt/source
    mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
    
    Run Code Online (Sandbox Code Playgroud)

    就我而言,设备是/dev/xvdf(源)和/dev/xvdg1(目标)。这些可能会根据分区数量和附加位置而在您的配置中发生变化(请参阅准备中的步骤 6)。用ls -al /dev/xvd*看的驱动器。

  3. 备份/lib/modules/*(如果 PV ami 的内核与新的 HVM 机器不同。此模块被 AWS 的某些服务使用。)

  4. 删除/boot目标卷上的所有内容:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
    Run Code Online (Sandbox Code Playgroud)
  5. /boot在源卷上删除:

    rm -Rf /mnt/source/boot
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将源卷的数据复制到保留所有属性的目标卷:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
    Run Code Online (Sandbox Code Playgroud)
  7. 编辑/mnt/target/etc/fstab/分区,以便它引用的TARGET VOLUME安装在在步骤(8)其最终位置时。要么使用标签,要么简单地使用一些东西:

    /dev/xvda1 /     ext4    defaults,barrier=0 1 1
    
    Run Code Online (Sandbox Code Playgroud)

然后恢复/lib/modules/在步骤 3 中备份的内容。(如果 PV ami 的内核与新的 HVM 机器不同。)

  1. 使用 AWS 控制台停止系统并分离所有卷。将TARGET VOLUME新实例上的附加为/dev/xvda

    请务必注意原始根设备的安装位置。在大多数情况下,它应该是/dev/xvda

  2. 启动您的 HVM 实例。它现在应该是您的光伏系统的精确副本。如果一切正常,您现在可以删除您的 PV 实例以及SOURCE VOLUME.

  • 这些说明真的很有帮助(并且对我有用!!)但我还有最后一个建议。由于最初的问题是关于制作 HVM AMI,所以不要隐含这一步,添加停止实例并从中制作 AMI(然后终止实例)的最后一步。此外,我遇到了与 @DanGravell 完全相同的问题,而且我没有使用磁存储,因此这些可能是可以在答案中解决的常见陷阱。 (2认同)

小智 10

域名注册地址:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI'  --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1 
Run Code Online (Sandbox Code Playgroud)

详细步骤:

根据Jeff Strunk 的回复进一步回答以简化步骤并提供有关 ec2 寄存器映像的更多详细信息:

  1. 使用 PV Image 创建实例。进行/更新您想要的任何更改。

  2. 从上面的实例创建 Image。

  3. 在 EC2 控制台中的 EC2 > Elastic Block Store > Snapshot 下找到上述 AMI 使用的快照 ID。

    或者如果您有 ec2 api 工具设置:

    ec2-describe-images ami-id_of_above_created_ami

    并找到 ami 的快照 ID

    .. 进一步步骤的假设:您的 ec2 密钥和 api 工具已设置并可以使用:

  4. 使用上面的快照注册一个新的 HVM AMI:示例:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1

在哪里

  • -d 是 AMI 描述
  • -n 是 AMI 名称
  • -s 是第 3 步中的快照 ID。
  • -a 是架构
  • --virtualization-type 需要使其成为 hvm
  • --sriov 用于启用增强网络,尽管它可能是多余的,但不确定。

想要查询更多的信息:

  • 除非我做错了什么,否则这不适用于限制实例类型的市场 AMI。尝试将官方的 MongoDB 半虚拟 AMI 转换为 HVM,虽然我可以创建 HVM AMI,但它不会用它启动 HVM 实例。 (2认同)