跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.5

15 Xen 到 KVM 迁移指南 编辑源文件

随着 KVM 虚拟化解决方案在服务器管理员中越来越受欢迎,许多人需要一种将现有的基于 Xen 的环境迁移到 KVM 的方法。目前,没有成熟的工具可以自动将 Xen VM 转换为 KVM。但是,有一个技术解决方案可以帮助将 Xen 虚拟机转换为 KVM。以下信息和步骤可以帮助您执行此类迁移。

Important
重要提示:迁移过程不受支持

本文档中描述的迁移过程未得到 SUSE 的完全支持。我们仅将其作为指导。

15.1 使用 virt-v2v 迁移到 KVM 编辑源文件

本节包含有关帮助您将来自外部 hypervisor(如 Xen)的虚拟机导入到由 libvirt 管理的 KVM 的信息。

Tip
提示:Microsoft Windows 来宾

本节重点介绍 Linux 来宾的转换。使用 virt-v2v 转换 Microsoft Windows 来宾与转换 Linux 来宾相同,只是在处理虚拟机器驱动程序包 (VMDP) 方面有所不同。有关使用 VMDP 转换 Windows 来宾的更多详细信息,请分别在 虚拟机器驱动程序包文档 中找到。

15.1.1 关于 virt-v2v 的介绍 编辑源文件

virt-v2v 是一个命令行工具,用于将来自外部 hypervisor 的 VM 来宾转换为在由 libvirt 管理的 KVM 上运行。如果可能,它会在转换后的虚拟机中启用半虚拟化的 virtio 驱动程序。以下是支持的操作系统和 hypervisor 列表

支持的来宾操作系统
  • SUSE Linux Enterprise Server

  • openSUSE

  • Red Hat Enterprise Linux

  • Fedora

  • Microsoft Windows Server 2003 和 2008

支持的源 hypervisor
  • Xen

支持的目标 hypervisor
  • KVM(由 libvirt 管理)

15.1.2 安装 virt-v2v 编辑源文件

安装 virt-v2v 非常简单

> sudo zypper install virt-v2v

请记住,virt-v2v 需要 root 权限,因此您需要以 root 用户身份或通过 sudo 运行它。

15.1.3 将虚拟机转换为在由 libvirt 管理的 KVM 下运行 编辑源文件

virt-v2v 将虚拟机从 Xen hypervisor 转换为在由 libvirt 管理的 KVM 下运行。要了解有关 libvirtvirsh 的更多信息,请参阅 第 II 部分,“使用 libvirt 管理虚拟机”。此外,所有 virt-v2v 命令行选项都在 virt-v2v 手册页 (man 1 virt-v2v) 中进行了说明。

在转换虚拟机之前,请确保完成以下步骤

步骤 15.1: 准备转换环境
  1. 创建一个新的本地存储池。

    virt-v2v 将源虚拟机的存储复制到由 libvirt 管理的本地存储池(原始磁盘镜像保持不变)。您可以使用 Virtual Machine Manager 或 virsh 创建该池。有关更多信息,请参阅 第 8.2.2 节,“使用 Virtual Machine Manager 管理存储”第 8.2.1 节,“使用 virsh 管理存储”

  2. 准备本地网络接口。

    检查转换后的虚拟机是否可以使用 VM 主机服务器上的本地网络接口。通常是一个网络桥接,如果尚未定义,请使用 YaST › 系统 › 网络设置 › 添加 › 桥接 创建它。

    Note
    注意:网络设备映射

    在转换过程中,源 Xen 主机上的网络设备可以映射到目标 KVM 主机上相应的网络设备。例如,Xen 桥接 br0 可以映射到默认 KVM 网络设备。示例映射可以在 /etc/virt-v2v.conf 中找到。要启用这些映射,请根据需要修改 XML 规则,并确保该部分未用 <!----> 标记注释掉。例如

     <network type='bridge' name='br0'>
       <network type='network' name='default'/>
     </network>
    Tip
    提示:没有网络桥接

    如果没有可用的网络桥接,Virtual Machine Manager 可以选择创建它。

