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

Posted

技术标签:

【中文标题】Amazon EC2 - 将根实例存储设备与 EBS 设备交换【英文标题】:Amazon EC2 - Swap root instance store device with EBS device 【发布时间】:2011-01-06 03:58:20 【问题描述】:

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

提前致谢

【问题讨论】:

【参考方案1】:

您可以将正在运行的实例迁移到 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 卷上的 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 "name-of-image" -k aki-12345 -r ari-12345

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

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

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

resize2fs /dev/sda1

【讨论】:

+1 不错的说明,尽管我认为这不是 OP 想要的。 非常感谢您的全面回答。太好了 我们基本上做了同样的事情,但是使用 rsync 和 excludes 而不是 dd,效果也很好。还有一件事需要注意(我知道这很明显,但它会一遍又一遍地发生):在创建 EBS 卷时,请确保仔细检查它与要附加到的实例位于同一区域;-) 我在第 4 个 todo 附近没有看到 mnt 条目。 vim /root/ebs-vol/etc/fstab 我尝试按照这些说明进行操作,但被 dd 搞砸了:sh-4.1# dd bs=65536 if=/dev/sda1 of=/dev/sdf dd: writing `/dev/sdf':设备 131073+0 上没有剩余空间 131072+0 记录中的记录 8589934592 字节 (8.6 GB) 已复制,244.983 秒,35.1 MB/秒 sh-4.1# fsck /dev/sdf fsck from util-linux-ng 2.17.2 e2fsck 1.42.3(2012 年 5 月 14 日)/:恢复日志错误写入块 2097153(无效参数)。忽略错误?有什么建议吗?【参考方案2】:

这可以在不创建新 AMI 和启动新实例的情况下完成。完成后,原始根卷仍附加在 /dev/sda1(或它最初安装的任何位置。/dev/sda1 是许多 AMI 的默认值)。原始根卷不会挂载到文件系统 - 您需要自己通过“挂载”命令来完成。

该技术需要最新的 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 过程之前,您可以在旧根卷上放入一个“标记”文件:

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

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

以下是该技术的两个示例用例,并有详尽的解释:

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

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

【讨论】:

+1,感谢您在我的回答中添加注释……它现在已被删除。 Shlomo - 你太棒了!仅供参考 - 我不得不将我的旧 EBS 卷从 uec-rootfs 重命名为 cloudimg-rootfs,这似乎是 Ubuntu AMI 的新启动标签,但除此之外,您的建议救了我的培根。 虽然它很奇怪,但我尝试从/dev/sda1 分离原始卷,但它不会让我在/dev/sdf 上使用旧卷启动。所以我尝试将旧卷重新附加到/dev/sda1,但我又回到了 Bios 显示“从硬盘引导失败。不是可引导磁盘”的问题。唯一有效的是 /dev/sda1 上的原始 EBS 和 /dev/sdf 上的旧 EBS【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

ec2-register --snapshot snap-9eb4ecf6 --architecture i386 --name "centOS 上的 Zenoss Enterprise 3.0 beta 2" --description "这是来自 zenoss core beta 1 和 zenoss enterprise beta 2 的安装,两者都是版本 3.0(或内部 2.5.70 217)。附加了一个 ebs 块设备,文件系统重新同步,然后 ebs 被快照,这是基于此。 --root-device-name /dev/sda1 --kernel aki-9b00e5f2

【讨论】:

以上是关于Amazon EC2 - 将根实例存储设备与 EBS 设备交换的主要内容,如果未能解决你的问题,请参考以下文章

在 ec2 实例中部署 eb 后,ruby 应用程序 aws 数据丢失

使用 MySQL Workbench 安全组通过 EC2 实例连接到 Amazon RDS 实例

从 EC2 实例本地访问 Amazon S3 存储桶

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

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

Amazon EC2 的名词解释