Amazon EC2 – 将根实例存储设备与EBS设备交换

我有一个具有“实例存储”设备的EC2实例作为根设备。 现在,我想附加一个EBS卷到同一个实例,只是我希望它是根设备。 那可能吗? 在这种情况下,实例存储设备会发生什么?

提前致谢

您可以将正在运行的实例迁移到EBS支持的AMI。 以下是我如何做到的:

  • 启动一个常规的S3 AMI支持的实例(或者因为你已经有一个你喜欢的实例,使用它)
  • 使EBS卷的大小与您的根sda1分区大小相同(对于m1.small,可能还有其他默认值为10G)
  • 使用Web控制台或命令行工具(例如/ dev / sdd)将该EBS卷附加到实例上的空闲块设备上
  • 停止实例上的服务(例如/etc/init.d/mysql stop等)
  • 将临时根卷复制到EBS卷:

dd bs = 65536 if = / dev / sda1 = / dev / sdd

  • 检查EBS卷的一致性:

fsck / dev / sdd

  • 将EBS卷挂载到实例上:

mount / dev / sdd / root / ebs-vol

  • 从EBS的fstab中删除/ mnt条目vol:

vim / root / ebs-vol / etc / fstab

  • 取消EBS卷:

umount / dev / sdd

  • 使用AWSpipe理控制台(或命令行API工具)创buildEBS卷的快照
  • 记下快照ID
  • 使用AWS注册快照映像,注意生成的AMI id,注册时记得指定内核和虚拟硬盘映像(这些应该与当前实例中使用的相同):

ec2-register -s snap-12345 -a i386 -d“AMI的描述”-n“image-name-of-image”-k aki-12345 -r ari-12345

  • 要创build具有超过10G持久性存储的实例,您必须使用cli工具。 例如20G

ec2-run-instances ami-54321 -t m1.small -n 1 -g default -availability-zone = eu-west-1a -k ec2 -key1 -b / dev / sda1 = snap-12345:20:false

  • 如果使用默认卷大小的AMI启动一个实例,一旦启动,您可以在线调整文件系统的大小:

resize2fs / dev / sda1

这可以在不创build新的AMI并且不启动新的实例的情况下完成。 完成后,原来的根卷保持连接在/ dev / sda1(或者最初挂载的任何地方,/ dev / sda1是许多AMI的默认path)。 原来的根卷不会被挂载到文件系统上 – 您需要通过“mount”命令自行完成。

这项技术需要最新的Ubuntu内核,即在10.04和10.10版本中运行的内核。 请查阅alestic.com以获取这些Ubuntu发行版的最新AMI ID。 这些最新的内核被configuration为从卷标为“uec-rootfs”的任何连接设备启动。 如果正在运行这些内核之一,则只需将当前(实例存储)根卷的卷标更改为其他内容,将新根的卷标更改为uec-rootfs,然后重新引导。 如果你没有运行这些内核之一,你不能使用这种技术。

这是代码。 把它放在一个文件(reroot.sh)上:

#! /bin/bash device=$1 # change the filesystem labels e2label /dev/sda1 old-uec-rootfs e2label $device uec-rootfs 

首先,将要作为新根的EBS卷附加到其中一个可用设备/dev/sdf../dev/sdp。 这可以通过直接EC2 API调用,使用EC2命令行API工具 (ec2-attach-volume),或使用boto等库或通过AWSpipe理控制台UI完成。

然后,以root身份运行reroot.sh脚本,并提供您附加新根卷的设备,如下所示:

 sudo reroot.sh /dev/sdp 

这将做肮脏的工作。 然后你只需重新启动:

 sudo shutdown -r now 

中提琴。

要testing这个,你应该创build一个EBS卷,你知道会正确启动。 我喜欢通过从上面提到的Ubuntu AMI中快照EBS支持的AMI的根卷来做到这一点。 从该快照中,您可以在任何可用区中创build新的可启动EBS卷。 确保可以区分正在运行的实例的原始根卷和新的EBS根卷之间的区别 – 在上面运行reroot过程之前,可以在旧的根卷上放置一个“标记”文件:

 cd touch this-is-the-original-root-volume 

然后,当你重新引导和重新启动,如果你的主目录中存在该文件,你仍然在运行原始的根卷。 如果不在那里,那么reroot-and-reboot工作。

以下是这种技术的两个示例用例,并有详细的解释:

http://shlomoswidler.com/2011/02/play-chicken-with-spot-instances.html

http://shlomoswidler.com/2011/02/recapture-unused-ec2-minutes.html

您也可以尝试以下工具将实例存储AMI转换为ebs-boot AMI: https : //cloudyscripts.com/tool/show/2

AlexM已经提出了很好的步骤。

你也会有兴趣检查这个链接: http : //coderslike.us/2009/12/07/amazon-ec2-boot-from-ebs-and-ami-conversion/

编辑:另一个链接: http : //www.elastician.com/2009/12/creating-ebs-backed-ami-from-s3-backed.html

我不确定转换现有的实例是多么的容易,但是现在亚马逊提供了在创build新实例时直接从EBS卷启动的function 。

代替这里的其他长评,我用下面的命令来做到这一点:

ec2-register –snapshot snap-9eb4ecf6 –architecture i386 – 名为“centos上的Zenoss Enterprise 3.0 beta 2” – 描述“这是从zenoss core beta 1和zenoss enterprise beta 2的安装,版本3.0或内部2.5.70 217)。一个ebs块设备被连接,文件系统rsynced,然后ebs被快照,这是基于。 –root-device-name / dev / sda1 –kernel aki-9b00e5f2