virt-v2v 具有以下基本命令语法

virt-v2v -i INPUT_METHOD -os STORAGE_POOL SOURCE_VM
输入方法

有两种输入方法:libvirtlibvirtxml。有关 SOURCE_VM 参数的更多信息,请参阅。

存储池

您已经为目标虚拟机准备好的存储池。

源 VM

要转换的源虚拟机。它取决于 INPUT_METHOD 参数:对于 libvirt,指定 libvirt 域的名称。对于 libvirtxml,指定包含 libvirt 域规范的 XML 文件的路径。

Note
注意:转换时间

转换虚拟机需要大量的系统资源,主要是为了复制整个虚拟机的磁盘镜像。转换单个虚拟机通常需要最多 10 分钟。使用大型磁盘镜像的虚拟机可能需要更长时间。

15.1.3.1 基于 libvirt XML 描述文件的转换 编辑源文件

本节介绍如何使用 libvirt XML 配置文件转换本地 Xen 虚拟机。如果主机已经在运行 KVM hypervisor,则此方法适用。确保源虚拟机的 libvirt XML 文件以及从中引用的 libvirt 存储池在本地主机上可用。

  1. 获取源虚拟机的 libvirt XML 描述。

    Tip
    提示:获取 XML 文件

    要获取源虚拟机的 libvirt XML 文件,必须在 Xen 内核下运行主机操作系统。如果您已经重新启动到启用了 KVM 的环境,请重新启动回 Xen 内核,转储 libvirt XML 文件,然后重新启动回 KVM 环境。

    首先识别 virsh 下的源虚拟机

    # virsh list
     Id    Name                           State
    ----------------------------------------------------
    [...]
      2     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。现在导出其 XML 并将其保存到 sles12_xen.xml

    # virsh dumpxml sles12_xen > sles12_xen.xml
  2. 验证所有磁盘镜像路径是否从 KVM 主机的角度来看都是正确的。在同一台机器上转换时这不是问题,但在使用来自另一台主机的 XML 转储时可能需要手动更改。

    <source file='/var/lib/libvirt/images/XenPool/SLES.qcow2'/>
    Tip
    提示:复制镜像

    为了避免两次复制镜像,请手动将磁盘镜像或镜像直接复制到 libvirt 存储池。更新 XML 描述文件中的源文件条目。virt-v2v 过程检测到现有的磁盘并就地转换它们。

  3. 运行 virt-v2v 以转换为 KVM 虚拟机

    # virt-v2v sles12_xen.xml1 \
    -i LIBVIRTXML2 \
    -os remote_host.example.com:/exported_dir3 \
    --bridge br04 \
    -on sles12_kvm5

    1

    源 Xen 基虚拟机的 XML 描述。

    2

    virt-v2vlibvirt XML 文件读取有关源虚拟机的相关信息。

    3

    目标磁盘镜像放置的存储池。在本例中,镜像放置在远程主机 remote_host.example.com 上的 NFS 共享 /exported_dir 上。

    4

    目标 KVM 基虚拟机使用主机上的网络桥接 br0

    5

    目标虚拟机重命名为 sles12_kvm,以防止与同名的现有虚拟机发生名称冲突。

15.1.3.2 基于 libvirt 域名称的转换 编辑源文件

如果仍然在 Xen 下运行 libvirt,并计划稍后重新启动到 KVM hypervisor,则此方法很有用。

  1. 找到要转换的虚拟机的 libvirt 域名称。

    # virsh list
     Id    Name                           State
    ----------------------------------------------------
    [...]
      2     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。

  2. 运行 virt-v2v 以转换为 KVM 虚拟机

    # virt-v2v sles12_xen1 \
    -i libvirt2 \
    -os storage_pool3 \
    --network eth04 \
    -of qcow25 \
    -oa sparse6 \
    -on sles12_kvm

    1

    域名称是基于 Xen 的虚拟机。

    2

    virt-v2v 直接从活动的 libvirt 连接读取有关源虚拟机的相关信息。

    3

    目标磁盘镜像放置在本地 libvirt 存储池中。

    4

    所有来宾桥接(或网络)都连接到本地管理的网络。

    5

    目标磁盘镜像的格式。支持的选项是 rawqcow2

    6

    转换后的来宾磁盘空间是 sparse 还是 preallocated

