使用Python从qcow2映像文件创建自定义ec2ami

2024-06-07 21:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我一直在研究apache-libcloudboto库,但是看起来AMI注册函数是为了根据运行的实例创建AMI的,我想将AMI基于我的qcow2映像文件。在

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


Tags: 文件实例函数区域apache图像文件ec2boto
1条回答
网友
1楼 · 发布于 2024-06-07 21:10:37

我已经成功地通过编程实现了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以使用qemu-img手动进行转换,或者参见转换的a simple Python implementation。在

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

  1. 选择一个AMI和相应的AKI作为“实用程序实例”。它不必与您要注册的映像使用相同的操作系统。如果AMI在/etc/sudoers中启用了requiretty,那么您需要确保在尝试SSH进入节点时请求一个伪终端,例如使用Paramiko的Channel.get_pty()方法。

  2. 根据所选的AMI和AKI启动一个实用程序实例。它必须是EBS优化的(m1.large大小的实例可以很好地与EBS一起工作),并且应该附加一个辅助EBS卷,该卷足够大,可以容纳要注册的整个未压缩映像。我用/dev/sdb作为这个设备名。

  3. 一旦可以通过SSH访问实用程序实例,让它将原始映像文件写入辅助卷。就个人而言,我从Internet上提取了一个.raw.xz文件,这就是我要写的图像,因此我的实用程序命令是sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb。请注意,在我的所有经验中,/dev/sdX设备在实际实例中被访问为/dev/xvdX,但这可能不是所有地方都是这样。

  4. 一旦utility命令完成,您就可以销毁该实用程序节点,假设您已经使/dev/sdb卷在节点终止时不被删除。如果没有,请停止节点。如果以编程方式执行实用程序命令,可以使用Paramiko的Channel.recv_exit_status()方法等待命令完成,然后检查指示成功的0退出状态。

  5. 一旦实用程序实例不再运行,请拍摄/dev/sdb卷的快照。

  6. 快照完成后,可以将其注册为AMI。确保使用您一直使用的AKI,以及正确的根设备名称(我使用完整的磁盘映像,因此我的根设备名是/dev/sda,而不是/dev/sda1)。亚马逊建议你现在使用hd0pvgrubakis,而不是hd00。

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

在实际实现这个过程时,需要进行大量的计时、异常处理和其他“陷阱”。这只是一个简单的步骤,一个人必须采取的步骤,通过我的方法解决挑战。在

相关问题 更多 >

    热门问题