2024-06-07 21:10:37 发布
网友
我正在编写一个服务,它需要根据qcow2映像文件在每个EC2区域注册自定义ami。在
我一直在研究apache-libcloud和boto库,但是看起来AMI注册函数是为了根据运行的实例创建AMI的,我想将AMI基于我的qcow2映像文件。在
apache-libcloud
boto
如果这个问题没有一个简单的解决办法,我就选一个复杂的。如果出于某种原因,这是不可能与qcow2图像文件,我也可以访问原始图像文件。在
我已经成功地通过编程实现了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以使用qemu-img手动进行转换,或者参见转换的a simple Python implementation。在
qemu-img
基于原始图像文件的AMI注册流程概述:
选择一个AMI和相应的AKI作为“实用程序实例”。它不必与您要注册的映像使用相同的操作系统。如果AMI在/etc/sudoers中启用了requiretty,那么您需要确保在尝试SSH进入节点时请求一个伪终端,例如使用Paramiko的Channel.get_pty()方法。
/etc/sudoers
requiretty
Channel.get_pty()
根据所选的AMI和AKI启动一个实用程序实例。它必须是EBS优化的(m1.large大小的实例可以很好地与EBS一起工作),并且应该附加一个辅助EBS卷,该卷足够大,可以容纳要注册的整个未压缩映像。我用/dev/sdb作为这个设备名。
m1.large
/dev/sdb
一旦可以通过SSH访问实用程序实例,让它将原始映像文件写入辅助卷。就个人而言,我从Internet上提取了一个.raw.xz文件,这就是我要写的图像,因此我的实用程序命令是sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb。请注意,在我的所有经验中,/dev/sdX设备在实际实例中被访问为/dev/xvdX,但这可能不是所有地方都是这样。
.raw.xz
sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb
/dev/sdX
/dev/xvdX
一旦utility命令完成,您就可以销毁该实用程序节点,假设您已经使/dev/sdb卷在节点终止时不被删除。如果没有,请停止节点。如果以编程方式执行实用程序命令,可以使用Paramiko的Channel.recv_exit_status()方法等待命令完成,然后检查指示成功的0退出状态。
Channel.recv_exit_status()
0
一旦实用程序实例不再运行,请拍摄/dev/sdb卷的快照。
快照完成后,可以将其注册为AMI。确保使用您一直使用的AKI,以及正确的根设备名称(我使用完整的磁盘映像,因此我的根设备名是/dev/sda,而不是/dev/sda1)。亚马逊建议你现在使用hd0pvgrubakis,而不是hd00。
/dev/sda
/dev/sda1
实现这一切的一种方法是通过apache-libcloud和{}Python库,这两个库都是{}可安装的。一个很好的例子是Fedimg库,它实现了这个精确的方法,以便在Fedora云映像构建完成时自动在所有EC2区域注册新的AMI。在
在实际实现这个过程时,需要进行大量的计时、异常处理和其他“陷阱”。这只是一个简单的步骤,一个人必须采取的步骤,通过我的方法解决挑战。在
我已经成功地通过编程实现了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以使用
qemu-img
手动进行转换,或者参见转换的a simple Python implementation。在基于原始图像文件的AMI注册流程概述:
选择一个AMI和相应的AKI作为“实用程序实例”。它不必与您要注册的映像使用相同的操作系统。如果AMI在
/etc/sudoers
中启用了requiretty
,那么您需要确保在尝试SSH进入节点时请求一个伪终端,例如使用Paramiko的Channel.get_pty()
方法。根据所选的AMI和AKI启动一个实用程序实例。它必须是EBS优化的(
m1.large
大小的实例可以很好地与EBS一起工作),并且应该附加一个辅助EBS卷,该卷足够大,可以容纳要注册的整个未压缩映像。我用/dev/sdb
作为这个设备名。一旦可以通过SSH访问实用程序实例,让它将原始映像文件写入辅助卷。就个人而言,我从Internet上提取了一个
.raw.xz
文件,这就是我要写的图像,因此我的实用程序命令是sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb
。请注意,在我的所有经验中,/dev/sdX
设备在实际实例中被访问为/dev/xvdX
,但这可能不是所有地方都是这样。一旦utility命令完成,您就可以销毁该实用程序节点,假设您已经使
/dev/sdb
卷在节点终止时不被删除。如果没有,请停止节点。如果以编程方式执行实用程序命令,可以使用Paramiko的Channel.recv_exit_status()
方法等待命令完成,然后检查指示成功的0
退出状态。一旦实用程序实例不再运行,请拍摄
/dev/sdb
卷的快照。快照完成后,可以将其注册为AMI。确保使用您一直使用的AKI,以及正确的根设备名称(我使用完整的磁盘映像,因此我的根设备名是
/dev/sda
,而不是/dev/sda1
)。亚马逊建议你现在使用hd0pvgrubakis,而不是hd00。实现这一切的一种方法是通过}Python库,这两个库都是{}可安装的。一个很好的例子是Fedimg库,它实现了这个精确的方法,以便在Fedora云映像构建完成时自动在所有EC2区域注册新的AMI。在
apache-libcloud
和{在实际实现这个过程时,需要进行大量的计时、异常处理和其他“陷阱”。这只是一个简单的步骤,一个人必须采取的步骤,通过我的方法解决挑战。在
相关问题 更多 >
编程相关推荐