15.1.3.3 转换远程 Xen 虚拟机 编辑源文件

如果需要转换在远程主机上运行的 Xen 虚拟机,则此方法很有用。由于 virt-v2v 通过 ssh 连接到远程主机,请确保主机上正在运行 SSH 服务。

Note
注意:无密码 SSH 访问

virt-v2v 需要通过 SSH 密钥添加到 ssh-agent 的无密码 SSH 连接到远程主机。有关更多详细信息,请参阅 man ssh-keygenman ssh-add。有关更多信息,请参阅 安全和加固指南”一书,第 22 章“使用 OpenSSH 保护网络操作”

要连接到远程 libvirt 连接,请构造与远程主机相关的有效连接 URI。在以下示例中,远程主机名称为 remote_host.example.com,连接用户名是 root。然后连接 URI 如下所示

xen+ssh://root@remote_host.example.com/

有关 libvirt 连接 URI 的更多信息,请参阅 https://libvirt.org/uri.html

  1. 找到要转换的远程虚拟机的 libvirt 域名称。

    # virsh -c xen+ssh://root@remote_host.example.com/ list
     Id    Name                           State
    ----------------------------------------------------
      1     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。

  2. 用于远程连接的 virt-v2v 命令如下所示

    # virt-v2v sles12_xen \
    -i libvirt \
    -ic xen+ssh://root@remote_host.example.com/ \
    -os local_storage_pool \
    --bridge br0

15.1.4 运行转换后的虚拟机 编辑源文件

virt-v2v 成功完成之后,将创建一个新的 libvirt 域,其名称使用 -on 选项指定的名称。如果您没有指定 -on,则将使用与源虚拟机相同的名称。可以使用标准的 libvirt 工具(如 virsh 或 Virtual Machine Manager)管理新的来宾。

Tip
提示:重新启动机器

如果您按照 第 15.1.3.2 节,“基于 libvirt 域名称的转换” 中所述在 Xen 下完成转换,则可能需要重新启动主机并使用非 Xen 内核启动。

15.2 Xen 到 KVM 手动迁移 编辑源文件

15.2.1 一般概述 编辑源文件

管理虚拟机的首选解决方案是基于 libvirt;有关更多信息,请参阅 https://libvirt.org/。它与手动定义和运行虚拟机的相比具有多项优势——libvirt 是跨平台的,支持许多 hypervisor,具有安全的远程管理,具有虚拟网络,最重要的是,它提供了一个统一的抽象层来管理虚拟机。因此,本文档的主要重点是 libvirt 解决方案。

通常,Xen 到 KVM 迁移包括以下基本步骤

  1. 创建原始 Xen VM 来宾的备份副本。

  2. 可选地,应用针对半虚拟化来宾的更改。

  3. 获取有关原始 Xen VM 来宾的信息,并将其更新为 KVM 等效项。

  4. 关闭 Xen 主机上的来宾,并在 KVM hypervisor 下运行新的来宾。

Warning
警告:不支持实时迁移

Xen 到 KVM 的迁移无法在源 VM Guest 运行时进行。在运行新的 KVM 准备好的 VM Guest 之前,建议关闭原始的 Xen VM Guest。

15.2.2 备份 Xen VM Guest 编辑源文件

