2010-01-17 119 views
52

我有一个EC2实例,其中有“实例存储”设备作为根设备。 现在,我想附加一个EBS卷到同一个实例, 只有我想它是的根设备。 这可能吗? 这种情况下,实例存储设备会发生什么变化?Amazon EC2 - 使用EBS设备交换根实例存储设备

在此先感谢

回答

78

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

  • 启动了定期S3支持AMI实例(或者因为你已经有了一个实例你满意,请使用)
  • 使同样大小的EBS卷作为您的根sda1分区(当前默认为10G,用于m1.small以及其他可能的默认值)
  • 使用Web控制台或命令行工具(例如/ dev/sdd)将该EBS卷附加到实例上的空闲块设备上,
  • 停止实例上的服务(例如/etc/init.d/mysql stop等)
  • 复印短暂根卷至EBS体积:

DD BS = 65536若=的/ dev/SDD

  • =的/ dev/SDA1检查EBS卷一致性:

的fsck的/ dev/SDD

  • 摩EBS卷到实例:

安装的/ dev/SDD /根/ EBS-体积

  • 取下的fstab上的/ mnt条目您的EBS卷:

VIM /根/ EBS-体积/ etc/fstab中

  • Unmout EBS卷:

卸除的/ dev/SDD

  • 创建的快照使用AWS管理控制台(或命令行API工具)的EBS卷
  • 记下t他快照ID
  • 与AWS注册快照映像,并注意生产的AMI的ID,注册记得指定内核和ramdisk图像时(这应该是相同的那些在当前的情况下使用):

EC2注册-s管理单元12345 -a I386 -d “AMI的说明” -n “名称的图像” -k AKI-12345 -r ARI-12345

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

ec2-run-instances ami-54321 -t m1。小-n 1 -g默认--availability区=欧盟 - 西-1A -k EC2-key1的-b的/ dev/sda1的=管理单元12345:20:假

  • 如果你启动一个例如,基于这些的AMI与>默认音量大小,一旦它开始了,你可以做文件系统的在线调整大小的一个:

resize2fs的/ dev/sda1的

+2

+1很好的说明,但我不认为这是OP想要什么。 – kdgregory 2010-01-20 12:57:29

+1

非常感谢您的全面回答。这太好了 – Sug 2010-02-03 21:46:12

+3

我们基本上做了同样的事情,但是使用rsync与excludes而不是dd,也像魅力一样工作。 还有一件事需要注意(我知道这很明显,但它会一遍又一遍地发生):创建EBS卷时,请确保重复检查它与要附加到的实例位于同一区域; - ) – 2010-03-10 14:56:05

0

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

EC2注册--snapshot管理单元9eb4ecf6 --architecture I386 - 名称“centos上的Zenoss Enterprise 3.0 beta 2” - 描述“这是来自zenoss核心beta 1和zenoss enterprise beta 2的3.0版本(或内部2.5.70 217)的安装。 “--root-device-name/dev/sda1 --kernel aki-9b00e5f2

13

这可以在不创建一个新的AMI和无需启动完成新实例。完成后,原来的根卷保持连接在/ dev/sda1上(或者最初挂载的任何位置,/ dev/sda1是许多AMI的默认设置)。原始根卷不会被挂载到文件系统 - 您需要通过“mount”命令自行完成。

该技术需要最新的Ubuntu内核,即在10.04和10.10版本中运行的内核。查看alestic.com获取这些Ubuntu版本的最新AMI ID。这些最新的内核被配置为从卷标为“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 Command Line API tools(ec2-attach-volume)或库(如boto)或通过AWS管理控制台UI完成。

然后,运行reroot.sh脚本根,并为您提供安装在新的根卷的设备,如下所示:

sudo reroot.sh /dev/sdp 

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

sudo shutdown -r now 

中提琴。

要测试这个,你应该创建一个EBS卷,你知道会正确启动。我喜欢通过从上面提到的Ubuntu AMI中快照EBS支持的AMI的根卷来做到这一点。从该快照中,您可以在任何可用区域创建一个新的可启动EBS卷。确保你可以告诉运行实例的原始根体积和新的EBS根卷之间的区别 - 您运行reroot以上过程,你可以把一个“标志”文件中的旧根卷上之前:

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

然后,当您重新根据并重新启动时,如果该文件存在于您的主目录中,您仍然使用原始根卷运行。如果它不在那里,那么重新启动和重新启动工作。

这里有两个例子用例这种技术,具有全面的讲解:

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

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

+1

+1,并感谢您在我的答案上做笔记...现在已删除。 – kdgregory 2011-03-31 12:19:43