首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EC2从qcow2映像文件创建自定义的qcow2 AMI

使用EC2从qcow2映像文件创建自定义的qcow2 AMI
EN

Stack Overflow用户
提问于 2014-06-03 16:02:29
回答 1查看 5.1K关注 0票数 3

我正在编写一个服务,它需要根据一个EC2图像文件在每个qcow2区域注册自定义AMI。

我一直在探索apache-libcloudboto库,但似乎构建AMI注册函数是为了基于正在运行的实例创建AMI,并且我希望将AMI建立在我的qcow2映像文件上。

如果这个问题没有一个简单的解决办法,我将采取一个复杂的解决办法。如果由于某种原因,这在qcow2图像文件中是不可能的,我也可以访问原始图像文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-15 14:13:08

我已经成功地以编程的方式做到了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以使用qemu-img手动完成,或者查看转换的一个简单的Python实现

基于原始图像文件的AMI注册过程概述:

  1. 选择一个AMI和相应的AKI作为“实用实例”。它不需要与您要注册的映像相同的操作系统。如果AMI在requiretty中启用了/etc/sudoers,则需要确保在尝试向节点进行SSH时请求伪终端,例如使用Paramiko的Channel.get_pty()方法。
  2. 根据所选的AMI和AKI旋转一个实用程序实例。它必须经过EBS优化(m1.large大小实例可以很好地与EBS一起工作),并且应该附加一个足够大的辅助EBS卷,以便您注册整个未压缩的图像。我使用/dev/sdb作为这个设备的名称。
  3. 一旦实用程序实例可以通过SSH访问,就让它将原始图像文件写入辅助卷。就我个人而言,我从互联网上提取一个.raw.xz文件,这是我想要写的图像,所以我的实用程序命令是sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb。请注意,在我的所有经验中,/dev/sdX设备在实际实例中都是以/dev/xvdX的形式访问的,但并不是所有地方都是这样的。
  4. 一旦实用程序命令完成,您就可以销毁实用程序节点,前提是在节点终止时使您的/dev/sdb卷不删除。如果没有,只需停止节点。如果以编程方式执行实用程序命令,则可以使用Paramiko的Channel.recv_exit_status()方法等待命令完成,然后检查指示成功的0退出状态。
  5. 一旦该实用程序实例不再运行,请对/dev/sdb卷进行快照。
  6. 快照完成后,可以将其注册为AMI。确保使用与您一直使用的相同的AKI,以及正确的根设备名称(我使用完整的磁盘映像,因此我的根设备名是/dev/sda而不是/dev/sda1)。亚马逊建议你现在使用hd0 pv-grub AKIs,而不是hd00。

实现这一切的一种方法是通过apache-libcloudparamiko Python库,这两个库都是pip-installable。一个很好的例子是Fedimg库,它实现了这个精确的方法,以便在Fedora云映像构建完成时在所有EC2区域自动注册新的AMI。

在实际实现此过程时,涉及到相当多的时间、异常处理和其他“难点”。这只是一个简单的概述,一个人必须采取的步骤,以解决挑战通过我的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24019770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档