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


38

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

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

还有另一种方法可以做到这一点吗?

Answers:


22

更新资料

AWS已在EC2 API中启用了此功能。它是新的基于Boto的awscli中的--virtualization-type选项aws ec2 register-image

原始答案

是! 不幸的是,没有直接的方法可以做到这一点。另外,某些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
我尝试了第1-5步,但对我而言无效,因为实例在几秒钟后停止了。有人可以详细说明如何设置chroot以及安装内核和引导程序吗?新旧实例均为AMI Linux。谢谢。
tolgamorf,2015年

如果您有一个正在运行的PV实例,则可以通过aws ec2 register-image在PV映像的快照上运行--virtualization-type标志来将其转换为HVM 。有关aws ec2 register-image help详细信息,请参见。
Jeff Strunk 2015年

2
我使用,从PV实例创建了HVM映像aws ec2 register-image。然后,我从该映像启动了一个新的HVM实例。但是,系统无法启动。
tolgamorf 2015年

在浏览了aws ec2论坛之后,我想出了一个解决方案,其中的转换是通过手动替换文件来完成的。我会尽快写出答案。
tolgamorf 2015年

@tolgamorf,你还记得你所做的一切吗?我有同样的问题。
德米特里·明科夫斯基

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
    
  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实例,也可以删除SOURCE VOLUME


1
你为什么不简单地做一个rm -f /bootcp -a /mnt/source/boot /mnt/target
michelem

@Michelem如果我没记错的话,我首先尝试这样做。机器没有启动。
tolgamorf 2015年

1
@tolgamorf是否有机会更新答案以反映这一点?
Dan Tenenbaum'2

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

1
非常感谢!这节省了我很多时间,对其进行了编辑以清除fstab部分,这使我有些困惑。当心在步骤(4)中,我以某种方式删除了临时卷的根目录,而不是目标,从而破坏了该卷并不得不重新启动该过程。
Zar

10

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映像创建实例。进行/更新所需的任何更改。

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

  3. 在EC2控制台的EC2>弹性块存储>快照中找到上述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-虚拟化类型hvm -s snap-b44feb18 --root-device-name / dev / sda1

哪里

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

欲获得更多信息:


2
除非我做错了事,否则这对于限制实例类型的市场AMI将不起作用。尝试将官方的MongoDB半虚拟AMI转换为HVM,虽然我可以创建HVM AMI,但是它不会启动HVM实例。
马特·贝克曼

@MattBeckman我认为它与基础内核/引导加载程序支持有关,而不是与AMI限制有关。以上适用于fedora,但不适用于Amazon Linux。在那里,您必须按照Jeff Strunk最初提出的建议进行操作。
2014年

1
它起作用了@AnshuPrateek
Atmesh Mishra,

2

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


9
我只是试过了,但是好像实例无法正确启动。在我启动它后不久,它本身就处于停止状态。
ovi 2015年

1

尝试了本文中的所有建议(对我来说都没有用)之后,我在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,确保根FS的行包含标记的引用,例如

    LABEL=/ / ext4 defaults,noatime 1 1

    1. 将新的根FS标记为 e2label /dev/xvdg1 /

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.