AWS EC2:如何使用 pivot_root 重新安装以前的 EBS 卷?

AWS EC2: How to remount previous EBS volume using pivot_root?

我启动了一个 EC2 Spot 实例并取消选中 EBS 根卷的 "Delete On Termination" 选项。我选择了 Ubuntu 14.04 64 位 HVM AMI。

在某些时候,实例因最高价格而终止,而 EBS 卷仍按预期保留。现在,最终当 Spot 实例重新启动时,它会创建一个全新的 EBS 根卷。旧的 EBS 根卷仍然在那里。

实际上,出于测试目的,我通过手动终止 Spot 实例并启动新实例来模拟上述事件,但我认为在实际使用中结果会相同。

那么现在,我怎样才能将旧的 EBS 卷重新挂载为当前的根卷?

我尝试了 http://linux.die.net/man/8/pivot_root 中的示例,并进行了一些修改以避开明显的错误:

# manually attach old EBS to /dev/sdf in the AWS console, then do:
sudo su -
mkdir /new-root
mkdir /new-root/old-root
mount /dev/xvdf1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

终端在 exec chroot 命令处挂起,实例不会接受新的 ssh 连接。

我真的很想让它工作,因为它提供了一种方便的机制,可以节省开发、测试和面向批处理的 EC2 实例的按需价格,而无需重新构建整个应用程序部署,并且没有预留实例的承诺。

我错过了什么?

答案是将 pivot_root 调用放在初始(临时)EBS 根卷上的 /sbin/init 内。

这里有一些脚本可以自动启动新的 Spot 实例并修改第一个(临时)EBS 卷上的 /sbin/init 以从第二个(持久)EBS 卷链式加载系统:

https://github.com/atramos/ec2-spotter