是否可以根据现有的半虚拟化 (PV) AMI 创建硬件虚拟机 (HVM) AMI。
我最初的想法是启动一个新的 PV 实例,并使用命令ec2-create-image
创建一个新的镜像,同时指定 HVM 作为虚拟化类型。但是,ec2-create-image
没有命令行参数来指定虚拟化类型。
还有其他方法可以做到这一点吗?
答案1
更新
AWS 已在 EC2 API 中启用此功能。它可作为以下--virtualization-type
选项使用:aws ec2 register-image
在新的基于 Boto 的 awscli 中。
原始答案
是的!遗憾的是,没有直接的方法可以做到这一点。此外,一些 PV 实例可能需要修改内核和引导加载程序。
- 从现有 PV AMI 创建卷。如果是您自己的 PV AMI,您可以从快照创建卷。如果是第三方 AMI,您需要启动实例并拍摄快照。
- 使用任意 AMI 启动 HVM 实例。
- 停止该 HVM 实例。
- 从该实例分离根卷。
- 将 PV 卷作为根卷(/dev/sda1 或 /dev/sda(如果已分区))附加到 HVM 实例。
ec2-create-image
在 HVM 实例上运行。- 使用新的 HVM AMI 启动其他实例。
如果这不起作用,那么在执行第 5 步之前,您需要将该卷附加到正在运行的实例,设置 chroot,并为您的发行版安装内核和引导加载程序。您可能还需要清除日志和任何 cloud-init 缓存。
答案2
就我而言,我必须手动进行转换,因为我创建的实例aws ec2 register-image
没有启动。我的解决方案基于这个帖子在AWS EC2 论坛。
准备
确保所有卷都位于同一可用区域。
通过 SSH 连接到您想要迁移的 PV 机器并应用所有更新,然后注销。
转到 AWS 控制台并通过选择创建 PV 系统的相同基础 AMI(在我的情况下为 Amazon 64 位 Linux AMI)启动新的 HVM 实例。
通过 SSH 连接到这个新实例并应用所有更新,然后注销。
转到 AWS 控制台并停止 PV 实例。拍摄根设备的快照并
SOURCE VOLUME
从此快照创建新卷()。停止 HVM 实例。对新实例上的根设备进行快照,并
TARGET VOLUME
从此快照创建新卷 ( )。重新启动 HVM(新)实例。使用 AWS 控制台:
- 附加
SOURCE VOLUME
到新实例作为/dev/xvdf
。 - 附加
TARGET VOLUME
到新实例作为/dev/xvdg
。
转换过程
通过 SSH 连接到新实例并获取 root 访问权限:
sudo su
安装源驱动器和目标驱动器。
mkdir -p /mnt/source && mount /dev/xvdf /mnt/source mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
在我的例子中,设备是
/dev/xvdf
(源)和/dev/xvdg1
(目标)。根据分区数量和附加分区的位置,这些可能会在您的配置中发生变化(请参阅准备工作中的步骤 6)。使用ls -al /dev/xvd*
查看驱动器。备份
/lib/modules/*
(如果 PV ami 的内核与新的 HVM 机器不同。此模块被 AWS 的一些服务使用。)删除
/boot
目标卷以外的所有内容:cd /mnt/target && ls | grep -v boot | xargs rm -Rf
/boot
在源卷上删除:rm -Rf /mnt/source/boot
将源卷的数据复制到目标卷并保留所有属性:
rsync -aAXHPv /mnt/source/ /mnt/target
编辑
/mnt/target/etc/fstab
分区/
,以便它TARGET VOLUME
在步骤 (8) 中安装到最终位置时引用。使用标签或简单地使用以下内容:/dev/xvda1 / ext4 defaults,barrier=0 1 1
然后恢复/lib/modules/
在步骤 3 中备份的内容。(如果 PV ami 的内核与新的 HVM 机器不同。)
停止系统并使用 AWS 控制台分离所有卷。将
TARGET VOLUME
作为 附加到新实例上/dev/xvda
。请务必记下原始根设备的安装位置。大多数情况下,它应该是
/dev/xvda
。启动您的 HVM 实例。它现在应该是您的 PV 系统的精确副本。如果一切正常,您现在可以删除您的 PV 实例以及
SOURCE VOLUME
。
答案3
总结:
ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1
详细步骤:
进一步回答基于Jeff Strunk 的回应为了简化步骤并提供有关 ec2 注册映像的更多详细信息:
使用 PV 图像创建实例。进行/更新您想要的任何更改。
从上述实例创建图像。
在 EC2 控制台中的 EC2 > Elastic Block Store > Snapshot 下找到上述 AMI 使用的快照 ID。
或者如果你有 ec2 api 工具设置:
ec2-describe-images ami-id_of_above_created_ami
并找到 ami 的快照 ID
.. 进一步步骤的假设:您的 ec2 密钥和 api 工具已设置并可供使用:
使用上述快照注册一个新的 HVM AMI:例如:
ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1
在哪里
- -d 是 AMI 描述
- -n 是 AMI 名称
- -s 是步骤 3 中的快照 ID。
- -a 是架构
- --virtualization-type 是使其成为 hvm 所必需的
- --sriov 用于启用增强网络,尽管它可能是多余的,但不确定。
了解更多信息:
答案4
我尝试了这里所有的建议,但都没有用,于是我找到了一篇关于这个主题的优秀博客文章,网址为https://www.opswat.com/blog/aws-2015-why-you-need-switch-pv-hvm。
该程序的要素(细节)如下:
安装
grub
在需要迁移的PV实例(源实例)上。对源实例(源卷,SV)上的根卷进行预防性快照。
创建一个将迁移卷的临时 HVM 实例。
- 我使用了 Amazon Linux 实例
创建目标卷 (DV),并将其和 SV 附加到临时实例。
DV 至少应该与 SV 一样大。
将 SV 附加为
/dev/{sd,xvd}f
,将 DV 附加为/dev/{sd,xvd}g
。对 DV 进行分区:
parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'
partprobe /dev/xvdg
udevadm settle
将 SV 的 FS 调整为最小尺寸,然后将
dd
其图像放到 DV 上。清理源卷的 FS:
e2fsck -f /dev/xvdf
最小化相同内容:
resize2fs -M /dev/xvdf
观察 resize2fs 的输出(例如
Resizing the file system on /dev/xvdf to 269020 (4k) blocks
)并记下来以用于下一步。将 SV 复制到 DV:
dd if=/dev/xvdf of=/dev/xvdg1 bs=<block size from previous step, here 4k> count=<use block count from last step, here 269020>
在新分区上扩展FS:
resize2fs /dev/xvdg1
安装
grub
到 DV 的启动块中在DV上临时创建设备文件:
mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/
安装 grub 文件:
rm -f /mnt/boot/grub/*stage*
cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/
rm -f /mnt/boot/grub/device.map
- 在 chroot 环境中安装 grub:
cat << ARNIE | chroot /mnt grub --batch
device (hd0) /dev/xvdg
root (hd0,0)
setup (hd0)
ARNIE
对目标卷进行了其他一些小的更改后,捕捉该卷并从中创建 AMI。
整理临时设备文件:
rm -f /mnt/dev/xvdg /mnt/dev/xvdg1
在 中
/mnt/boot/grub/grub.conf
,更改root (hd0)
为root (hd0,0)
,将 添加到(或替换console=*
)console=ttyS0
到内核行,并在必要时在内核行中将root=*
其替换为root=LABEL=/
在中
/mnt/etc/fstab
,确保根文件系统的行包含标记的引用,例如
LABEL=/ / ext4 defaults,noatime 1 1
将新的根文件系统标记为
e2label /dev/xvdg1 /
从临时实例中卸载 DV,并从临时实例中分离 SV 和 DV。
捕捉 DV,然后从该捕捉中创建 AMI 图像。
从该 HMI 启动 HVM 实例。这是您的迁移实例。