web-dev-qa-db-ja.com

Amazon EC2 AMIを仮想またはVagrantボックスに変換する

実行中のEC2インスタンスのディスクイメージをコピーし(AMIを取得)、仮想ボックスにインポートするか、最終的にVagrantを使用して実行します。パッカー( http://www.packer.io/ )を使用すると、AMIと対応するVagrantボックスを作成して連携することができますが、現在実行中のインスタンスは2年以上実行されています複製するのは難しいでしょう。

この問題はdevopsコミュニティでは一般的ですが、私のオンライン調査では解決策を見つけられていません。このタスクを実行できるツールはありますか?

41
Justin W.

@ Drewness は、元の質問に対する最初のコメントでこの質問に回答したことに注意したいだけです。答えもアンカータグ内のリンクであるため、この答えを追加してわかりやすくします。リンクは次のページを指します: EC2 AMIをVagrant用にVMDKに変換する方法

したがって、基本的には、ルート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)rawディスクイメージをvmdkイメージに変換します。

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

Vmdkイメージをプライマリブートデバイスとしてマウントして、VirtualBox VMを作成します。

残念ながら、現時点では、Amazon LinuxカーネルをVirtualBox内で起動できませんでした。

10
BillMan

インスタンスをエクスポート する必要があります。

詳細については、 VM Amazon EC2からVMware On-Premiseにエクスポートする方法 をエクスポートする方法を確認してください。

個人的には、VMWareコンバーターをインスタンスにインストールし、ローカルシステムをVMDKに変換することにより、Windowsボックスでこれを実行しました。次に、VMDKをS3に投稿しました。

5
John