Amazon EC2 - 使用EBS设备交换根实例存储设备

时间:2010-01-17 21:26:41

标签: amazon-ec2 amazon-web-services cloud amazon-ebs

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

提前致谢

6 个答案:

答案 0 :(得分:79)

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

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

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

  • 检查EBS卷的一致性:
  

fsck / dev / sdd

  • 将EBS卷安装到实例上:
  

mount / dev / sdd / root / ebs-vol

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

vim / root / ebs-vol / etc / fstab

  • 取消EBS卷:
  

umount / dev / sdd

  • 使用AWS管理控制台(或命令行API工具)创建EBS卷的快照
  • 记下快照ID
  • 使用AWS注册快照映像,并记下生成的AMI ID,注册时记得指定内核和ramdisk映像(这些应与当前实例中使用的相同):
  

ec2-register -s snap-12345 -a i386 -d“AMI描述”-n“图像名称”-k aki-12345 -r ari-12345

  • 要创建具有超过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 :假

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

resize2fs / dev / sda1

答案 1 :(得分: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完成。

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

sudo reroot.sh /dev/sdp

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

sudo shutdown -r now

中提琴。

要对此进行测试,您应该创建一个您知道将正确启动的EBS卷。我喜欢通过从上面提到的Ubuntu AMI快照EBS支持的AMI的根卷来做到这一点。从该快照,您可以在任何可用区中创建新的可引导EBS卷。确保您可以区分正在运行的实例的原始根卷和新的EBS根卷 - 在运行上面的reroot过程之前,您可以在旧的根卷上放入“marker”文件:

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

答案 2 :(得分:6)

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

答案 3 :(得分:1)

答案 4 :(得分:0)

我不确定转换现有实例会有多容易,但亚马逊现在在创建新实例时提供the ability to boot directly from an EBS volume

答案 5 :(得分:0)

代替这里的其他长评,我使用以下命令来执行此操作:

ec2-register --snapshot snap-9eb4ecf6 --architecture i386 --name“Zenoss Enterprise 3.0 beta 2 on centOS”--description“这是来自zenoss核心beta 1和zenoss企业beta 2的安装,两者都是版本3.0(或内部2.5.70 217)。附加了一个ebs块设备,并且文件系统已经过了,然后ebs被快照,这是基于它的。“ --root-device-name / dev / sda1 --kernel aki-9b00e5f2