注意:

将 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 映像

目标

先决条件

假设

任务 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 存储桶区间 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 中。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".
  1. 打开 /etc/default/grub.d/50-cloudimg-settings.cfg

    sudo vi /etc/default/grub.d/50-cloudimg-settings.cfg
    

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

    50-cloudimg-settings.cfg 编辑

  2. 打开 /etc/default/grub

    sudo vi /etc/default/grub
    

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

    grub 编辑

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

    sudo update-grub
    

任务 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 lsinitramfs /boot/initrd.img-$(uname -r) | 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 上执行网络配置的方法有多种。Canonical 开发了 Netplan 实用程序来简化此任务。本教程使用 Netplan,但您也可以更改网络配置文件(如果这是您的首选设置)。

  1. AWS Ubuntu 平台映像在 /etc/netplan/50-cloud-init.yaml 文件中指定其 Netplan 配置。使用 sudo 权限打开文件,以便编辑该文件。

    sudo vi /etc/netplan/50-cloud-init.yaml
    

    您将找到配置文件,如下图中所示。

    检查 netplan 配置文件

  2. 编辑文件,删除 mac 地址以及通过 mac 地址匹配的接口名称。您的配置应如下图中所示。

    编辑 netplan 配置文件

  3. 运行 Netplan 应用命令以更新和完成网络配置。

    sudo netplan apply
    

任务 3:将虚拟机映像导出到 Amazon S3

此任务需要使用 AWS 命令行界面 (Command Line Interface,CLI)。本教程使用 AWS CloudShell,因为它跳过 AWS CLI 配置任务。

  1. 停止虚拟机。打开 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
    

    首次启动任务时,您会发现该任务处于活动状态。完成后,您会发现它处于已完成状态。

任务 4:将映像传输到 OCI 对象存储

通过 SSH 连接到在任务 1.2 中配置了 rclone 的 OCI 虚拟机。将导出的映像从 Amazon S3 存储桶复制到 OCI 对象存储存储桶。

rclone copy <aws-remote>:<bucket>/<imagefile> <oci-remote>:<bucket> -vv

任务 5:在 OCI 中创建定制映像并启动实例

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

  2. 输入以下信息。

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

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

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

    ssh -i pathToKey/keyfile ubuntu@<publicIp>
    

确认

更多学习资源

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

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