要备份您的 Xen VM Guest,请按照以下步骤操作

  1. 识别您想要迁移的相关 Xen guest,并记住它的 ID/名称。

    > sudo virsh list --all
    Id Name                 State
    ----------------------------------
     0 Domain-0             running
     1 SLES15SP3            running
    [...]
  2. 关闭 guest。您可以通过关闭 guest OS,或者使用 virsh 来执行此操作

    > sudo virsh shutdown SLES11SP3
  3. 将它的配置备份到 XML 文件。

    > sudo virsh dumpxml SLES11SP3 > sles11sp3.xml
  4. 备份它的磁盘镜像文件。使用 cprsync 命令创建备份副本。请记住,始终使用 md5sum 命令检查副本是一个好主意。

  5. 在备份了镜像文件之后,您可以使用以下命令再次启动 guest

    > sudo virsh start SLES11SP3

15.2.3 对半虚拟化 guests 的特定更改 编辑源文件

如果您正在迁移半虚拟化的 Xen guest,请应用以下更改。您可以在正在运行的 guest 上,或者使用 guestfs-tools 在停止的 guest 上执行此操作。

Important
重要提示

应用完本节描述的更改后,与迁移的 VM Guest 相关的镜像文件将不再能在 Xen 下使用。

15.2.3.1 安装默认内核 编辑源文件

Warning
警告:无法启动

安装默认内核后,系统将无法启动 Xen guest。

