注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于您的云环境的值。
将 Red Hat Enterprise Linux 虚拟机从 Amazon Web Services 迁移到 Oracle Cloud Infrastructure
简介
从 Amazon Web Services (AWS) 迁移到 Oracle Cloud Infrastructure (OCI) 对许多组织来说是一项越来越频繁的工作,因为 OCI 是新一代云,允许应用以更低的成本更快、更安全地运行。
虚拟机 (Virtual Machine,VM) 迁移通常是此类工作的核心部分,可帮助客户查找有关如何将虚拟机从 AWS 迁移到 OCI 的适当指导。此外,对于许多组织来说,Linux 是其大部分基础设施。因此,本教程侧重于将运行世界上最广泛使用的 Linux 发行版之一的虚拟机 (Red Hat Enterprise Linux) 从 AWS 迁移到 OCI。
本教程为客户提供了有关将虚拟机迁移到 OCI 的要求以及如何准备和迁移 Red Hat Enterprise Linux VM 从 AWS 到 OCI 的指导,以便可以在半虚拟化模式下在 OCI 中启动该 VM。OCI 还允许在仿真模式下启动实例,但与在仿真模式下运行相比,使用半虚拟化设备的 VM 提供的性能要快得多,磁盘 I/O 性能至少提高了六倍。
整个过程包括准备 AWS 中的 VM,将其导出到 Amazon Simple Storage Service (Amazon S3),将其传输到 OCI 对象存储,在 OCI 中创建定制映像并从中启动实例。Amazon S3 与 OCI 对象存储之间的映像传输使用开源工具 rclone 执行,如果您只是尝试使用小尺寸映像,则可以手动执行。不过,我们建议使用 rclone ,因为它可以使传输映像更快、更简单。
目标
-
在 AWS 中准备 Red Hat Enterprise Linux VM 以迁移到 OCI。
-
将准备好的 VM 作为映像导出到 Amazon S3。
-
将映像传输到 OCI 并基于它创建实例。
先决条件
-
访问可以创建或已经拥有 API 密钥并且可以访问 Amazon S3 和 Amazon Elastic Compute Cloud (Amazon EC2) 的 AWS 账户。
-
访问 OCI 租户和区间,以启动映像迁移和实例。
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 策略:
-
允许访问 OCI 对象存储。
-
在 OCI 中预配 VM(针对 rclone VM 和基于定制映像的 VM)。
-
允许创建 OCI API 密钥。
-
假设
-
预配了
pem
公钥的 AWS VM。 -
AWS RHEL VM 只有 1 个卷:引导卷。
-
AWS 映像可导出;本教程中使用的 Amazon Machine Image (AMI) 是自 2024 年 3 月起用于 RHEL
9.3.0
的 AWS 平台映像。 -
与 AWS 默认提供的用户的 SSH 连接:
ec2-user
。 -
在 AWS CloudShell 上执行的 AWS 命令行操作。您也可以使用 AWS CLI 工具。
-
在 OCI 中预配并与 Amazon S3 建立 SSH 连接的 Oracle Linux VM。此 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 存储桶区间 Oracle Cloud 标识符 (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
中。
最重要的 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
。sudo vi /etc/default/grub
编辑该文件,使其看起来像下图中所示的文件。
-
编辑文件后,运行以下命令以确保 GRUB 引导装载程序得到充分更新。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
任务 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 lsinitrd /boot/initramfs-$(uname -r).img | 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 上执行网络配置的方法有多种。具体而言,在 RHEL 中,可以通过编辑 /etc/sysconfig/network-scripts/ifcfg-eth0
中的网络配置文件或使用 NetworkManager 来执行以太网连接配置。本教程使用后者执行必要的网络配置。有关更多信息,请参见 Configuring an Ethernet connection 。
-
运行 NetworkManager 命令行工具 (
nmcli
) 可查看 VM 的网络配置摘要。 -
要列出 VM 中可用的连接,请运行以下命令。
nmcli connection show
您将找到连接列表。本教程中使用的 VM 具有以下连接。
-
使用动态主机配置协议 (Dynamic Host Configuration Protocol,DHCP) 确认与
eth0
关联的以太网连接。nmcli connection show <connection UUID>
滚动到找到
ipv4.method
参数为止。它应具有值auto
。 -
编辑与接口
eth0
关联的连接。您将使用以下命令从接口配置中删除 MAC 地址。sudo nmcli connection modify <connection UUID> 802-3-ethernet.mac-address ''
-
使用以下命令应用这些更改。
sudo nmcli con up <connection UUID>
-
此外,检查
/etc/udev/rules
目录以查看是否有任何包含 MAC 地址硬编码规则的 udev 规则文件并删除它们。本教程中使用的 AWS 映像有一个这样的文件70-persistent-net.rules
。运行以下命令以删除此文件。sudo rm /etc/udev/rules.d/70-persistent-net.rules
网络配置现在已完成。您可以通过检查文件 /etc/sysconfig/network-scripts/ifcfg-eth0
进行确认。
任务 3:将虚拟机映像导出到 Amazon S3
此任务需要使用 AWS CLI。本教程使用 AWS CloudShell,因为它跳过 AWS CLI 配置任务。
-
停止 VM。打开 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
首次启动任务时,您会发现该任务处于活动状态。完成后,您会发现它处于 completed 状态。
任务 4:将映像传输到 OCI 对象存储
通过 SSH 连接到在任务 1.2 中配置了 rclone 的 OCI VM。将导出的映像从 AWS S3 存储桶复制到 OCI 对象存储存储桶。
rclone copy <aws-remote>:<bucket>/<imagefile> <oci-remote>:<bucket> -vv
任务 5:在 OCI 中创建定制映像并启动实例
-
在 OCI 控制台中,转到计算服务上的自定义映像,然后选择导入映像
-
输入以下信息。
- 区间:选择要在其中创建定制映像的区间。
- 名称:输入定制映像的名称。
- 操作系统:选择 RHEL。
- 源:从对象存储桶导入。选择在任务 1.1 中配置的存储桶。
- 对象名称:选择从 Amazon S3 传输的映像。
- 启动模式:选择“半虚拟化”模式。
-
单击导入图像以启动图像导入。
-
创建映像后,您就可以基于它启动实例了。在定制映像详细信息页中,选择创建实例并输入以下信息。
- 名称:输入实例名称。
- 区间:选择要在其中启动实例的区间。
- 可用性域。
- VCN 和 Subnet 。在本教程中,您可以使用公共子网跳过 VPN 连接。
- SSH 密钥:您有两个选项:生成新的 SSH 密钥或使用您在 AWS 中使用的同一组密钥。如果您希望继续使用同一组密钥,请上载您在 AWS 中用于源 VM 的相同公钥。假设您的 AWS 公钥采用
.pem
密钥格式,请将其更改为.pem.pub
,以便将其上载到 OCI 实例。这将允许您继续使用相同的私钥以通过 SSH 连接到 VM。
-
启动虚拟机。预配完成后,您可以连接到它。请注意,您连接的用户是 ec2-user ,而不是 opc 。
ssh -i pathToKey/keyfile ec2-user@<publicIp>
相关链接
确认
- 作者 - Ricardo Malhado(首席云解决方案架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Migrate a Red Hat Enterprise Linux Virtual Machine from Amazon Web Services to Oracle Cloud Infrastructure
F95994-01
April 2024