亚马逊EC2 - 使用EBS设备替换根实例存储设备

53

我有一台使用“实例存储”设备作为根设备的EC2实例。 现在,我想将一个EBS卷附加到同一实例上, 只是我想让它成为根设备。 这种情况下是否可能? 实例存储设备会发生什么?

提前感谢。

6个回答

80
您可以将正在运行的实例迁移到EBS支持的AMI。以下是我如何操作的:
  • 启动常规的S3 AMI支持实例(或者,由于您已经拥有满意的实例,请使用该实例)
  • 创建与根分区sda1大小相同的EBS卷(目前m1.small和其他可能默认为10G)
  • 使用Web控制台或命令行工具(例如/dev/sdd)将该EBS卷附加到实例上的空闲块设备
  • 停止实例上的服务(例如/etc/init.d/mysql stop等)
  • 将临时根卷复制到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 "Description of AMI" -n "name-of-image" -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:false

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

resize2fs /dev/sda1


2
+1 不错的指导,虽然我不认为这是原帖作者想要的。 - kdgregory
1
非常感谢您的全面回答。太棒了! - Sug
3
我们基本上做了同样的事情,但是使用了排除功能的rsync而不是dd命令,效果也非常好。还有一件需要注意的事情(我知道这很显然,但一遍又一遍地发生):创建EBS卷时,请确保仔细检查它与您要附加到的实例位于同一个区域。;-) - Michael Kohl
2
我在第四个待办事项周围没有看到mnt条目。vim /root/ebs-vol/etc/fstab - John Hinnegan
我尝试按照这些指示操作,但是被dd搞糊涂了:sh-4.1# dd bs=65536 if=/dev/sda1 of=/dev/sdf dd: writing `/dev/sdf': No space left on device 131073+0 records in 131072+0 records out 8589934592 bytes (8.6 GB) copied, 244.983 s, 35.1 MB/s sh-4.1# fsck /dev/sdf fsck from util-linux-ng 2.17.2 e2fsck 1.42.3 (14-May-2012) /: recovering journal Error writing block 2097153 (Invalid argument). Ignore error<y>?有什么建议吗? - Bill Horvath

14
这可以在不创建新的AMI和启动新实例的情况下完成。完成后,原始根卷仍然连接到/dev/sda1(或者它最初挂载的任何位置。对于许多AMI,默认值为/dev/sda1)。原始根卷将不会被挂载到文件系统中-您需要通过"mount"命令自行完成。这种技术需要最近的Ubuntu内核,即10.04和10.10版本。请查看alestic.com以获取这些Ubuntu版本的最新AMI ID。这些最近的内核已配置为从任何附加设备引导,其卷标为"uec-rootfs"。如果您正在运行其中之一的内核,则只需将当前(instance-store)根卷的卷标更改为其他内容,将新根的卷标更改为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的库,或通过AWS管理控制台UI来完成。
然后,以root身份运行reroot.sh脚本,并提供您附加新根卷的设备,如下所示:
sudo reroot.sh /dev/sdp

这将完成繁琐的工作。然后您只需重新启动:

sudo shutdown -r now

嗨。

为了测试这一点,您应该创建一个您知道可以正常启动的EBS卷。我喜欢通过对上述Ubuntu AMI的基于EBS的AMI的根卷进行快照来实现这一点。从该快照中,您可以在任何可用区域创建一个新的可引导EBS卷。确保您能够区分运行实例的原始根卷和新的EBS根卷 - 在运行上述重新根目录过程之前,您可以在旧的根卷上放置一个“标记”文件:

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

接着,当您重新获取root权限并重启设备时,如果该文件存在于您的主目录中,则您仍在使用原始的root卷。如果该文件不存在,则重新获取root权限和重启设备已成功。

以下是两个使用此技术的示例用例,并附有详细说明:

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

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


1
+1,感谢你对我的回答做出的备注...它已经被删除了。 - kdgregory
1
Shlomo - 你太棒了!顺便说一下,我不得不将我的旧EBS卷从“uec-rootfs”重命名为“cloudimg-rootfs”,这似乎是今天Ubuntu AMIs的新引导标签,但除此之外,你的建议拯救了我。 - sourcedelica
虽然很奇怪,我试图从/dev/sda1分离原始卷,但它不允许我使用旧卷在/dev/sdf上启动。所以我尝试重新将旧卷附加到/dev/sda1,但我又回到了BIOS提示“引导硬盘失败。不是可引导的磁盘”的问题。唯一有效的是/dev/sda1上的原始EBS和/dev/sdf上的旧EBS。 - sourcedelica

6

1

0

0

我使用以下命令完成了这个操作:

ec2-register --snapshot snap-9eb4ecf6 --architecture i386 --name "Zenoss Enterprise 3.0 beta 2 on centOS" --description "This is from an install of zenoss core beta 1 and zenoss enterprise beta 2, both of version 3.0 (or internally 2.5.70 217). An ebs block device was attached, and the file system rsynced over, then ebs was snapshotted and this is basedd off that." --root-device-name /dev/sda1 --kernel aki-9b00e5f2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接