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

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

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

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

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

答案1

更新

AWS 已在 EC2 API 中启用此功能。它可作为以下--virtualization-type选项使用:aws ec2 register-image在新的基于 Boto 的 awscli 中。

原始答案

是的!遗憾的是,没有直接的方法可以做到这一点。此外,一些 PV 实例可能需要修改内核和引导加载程序。

  1. 从现有 PV AMI 创建卷。如果是您自己的 PV AMI,您可以从快照创建卷。如果是第三方 AMI,您需要启动实例并拍摄快照。
  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 缓存。

答案2

就我而言,我必须手动进行转换,因为我创建的实例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从此快照创建新卷 ( )。重新启动 HVM(新)实例。

  6. 使用 AWS 控制台:

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

转换过程

  1. 通过 SSH 连接到新实例并获取 root 访问权限:

     sudo su
    
  2. 安装源驱动器和目标驱动器。

     mkdir -p /mnt/source && mount /dev/xvdf /mnt/source
     mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
    

    在我的例子中,设备是/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
    
  5. /boot在源卷上删除:

     rm -Rf /mnt/source/boot
    
  6. 将源卷的数据复制到目标卷并保留所有属性:

     rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. 编辑/mnt/target/etc/fstab分区/,以便它TARGET VOLUME在步骤 (8) 中安装到最终位置时引用。使用标签或简单地使用以下内容:

     /dev/xvda1 /     ext4    defaults,barrier=0 1 1
    

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

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

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

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

答案3

总结:

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 

详细步骤:

进一步回答基于Jeff Strunk 的回应为了简化步骤并提供有关 ec2 注册映像的更多详细信息:

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

  2. 从上述实例创建图像。

  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 用于启用增强网络,尽管它可能是多余的,但不确定。

了解更多信息:

答案4

我尝试了这里所有的建议,但都没有用,于是我找到了一篇关于这个主题的优秀博客文章,网址为https://www.opswat.com/blog/aws-2015-why-you-need-switch-pv-hvm

该程序的要素(细节)如下:

  1. 安装grub在需要迁移的PV实例(源实例)上。

  2. 对源实例(源卷,SV)上的根卷进行预防性快照。

  3. 创建一个将迁移卷的临时 HVM 实例。

    1. 我使用了 Amazon Linux 实例
  4. 创建目标卷 (DV),并将其和 SV 附加到临时实例。

    1. DV 至少应该与 SV 一样大。

    2. 将 SV 附加为/dev/{sd,xvd}f,将 DV 附加为/dev/{sd,xvd}g

    3. 对 DV 进行分区:

    parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'

    partprobe /dev/xvdg

    udevadm settle

  5. 将 SV 的 FS 调整为最小尺寸,然后将dd其图像放到 DV 上。

    1. 清理源卷的 FS:e2fsck -f /dev/xvdf

    2. 最小化相同内容:resize2fs -M /dev/xvdf

    3. 观察 resize2fs 的输出(例如Resizing the file system on /dev/xvdf to 269020 (4k) blocks)并记下来以用于下一步。

    4. 将 SV 复制到 DV:dd if=/dev/xvdf of=/dev/xvdg1 bs=<block size from previous step, here 4k> count=<use block count from last step, here 269020>

    5. 在新分区上扩展FS:resize2fs /dev/xvdg1

  6. 安装grub到 DV 的启动块中

    1. 在DV上临时创建设备文件:mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. 安装 grub 文件:

    rm -f /mnt/boot/grub/*stage*

    cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/

    rm -f /mnt/boot/grub/device.map

    1. 在 chroot 环境中安装 grub:

    cat << ARNIE | chroot /mnt grub --batch

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. 对目标卷进行了其他一些小的更改后,捕捉该卷并从中创建 AMI。

    1. 整理临时设备文件:rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. 在 中/mnt/boot/grub/grub.conf,更改root (hd0)root (hd0,0),将 添加到(或替换console=*console=ttyS0到内核行,并在必要时在内核行中将root=*其替换为root=LABEL=/

    3. 在中/mnt/etc/fstab,确保根文件系统的行包含标记的引用,例如

    LABEL=/ / ext4 defaults,noatime 1 1

    1. 将新的根文件系统标记为e2label /dev/xvdg1 /

    2. 从临时实例中卸载 DV,并从临时实例中分离 SV 和 DV。

    3. 捕捉 DV,然后从该捕捉中创建 AMI 图像。

  8. 从该 HMI 启动 HVM 实例。这是您的迁移实例。

相关内容