在将 Xen guest 磁盘镜像克隆用于 KVM hypervisor 之前,请确保它可以在 无需 Xen hypervisor 的情况下启动。这对于半虚拟化的 Xen guests 至关重要,因为它们通常包含特殊的 Xen 内核,并且通常没有安装完整的 GRUB 2 启动加载程序。

  1. 对于 SLES 11,更新 /etc/sysconfig/kernel 文件。更改 INITRD_MODULES 参数,删除所有 Xen 驱动程序,并将其替换为 virtio 驱动程序。替换

    INITRD_MODULES="xenblk xennet"

    INITRD_MODULES="virtio_blk virtio_pci virtio_net virtio_balloon"

    对于 SLES 12、15 和 openSUSE,在 /etc/dracut.conf.d/*.conf 中搜索 xenblk xennet,并将其替换为 virtio_blk virtio_pci virtio_net virtio_balloon

  2. 半虚拟化的 Xen guests 运行特定的 Xen 内核。要在 KVM 下运行 guest,您需要安装默认内核。

    Note
    注意:默认内核已安装

    您不需要为完全虚拟化的 guest 安装默认内核,因为它已经安装了。

    在 Xen guest 上输入 rpm -q kernel-default 以确定是否安装了默认内核。如果没有,请使用 zypper in kernel-default 安装它。

    我们将用于在 KVM 下启动 guest 的内核必须具有 virtio(半虚拟化)驱动程序可用。运行以下命令以找到它。请不要忘记使用您的内核版本替换 5.3.18-8

    > sudo sudo find /lib/modules/5.3.18-8-default/kernel/drivers/ -name virtio*
    /lib/modules/5.3.18-8-default/kernel/drivers/block/virtio_blk.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/char/hw_random/virtio-rng.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/char/virtio_console.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/crypto/virtio
    ...
  3. 更新 /etc/fstab。将任何存储设备从 xvda 更改为 vda

  4. 更新启动加载程序配置。在 Xen guest 上输入 rpm -q grub2 以确定是否已经安装了 GRUB 2。如果没有,请使用 zypper in grub2 安装它。

    现在使新安装的默认内核成为启动 OS 的默认内核。 此外,删除/更新可能引用 Xen 特定设备的内核命令行选项。您可以使用 YaST(系统 › 启动加载程序)或手动执行此操作

    • 通过列出它们来查找首选的 Linux 启动菜单条目

      > cat /boot/grub2/grub.cfg | grep 'menuentry '

      记住您新安装的条目的顺序编号(从零开始计数)。

    • 将其设置为默认启动菜单条目

      > sudo grub2-set-default N

      N 替换为您之前发现的启动菜单条目的编号。

    • 打开 /etc/default/grub 进行编辑,并查找 GRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX_RECOVERY 选项。删除或更新任何引用 Xen 特定设备的引用。在以下示例中,您可以替换

      root=/dev/xvda1 disk=/dev/xvda console=xvc

      root=/dev/vda1 disk=/dev/vda

      请不要忘记删除所有引用 xvc 类型控制台(例如 xvc0)。

  5. 更新 device.map 文件,该文件位于 /boot/grub2/boot/grub2-efi 目录中,具体取决于 VM 使用哪个目录。将任何存储设备从 xvda 更改为 vda

  6. 要导入新的默认设置,请运行

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

15.2.3.2 更新 guest 以在 KVM 下启动 编辑源文件

  1. 更新系统以使用默认串行控制台。列出配置的控制台,并删除指向 xvc? 的符号链接。

    > sudo ls -l /etc/systemd/system/getty.target.wants/
    getty@tty1.service -> /usr/lib/systemd/system/getty@.service
    getty@xvc0.service -> /usr/lib/systemd/system/getty@xvc0.service
    getty@xvc1.service -> /usr/lib/systemd/system/getty@xvc1.service
    
    # rm /etc/systemd/system/getty.target.wants/getty@xvc?.service
  2. 更新 /etc/securetty 文件。将 xvc0 替换为 ttyS0

15.2.4 更新 Xen VM Guest 配置 编辑源文件

本节描述了如何导出原始 Xen VM Guest 的配置,以及如何对其进行哪些特定更改,以便将其作为 KVM guest 导入到 libvirt 中。

15.2.4.1 导出 Xen VM Guest 配置 编辑源文件

首先导出 guest 的配置并将其保存到文件。例如

> sudo virsh dumpxml SLES11SP3
<domain type='xen'>
  <name>SLES11SP3</name>
  <uuid>fa9ea4d7-8f95-30c0-bce9-9e58ffcabeb2</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>1</vcpu>
  <bootloader>/usr/bin/pygrub</bootloader>
  <os>
    <type>linux</type>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
    <disk type='file' device='disk'>
      <driver name='file'/>
      <source file='/var/lib/libvirt/images/SLES_11_SP2_JeOS.x86_64-0.0.2_para.raw'/>
      <target dev='xvda' bus='xen'/>
    </disk>
    <interface type='bridge'>
      <mac address='00:16:3e:2d:91:c3'/>
      <source bridge='br0'/>
      <script path='vif-bridge'/>
    </interface>
    <console type='pty'>
      <target type='xen' port='0'/>
    </console>
    <input type='mouse' bus='xen'/>
    <graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
  </devices>
</domain>

您可以在 https://libvirt.org/formatdomain.html 找到有关 libvirt XML 格式的 VM Guest 描述的详细信息。

15.2.4.2 对 guest 配置进行的一般更改 编辑源文件

您需要对导出的 Xen guest XML 配置进行一些常规更改,才能在 KVM hypervisor 下运行它。以下适用于完全虚拟化和半虚拟化 guests。以下 XML 元素仅为示例,不一定需要包含在您的特定配置中。

Tip
提示:使用的约定

为了引用 XML 配置文件的节点,本文档将使用 XPath 语法。例如,为了引用 <domain> 标签内的 <name>

<domain>
  <name>sles11sp3</name>
</domain>

使用 XPath 等效项 /domain/name

  1. /domain 元素的 type 属性从 xen 更改为 kvm

  2. 删除 /domain/bootloader 元素部分。

  3. 删除 /domain/bootloader_args 元素部分。

  4. /domain/os/type 元素的值从 linux 更改为 hvm

  5. /domain/os 元素下添加 <boot dev="hd"/>

  6. arch 属性添加到 /domain/os/type 元素。可接受的值包括 arch=”x86_64”arch=”i686”

  7. /domain/devices/emulator 元素从 /usr/lib/xen/bin/qemu-dm' 更改为 /usr/bin/qemu-kvm

  8. 对于与半虚拟化 (PV) guest 关联的每个磁盘,请进行以下更改

    • /domain/devices/disk/driver 元素的 name 属性从 file 更改为 qemu,并添加一个用于磁盘类型的 type 属性。例如,有效选项包括 rawqcow2

    • /domain/devices/disk/target 元素的 dev 属性从 xvda 更改为 vda

    • /domain/devices/disk/target 元素的 bus 属性从 xen 更改为 virtio

  9. 对于每个网络接口卡,请进行以下更改

    • 如果在 /domain/devices/interface 中定义了 model,请将它的 type 属性值更改为 virtio

      <model type=”virtio”>
    • 删除所有 /domain/devices/interface/script 部分。

    • 如果 dev 属性以 vifvnetveth 开头,则删除所有 /domain/devices/interface/target 元素。如果使用自定义网络,则将 dev 值更改为该目标。

  10. 如果存在,请删除 /domain/devices/console 元素部分。

  11. 如果存在,请删除 /domain/devices/serial 元素部分。

  12. /domain/devices/input 元素上的 bus 属性从 xen 更改为 ps2

  13. /domain/devices 元素下添加以下元素,用于内存气球功能。

    <memballoon model="virtio"/>
Tip
提示:设备名称

<target dev='hda' bus='ide'/> 控制磁盘在 guest OS 下暴露的设备。 dev 属性指示“逻辑”设备名称。指定的实际设备名称不保证映射到 guest OS 中的设备名称。因此,您可能需要在启动加载程序命令行上更改磁盘映射。例如,如果启动加载程序期望根磁盘为 hda2,但 KVM 仍然将其视为 sda2,请将启动加载程序命令行从

[...] root=/dev/hda2 resume=/dev/hda1 [...]

的行

[...] root=/dev/sda2 resume=/dev/sda1 [...]

对于半虚拟化的 xvda 设备,将其更改为

[...] root=/dev/vda2 resume=/dev/vda1 [...]

否则,VM Guest 将拒绝在 KVM 环境中启动。

15.2.4.3 目标 KVM guest 配置 编辑源文件

应用完上述所有修改后,您将获得以下 KVM guest 配置

<domain type='kvm'>
  <name>SLES11SP3</name>
  <uuid>fa9ea4d7-8f95-30c0-bce9-9e58ffcabeb2</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu cpuset='0-3'>1</vcpu>
  <os>
    <type arch=”x86_64”>hvm</type>
    <boot dev="hd"/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type="raw"/>
      <source file='/var/lib/libvirt/images/SLES_11_SP2_JeOS.x86_64-0.0.2_para.raw'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <mac address='00:16:3e:2d:91:c3'/>
      <source bridge='br0'/>
    </interface>
    <input type='mouse' bus='usb'/>
    <graphics type='vnc' port='5900' autoport='yes' keymap='en-us'/>
    <memballoon model="virtio"/>
  </devices>
</domain>

将配置保存到主目录中的文件,例如 SLES11SP3.xml。它将在导入后复制到默认的 /etc/libvirt/qemu 目录。

15.2.5 迁移 VM Guest 编辑源文件

在更新 VM Guest 配置并应用对 guest OS 的必要更改后,关闭原始的 Xen guest,并在 KVM hypervisor 下运行它的克隆。

  1. 通过运行 shutdown -h now 作为 Xen 主机上的 root 从控制台关闭 guest。

  2. 如果需要,复制与 VM Guest 关联的磁盘镜像。默认配置要求将 Xen 磁盘文件从 /var/lib/xen/images 复制到 /var/lib/kvm/images。如果以前没有创建 VM Guest,则可能需要创建 /var/lib/kvm/images 目录(作为 root)。

  3. 创建新的域,并将其注册到 libvirt

    > sudo virsh define SLES11SP3.xml
     Domain SLES11SP3 defined from SLES11SP3.xml
  4. 验证 KVM 配置中是否看到新的 guest

    > virsh list –all
  5. 创建域后,您可以启动它

    > sudo virsh start SLES11SP3
     Domain SLES11SP3 started

15.3 更多信息 编辑源文件

有关 libvirt 的更多信息,请参阅 https://libvirt.org

您可以在 https://libvirt.org/formatdomain.html 找到有关 libvirt XML 格式的更多详细信息。

打印此页面