从现有的半虚拟Linux AMI创buildAWS HVM Linux AMI

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

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

还有另一种方式去做这个吗?

    更新

    AWS在EC2 API中启用了此function。 它可以作为--virtualization-type选项来在新的基于awscli的boto中使用aws ec2 register-image

    原始答案

    是! 不幸的是,没有直接的办法。 而且,一些PV实例可能需要内核和引导程序修改。

    1. 从您现有的PV AMI创build一个卷。 如果是您自己的PV AMI,则可以从快照制作一个音量。 如果是第三方AMI,则需要启动实例并拍摄快照。
    2. 用任何AMI启动一个HVM实例。
    3. 停止HVM实例。
    4. 从该实例分离根卷。
    5. 将PV卷作为根卷(/ dev / sda1或/ dev / sda,如果已分区)连接到HVM实例。
    6. 在HVM实例上运行ec2-create-image
    7. 使用新的HVM AMI启动其他实例。

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

    在我的情况下,我不得不手动进行转换,因为我使用aws ec2 register-image创build的实例没有启动。 我的解决scheme基于AWS EC2论坛上的这篇文章 。

    制备

    确保所有卷位于相同的可用区域中。

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

    2. 转到AWS控制台,通过select与创buildPV系统相同的基本AMI(本例中为Amazon 64位Linux AMI)来启动新的HVM实例。

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

    4. 转到AWS Console并停止PV实例。 拍摄根设备的快照并从此快照创build一个新卷( SOURCE VOLUME )。

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

    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 (目标)。 这些可能会根据分区的数量和附加位置在您的configuration中发生变化(请参阅准备中的步骤6)。 使用ls -al /dev/xvd*查看驱动器。

    3. Backup /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. 编辑在/etc/fstab步骤3中备份的/ partition和restore /lib/modules/ /etc/fstab 。(如果PV ami的内核不同于新的HVM机器)

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

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

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

    TLDR:

     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图像创build实例。 创build/更新所需的任何更改。

    2. 从上面的实例创build图像。

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

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

      ec2-describe-images ami-id_of_above_created_ami

      并findami的快照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是架构
    • – 虚拟化types是使hvm成为必需的
    • –sriov是为了增强networking,虽然它可能是多余的,不确定。

    了解更多信息:

    • ec2 cli docs注册图像
    • ec2 api docs ec2-register

    您可以从AWS Web界面内部执行此操作。 导航到快照 ,单击想要转换为hvm所需的快照,然后单击操作 ,然后创build映像 。 在创build映像向导的下拉列表中selectHVM

    在尝试了所有这些build议之后,没有一个为我工作,我find了一个关于这个主题的出色博客,在https://www.opswat.com/blog/aws-2015-why-you-need-switch- pv-hvm 。

    程序的元素(细节)是:

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

    2. 在源实例(源卷,SV)上创build根卷的预警快照。

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

      1. 我使用了一个Amazon Linux实例
    4. 创build一个目标卷(DV),并将这个和SV连接到临时实例。

      1. DV应该至less和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上创build设备文件: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/ 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=*replaceconsole=* console=ttyS0 ,如有必要,将root=*replace为root=LABEL=/在内核行中

      3. /mnt/etc/fstab ,确保根FS的行包含一个带标签的引用,例如

      LABEL=/ / ext4 defaults,noatime 1 1

      1. e2label /dev/xvdg1 /标签新的根FS e2label /dev/xvdg1 /

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

      3. 快照DV,然后从该快照中创buildAMI图像。

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