2014-02-20 48 views
29

我想复制正在运行的EC2实例(抓取AMI)的磁盘映像并将其导入到虚拟框中或最终使用Vagrant运行。我看到该打包程序(http://www.packer.io/)允许您创建AMI和相应的Vagrant框一起工作,但是当前运行的实例已经运行了两年多,并且难以复制。将Amazon EC2 AMI转换为Virtual或Vagrant框

我想这个问题在devops社区中很常见,但是在我的在线研究中还没有找到解决方案。有没有可以让你完成这项任务的工具?

+0

如果可能,我正在寻找一个易于重复/自动化的过程。 –

+0

对于未来的读者,也许尝试https://serverfault.com/questions/374861/converting-an-ec2-ami-to-vmdk-image# –

回答

7

您应该export the instance

有关更多详细信息,请检查:How to export a VM from Amazon EC2 to VMware On-Premise

就我个人而言,我在Windows上通过在实例上安装VMWare转换器并将本地系统转换为VMDK来完成此操作。然后我将VMDK发布到S3。

+0

导出只有在您最初导入时才可用,不是吗? “如果您以前使用VM Import将虚拟机导入Amazon EC2 ...” –

6

我只是想指出@Drewness在对原始问题的第一个评论中回答了此问题。我只是添加这个答案,使其更加清晰,因为答案也链接到了锚标签。链接指向以下页面:How to convert EC2 AMI to VMDK for Vagrant

所以基本上你需要启用root SSH访问,例如

$ sudo perl -i -pe 's/#PermitRootLogin .*/PermitRootLogin without-password/' /etc/ssh/sshd_config 
$ sudo perl -i -pe 's/.*(ssh-rsa .*)/\1/' /root/.ssh/authorized_keys 
$ sudo /etc/init.d/sshd reload # optional command<br> 

然后运行的系统复制到本地磁盘映像:

$ ssh -i ~/.ec2/your_key [email protected] 'dd if=/dev/xvda1 bs=1M | gzip' | gunzip | dd of=./ec2-image.raw 

之后,一个新的图像文件准备文件系统:

$ dd if=/dev/zero of=vmdk-image.raw bs=1M count=10240 # create a 10gb image file 
$ losetup -fv vmdk-image.raw # mount as loopback device 
$ cfdisk /dev/loop0 # create a bootable partition, write, and quit 
$ losetup -fv -o 32256 vmdk-image.raw # mount the partition with an offset 
$ fdisk -l -u /dev/loop0 # get the size of the partition 
$ mkfs.ext4 -b 4096 /dev/loop1 $(((20971519 - 63)*512/4096)) # format using the END number 

现在你需要从复制一切EC2图像为空图像:

$ losetup -fv ec2-image.raw 
$ mkdir -p /mnt/loop/1 /mnt/loop/2 # create mount points 
$ mount -t ext4 /dev/loop1 /mnt/loop/1 # mount vmdk-image 
$ mount -t ext4 /dev/loop2 /mnt/loop/2 # mount ami-image 
$ cp -a /mnt/loop/2/* /mnt/loop/1/ 

和Grub安装:

$ cp /usr/lib/grub/x86_64-pc/stage* /mnt/loop/1/boot/grub/ 

和卸载设备(umount /dev/loop1)和原始磁盘映像转换为VMDK图像:

$ qemu-img convert -f raw -O vmdk vmdk-image.raw final.vmdk 

现在只是创建一个VirtualBox的VM与VMDK图像装载在主引导设备。

不幸的是,在这一点上,我无法让亚马逊Linux内核在VirtualBox内启动。