注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
将 Ubuntu 虚拟机从 Amazon Web Services 迁移到 Oracle Cloud Infrastructure
简介
从 Amazon Web Services (AWS) 迁移到 Oracle Cloud Infrastructure (OCI) 对许多组织来说是一项越来越频繁的工作,因为 OCI 是新一代云,允许应用以更低的成本更快、更安全地运行。
虚拟机 (Virtual Machine,VM) 迁移通常是此类努力的核心部分,可帮助客户查找有关如何将虚拟机从 AWS 迁移到 OCI 的适当指导。此外,对于许多组织来说,Linux 是其大部分基础设施。因此,本教程侧重于将运行使用最广泛的 Linux 发行版 (Ubuntu) 的虚拟机从 AWS 迁移到 OCI。
本教程为客户提供有关将虚拟机迁移到 OCI 的要求以及如何准备和迁移 Ubuntu VM 从 AWS 到 OCI 的指导,以便可以在半虚拟化模式下在 OCI 中启动该 VM。OCI 还允许在仿真模式下启动实例,但与在仿真模式下运行相比,使用半虚拟化设备的 VM 提供的性能要快得多,磁盘 I/O 性能至少提高了六倍。
整个过程包括准备 AWS 中的 VM、将其导出到 Amazon Simple Storage Service (S3)、将其传输到 OCI 对象存储、在 OCI 中创建定制映像以及从 OCI 启动实例。Amazon S3 与 OCI 对象存储之间的映像传输使用开源工具 rclone 执行,如果您只是尝试使用小尺寸映像,则可以手动执行。不过,我们建议使用 rclone ,因为它可以使传输映像更快、更简单。
有关将定制映像导入到 OCI 的更多信息,请参阅导入定制 Linux 映像。
目标
-
在 AWS 中准备 Ubuntu VM 以迁移到 OCI。
-
将准备好的 VM 作为映像导出到 Amazon S3。
-
将映像传输到 OCI 并基于它创建实例。
先决条件
-
访问可以创建或已经具有 API 密钥并且可以访问 S3 和 EC2 的 AWS 账户。
-
访问 OCI 租户和区间,以启动映像迁移和实例。
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 策略:
- 允许访问 OCI 对象存储。
- 在 OCI 中预配 VM(针对 rclone VM 和基于定制映像的 VM)。
- 允许创建 OCI API 密钥。
假设
-
预配了
pem
公钥的 AWS VM。 -
AWS Ubuntu VM 只有 1 个卷:其引导卷。
-
AWS 映像可导出;本教程中使用的 Amazon Machine Image (AMI) 是截至 2024 年 3 月 Ubuntu 22.04 的 AWS 平台映像。
-
在 AWS Cloud Shell 上执行的 AWS 命令行操作。您也可以使用 AWS CLI 工具。
-
在 OCI 中预配了 Oracle Linux VM,通过 SSH 连接到 Amazon S3。此 VM 用于安装和配置 rclone,以便在 Amazon S3 和 OCI 对象存储之间传输映像。
任务 1:准备数据传输基础结构
本教程使用以下数据传输体系结构:
-
通过互联网在 Amazon S3 与 rclone 执行的 OCI 对象存储之间传输映像。对于生产级部署,建议使用 Oracle Cloud Infrastructure 站点到站点 VPN 或 FastConnect。有关详细信息,请参阅 VPN Connection to AWS 和 FastConnect 。
-
配置了用户主用户身份验证的 Rclone,可安全访问 Amazon S3 和 OCI 对象存储。
任务 1.1:准备 Amazon S3 和 OCI 对象存储存储桶
在本任务中,我们将在以下位置创建一个存储桶:
- 用于将映像导出到的 Amazon S3。
- 用于存储从 Amazon S3 传输的 VM 磁盘映像的 OCI 对象存储。
在 Amazon S3 中使用以下属性创建存储桶:
- 已启用访问控制列表 (ACL)。我们需要附加定制 ACL,以允许将映像导出到 Amazon S3。
- 阻止所有公共访问。
在 Amazon S3 存储桶权限中,使用与您正在使用的 AWS 区域匹配的授权将 ACL 附加到存储桶,如下图中所示。请在此处查阅特定于被授权者区域的规范帐户 ID:使用 VM 导入/导出将实例导出为 VM 。
通过在标准存储层上的 OCI 对象存储中创建存储桶来完成此任务。这是稍后将 VM 映像从 Amazon S3 传输到的存储桶。
任务 1.2:安装和配置 Rclone
在本任务中,我们将在 OCI 上运行的 VM 中安装 rclone。如果您正在试验小型 VM,并使用 2 个遥控器(Amazon S3 和 OCI Object Storage)配置 rclone,则可以在本地计算机上安装 rclone。
-
将 rclone 和 SSH 安装到 OCI 中的 Oracle Linux VM 中。
sudo -v ; curl https://rclone.org/install.sh | sudo bash
-
在 rclone 中执行远程配置。这可通过启动 rclone 配置会话来完成。在命令行中运行以下命令。
rclone config
-
对于 Amazon S3 远程配置,请输入以下信息。
- 远程名称:输入远程名称。
- 远程类型:选择 S3 类型。
- 提供商:选择 AWS 。
- access_key_id :输入与您决定使用的 AWS 用户关联的访问密钥 ID。
- secret_access_key :输入与访问键 ID 匹配的密钥访问键。
- 区域:选择您正在处理的 AWS 区域。
- location_constraint :选择与您正在处理的 Amazon Web 区域匹配的位置约束。对于某些区域(例如法兰克福),此项可能为空。
- acl :选择 private 以确保创建受限制的预置 ACL。有关更多信息,请参见 Canned ACL 。
-
对于 OCI 对象存储的 rclone 访问,本教程使用 OCI 用户和 API 签名密钥。或者,您可以使用动态组。有关更多信息,请参见 Calling Services from an Instance 。
在配置 OCI Object Storage Remote 之前,我们将:
-
为 rclone 创建 OCI API 签名密钥以验证 OCI 对象存储并执行映像数据传输。要创建 API 签名密钥并记下在 VM 上存储密钥的目录(因为您需要在 OCI 配置文件中提供密钥),请参见 How to Generate an API Signing Key 。
-
创建 OCI 配置文件。此配置文件需要 OCI API 签名密钥。有关更多信息,请参见 SDK and CLI Configuration File 。
要了解使用 OCI 提供程序的 rclone 验证选项,请参阅宣布在 rclone 中提供原生 OCI 对象存储提供程序后端支持。
-
-
OCI 配置文件通常存储为目录中的
config
命名文件。~/.oci/
-
创建 OCI API 签名密钥和 OCI 配置文件后,您可以在 rclone 中配置 OCI 远程。运行以下命令以启动配置会话。
rclone config
-
输入 OCI 对象存储远程配置的以下信息。
- 远程名称:输入远程名称。
- 类型:选择 Oracle 对象存储。
- 提供商:选择
user_principal_auth
(就像您将使用 OCI 用户和 API 签名密钥一样),如果使用动态组,请选择instance_principal_auth
。 - 名称空间:输入租户名称空间。
- 区间:输入 OCI 存储桶区间 OCID。
- 区域:输入在 OCI 中工作的区域。
- 端点:留空或按以下格式输入端点:
https://<namespace>.objectstorage.<region-code>.oci.customer-oci.com/n/<namespace>
。
-
使用以下命令检查 rclone 远程配置文件。
cat ~/.config/rclone/rclone.conf
任务 2:准备源 VM 引导卷
任务 2.1:执行 AWS VM 引导卷的强制快照
执行 AWS VM 引导卷的快照。在启动任何引导卷配置活动之前,这是必需的。
任务 2.2:启用串行控制台
串行控制台连接允许用户对 VM 进行故障排除,执行诸如系统配置文件编辑和密码重置等活动。通常,要为串行控制台准备 VM,需要配置 GRUB 引导装载程序文件。此文件位于 /etc/default/grub
中。AWS Ubuntu 平台映像不仅需要配置 /etc/default/grub
文件,还需要配置 /etc/default/grub.d/50-cloudimg-settings.cfg
文件。后一个文件由云映像构建进程修改并覆盖 etc/default/grub
配置。
最重要的 GRUB 配置参数为:
- GRUB_TIMEOUT_STYLE: Make sure it is commented if its value is "hidden"; alternatively, change it to "menu".
- GRUB_TIMEOUT: Make sure it is higher than 0 to allow boot mode selection without skipping directly to the default option. Specify this value in both files.
- GRUB_CMDLINE_LINUX: Make sure "console=tty1 console=ttyS0, 115200" is appended to it.
- GRUB_TERMINAL: Make sure its value is "serial console".
- GRUB_SERIAL_COMMAND: Make sure its value is "serial -- unit=0 --speed=115200".
-
打开
/etc/default/grub.d/50-cloudimg-settings.cfg
。sudo vi /etc/default/grub.d/50-cloudimg-settings.cfg
编辑该文件,使其看起来像下图中所示的文件。
-
打开
/etc/default/grub
。sudo vi /etc/default/grub
编辑该文件,使其看起来像下图中所示的文件。
-
编辑文件后,运行以下命令以确保 GRUB 引导装载程序得到充分更新。
sudo update-grub
任务 2.3:检查半虚拟化驱动程序
要将 VM 导入 OCI 以便可以在半虚拟化模式下启动,映像中需要存在半虚拟化 VirtIO 驱动程序。在此任务中,我们将检查内核和 initramfs 临时文件系统以确认驱动程序是否存在。请注意,运行内核版本 3.4 或更高版本的基于 Linux 的操作系统支持半虚拟化驱动程序;因此,您通常只需要检查并确认它们是否存在。
所需的最小 VirtIO 驱动程序集包括 pci
和 scsi
。这些驱动程序应存在于内核或 initramfs 中。
-
使用以下命令检查 AWS VM 的内核。
sudo grep -i virtio /boot/config-$(uname -r)
注:
pci
VirtIO 驱动程序存在于内核中。 -
使用以下命令检查 AWS VM 的内核。
sudo lsinitramfs /boot/initrd.img-$(uname -r) | grep virtio
注:
scsi
VirtIO 驱动程序存在于 initramfs 中。 -
如果 VM 的引导卷没有驱动程序,则需要使用
dracut
重建 initramfs。sudo dracut -v -f --add-drivers “virtio virtio_pci virtio_scsi” /boot/initramfs-$(uname -r).img $(uname -r)
任务 2.4:配置网络设置
对于网络配置,请确保:
- VM 正在使用 DHCP。
- 将删除网络配置中的任何 MAC 地址硬编码引用。
在 Linux 上执行网络配置的方法有多种。Canonical 开发了 Netplan 实用程序来简化此任务。本教程使用 Netplan,但您也可以更改网络配置文件(如果这是您的首选设置)。
-
AWS Ubuntu 平台映像在
/etc/netplan/50-cloud-init.yaml
文件中指定其 Netplan 配置。使用 sudo 权限打开文件,以便编辑该文件。sudo vi /etc/netplan/50-cloud-init.yaml
您将找到配置文件,如下图中所示。
-
编辑文件,删除 mac 地址以及通过 mac 地址匹配的接口名称。您的配置应如下图中所示。
-
运行 Netplan 应用命令以更新和完成网络配置。
sudo netplan apply
任务 3:将虚拟机映像导出到 Amazon S3
此任务需要使用 AWS 命令行界面 (Command Line Interface,CLI)。本教程使用 AWS CloudShell,因为它跳过 AWS CLI 配置任务。
-
停止虚拟机。打开 AWS CloudShell 并运行以下命令以导出映像。
aws ec2 create-instance-export-task --instance-id <instance-id> --target-environment vmware --export-to-s3-task DiskImageFormat=vmdk,ContainerFormat=ova,S3Bucket=<bucket name>
-
输入以下信息。
- 磁盘映像格式:输入 VMDK ,因为它是 OCI 支持的唯一 AWS 导出格式。
- 容器格式:输入 OVA 可将磁盘映像与 VM 元数据组合。或者,您可以导出此参数。
- 目标环境:输入 vmware ,因为它是 OCI 中唯一支持的目标环境。
-
您可以通过在 AWS CloudShell 中运行以下命令来监视导出任务的状态。
aws ec2 describe-export-tasks --export-task-ids <export task id>s
首次启动任务时,您会发现该任务处于活动状态。完成后,您会发现它处于已完成状态。
任务 4:将映像传输到 OCI 对象存储
通过 SSH 连接到在任务 1.2 中配置了 rclone 的 OCI 虚拟机。将导出的映像从 Amazon S3 存储桶复制到 OCI 对象存储存储桶。
rclone copy <aws-remote>:<bucket>/<imagefile> <oci-remote>:<bucket> -vv
任务 5:在 OCI 中创建定制映像并启动实例
-
在 OCI 控制台中,转到计算服务上的自定义映像,然后选择导入映像。
-
输入以下信息。
- 区间:选择要在其中创建定制映像的区间。
- 名称:输入定制映像的名称。
- 操作系统:选择 Ubuntu。
- 源:从对象存储桶导入。选择在任务 1.1 中配置的存储桶。
- 对象名称:选择从 Amazon S3 传输的映像。
- 启动模式:选择“半虚拟化”模式。
-
单击导入图像以启动图像导入。
-
创建映像后,您就可以基于它启动实例了。在定制映像详细信息页中,选择创建实例并输入以下信息。
- 名称:输入实例名称。
- 区间:选择要在其中启动实例的区间。
- 可用性域。
- VCN 和 Subnet 。在本教程中,您可以使用公共子网跳过 VPN 连接。
- SSH 密钥:您有两个选项:生成新的 SSH 密钥或使用您在 AWS 中使用的同一组密钥。如果您希望继续使用同一组密钥,请上载您在 AWS 中用于源 VM 的相同公钥。假设您的 AWS 公钥采用
.pem
密钥格式,请将其更改为.pem.pub
,以便将其上载到 OCI 实例。这将允许您继续使用相同的私钥以通过 SSH 连接到 VM。
-
启动虚拟机。预配完成后,您可以连接到它。请注意,您连接的用户是 ubuntu ,而不是 opc 。
ssh -i pathToKey/keyfile ubuntu@<publicIp>
相关链接
确认
- 作者 - Ricardo Malhado(首席云解决方案架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Migrate an Ubuntu Virtual Machine from Amazon Web Services to Oracle Cloud Infrastructure
F95788-01
March 2024