注意:

将 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 ,因为它可以使传输映像更快、更简单。

目标

先决条件

假设

任务 1:准备数据传输基础结构

本教程使用以下数据传输体系结构:

任务 1.1:准备 Amazon S3 和 OCI 对象存储存储桶

在本任务中,我们将在以下位置创建一个存储桶:

在 Amazon S3 中使用以下属性创建存储桶:

在 Amazon S3 存储桶权限中,使用与您正在使用的 AWS 区域匹配的授权将 ACL 附加到存储桶,如下图中所示。请在此处查阅特定于被授权者区域的规范帐户 ID:使用 VM 导入/导出将实例导出为 VM

S3 ACL 附件

通过在标准存储层上的 OCI 对象存储中创建存储桶来完成此任务。这是稍后将 VM 映像从 Amazon S3 传输到的存储桶。

任务 1.2:安装和配置 Rclone

在本任务中,我们将在 OCI 上运行的 VM 中安装 rclone。如果您正在试验小型 VM,并使用 2 个遥控器(Amazon S3 和 OCI Object Storage)配置 rclone,则可以在本地计算机上安装 rclone。

  1. 将 rclone 和 SSH 安装到 OCI 中的 Oracle Linux VM 中。

    sudo -v ; curl https://rclone.org/install.sh | sudo bash
    
  2. 在 rclone 中执行远程配置。这可通过启动 rclone 配置会话来完成。在命令行中运行以下命令。

    rclone config
    
  3. 对于 Amazon S3 远程配置,请输入以下信息。

    • 远程名称:输入远程名称。
    • 远程类型:选择 S3 类型。
    • 提供商:选择 AWS
    • access_key_id :输入与您决定使用的 AWS 用户关联的访问密钥 ID。
    • secret_access_key :输入与访问键 ID 匹配的密钥访问键。
    • 区域:选择您正在处理的 AWS 区域。
    • location_constraint :选择与您正在处理的 Amazon Web 区域匹配的位置约束。对于某些区域(例如法兰克福),此项可能为空。
    • acl :选择 private 以确保创建受限制的预置 ACL。有关更多信息,请参见 Canned ACL
  4. 对于 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 对象存储提供程序后端支持

  5. OCI 配置文件通常存储为目录中的 config 命名文件。

    ~/.oci/
    
  6. 创建 OCI API 签名密钥和 OCI 配置文件后,您可以在 rclone 中配置 OCI 远程。运行以下命令以启动配置会话。

    rclone config
    
  7. 输入 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>
  8. 使用以下命令检查 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"
  1. 打开 /etc/default/grub

    sudo vi /etc/default/grub
    

    编辑该文件,使其看起来像下图中所示的文件。

    grub 编辑

  2. 编辑文件后,运行以下命令以确保 GRUB 引导装载程序得到充分更新。

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

任务 2.3:检查半虚拟化驱动程序

要将 VM 导入 OCI 以便可以在半虚拟化模式下启动,映像中需要存在半虚拟化 VirtIO 驱动程序。在此任务中,我们将检查内核和 initramfs 临时文件系统以确认驱动程序是否存在。请注意,运行内核版本 3.4 或更高版本的基于 Linux 的操作系统支持半虚拟化驱动程序;因此,您通常只需要检查并确认它们是否存在。

所需的最小 VirtIO 驱动程序集包括 pciscsi。这些驱动程序应存在于内核或 initramfs 中。

  1. 使用以下命令检查 AWS VM 的内核。

    sudo grep -i virtio /boot/config-$(uname -r)
    

    检查内核

    注:pci VirtIO 驱动程序存在于内核中。

  2. 使用以下命令检查 AWS VM 的内核。

    sudo lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
    

    检查 initramfs

    注:scsi VirtIO 驱动程序存在于 initramfs 中。

  3. 如果 VM 的引导卷没有驱动程序,则需要使用 dracut 重建 initramfs。

    sudo dracut -v -f --add-drivers “virtio virtio_pci virtio_scsi” /boot/initramfs-$(uname -r).img $(uname -r)
    

任务 2.4:配置网络设置

对于网络配置,请确保:

在 Linux 上执行网络配置的方法有多种。具体而言,在 RHEL 中,可以通过编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 中的网络配置文件或使用 NetworkManager 来执行以太网连接配置。本教程使用后者执行必要的网络配置。有关更多信息,请参见 Configuring an Ethernet connection

  1. 运行 NetworkManager 命令行工具 (nmcli) 可查看 VM 的网络配置摘要。

    网络配置概要

  2. 要列出 VM 中可用的连接,请运行以下命令。

    nmcli connection show
    

    您将找到连接列表。本教程中使用的 VM 具有以下连接。

    检查连接

  3. 使用动态主机配置协议 (Dynamic Host Configuration Protocol,DHCP) 确认与 eth0 关联的以太网连接。

    nmcli connection show <connection UUID>
    

    滚动到找到 ipv4.method 参数为止。它应具有值 auto

    确认 DHCP

  4. 编辑与接口 eth0 关联的连接。您将使用以下命令从接口配置中删除 MAC 地址。

    sudo nmcli connection modify <connection UUID> 802-3-ethernet.mac-address ''
    
  5. 使用以下命令应用这些更改。

    sudo nmcli con up <connection UUID>
    
  6. 此外,检查 /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 配置任务。

  1. 停止 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>
    
  2. 输入以下信息。

    • 磁盘映像格式:输入 VMDK ,因为它是 OCI 支持的唯一 AWS 导出格式。
    • 容器格式:输入 OVA 可将磁盘映像与 VM 元数据组合。或者,您可以导出此参数。
    • 目标环境:输入 vmware ,因为它是 OCI 中唯一支持的目标环境。
  3. 您可以通过在 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 中创建定制映像并启动实例

  1. 在 OCI 控制台中,转到计算服务上的自定义映像,然后选择导入映像

  2. 输入以下信息。

    • 区间:选择要在其中创建定制映像的区间。
    • 名称:输入定制映像的名称。
    • 操作系统:选择 RHEL。
    • 源:对象存储桶导入。选择在任务 1.1 中配置的存储桶。
    • 对象名称:选择从 Amazon S3 传输的映像。
    • 启动模式:选择“半虚拟化”模式。
  3. 单击导入图像以启动图像导入。

  4. 创建映像后,您就可以基于它启动实例了。在定制映像详细信息页中,选择创建实例并输入以下信息。

    • 名称:输入实例名称。
    • 区间:选择要在其中启动实例的区间。
    • 可用性域
    • VCNSubnet 。在本教程中,您可以使用公共子网跳过 VPN 连接。
    • SSH 密钥:您有两个选项:生成新的 SSH 密钥或使用您在 AWS 中使用的同一组密钥。如果您希望继续使用同一组密钥,请上载您在 AWS 中用于源 VM 的相同公钥。假设您的 AWS 公钥采用 .pem 密钥格式,请将其更改为 .pem.pub,以便将其上载到 OCI 实例。这将允许您继续使用相同的私钥以通过 SSH 连接到 VM。
  5. 启动虚拟机。预配完成后,您可以连接到它。请注意,您连接的用户是 ec2-user ,而不是 opc

    ssh -i pathToKey/keyfile ec2-user@<publicIp>
    

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心