第5章

P2V和V2V迁移





很多企业在部署新的虚拟化平台之前,总会有一些现存的应用系统。在新环境重新部署应用系统并导入原有数据是一个推荐的选项,因为通过重建可以对原有业务系统进行梳理、整合,并且解决一些历史遗留问题,但这要求技术人员对原有应用系统的配置比较熟悉。如果达不到此要求,就需要采用迁移的方案。
针对现存应用系统的运行平台,迁移方案分为物理到虚拟(Physical to Virtual,P2V)和虚拟到虚拟(Virtual to Virtual,V2V)两种。
P2V将物理计算机的所有数据迁移到虚拟化平台中,从而获得虚拟化所带来的灵活性和降低成本的好处。V2V则是将在一种虚拟化平台上的虚拟机迁移到另外一种平台中。本章将介绍两个用于迁移的开源工具软件virtp2v和virtv2v。
本章要点
 使用virtv2v。
 使用virtp2v。
 使用磁盘映像工具libguestfs。
5.1V2V迁移工具virtv2v
virtp2v依赖于virtv2v,所以先介绍virtv2v。
5.1.1virtv2v实用程序简介
在专业迁移工具出现之前,很多工程师会使用dd加nc命令,或者使用Ghost、再生龙之类的硬盘克隆、映像制作工具,它们也可以实现进行P2V、V2V转移,但是这都涉及大量的手动工作,因此失败的可能性很高。
为了使迁移过程自动化,需要使用专门的工具。因为这种转换不仅是以位的形式将数据从一个磁盘(卷、映像文件)复制到另一个映像文件,而且还涉及添加、移动和修改数据,例如注入半虚拟化驱动程序、修改虚拟机操作系统配置等。
libguestfs是一个用于访问和修改虚拟机磁盘映像的工具集。使用它可以进行P2V和V2V迁移、查看和编辑虚拟机中的文件、获得磁盘状态、创建虚拟机、执行备份、克隆虚拟机、格式化磁盘、调整磁盘大小、对虚拟机进行脚本更改等。这个工具集的官方网站是www.libguestfs.org。
virtv2v是libguestfs工具集中的一个命令行实用程序。使用它可以将外部Hypervisor中的虚拟机转换为由libvirt、oVirt、Red Hat Enterprise Virtualization(RHEV)和OpenStack管理的虚拟机。
virtp2v是virtv2v的附加工具。它以ISO或CD映像的形式提供,通过调用virtp2v的核心功能,可以将物理机转换为虚拟机。我们可以简单地将virtp2v理解为它是在virtv2v基础上加了一个“壳”。
virtv2v可以自动完成在系统转换中涉及的所有手动工作。当前支持将在VMware ESXi、Xen虚拟化平台上运行的RHEL/CentOS的4/5/6/7、Windows XP、Windows Vista、Windows 7、Windows Server 2003、Windows Server 2008等转换为KVM的虚拟机。




virtv2v当前支持以下源Hypervisor: 
(1) VMware vSphere ESX / ESXi版本3.5、4.0、4.1、5.0、5.1和5.5。
(2) libvirt管理的Xen。

提示: 虽然libguestfs.org近期没有更新virtv2v、virtp2v所支持的操作系统的版本列表,但是作者的实践证明可以正常转换RHEL/CentOS 8、Windows 7、Windows 10、Windows Server 2016和Windows Server 2019。
5.1.2virtv2v的工作原理 
安装了virtv2v软件包的系统称为virtv2v转换服务器,可以将其安装在虚拟机或物理机上,如图51所示。



图51virtv2v转换服务器



在迁移时,可以将virtv2v的执行过程简化理解成4个步骤: 
(1) virtv2v使用libvirt连接到源Hypervisor,从中检索虚拟机配置,生成新虚拟机的XML配置文件。
(2) 读取源虚拟机磁盘中的数据,导出到新的磁盘映像。新文件可以保存在virtv2v转换服务器的本地,也可以是远程的目标Hypervisor。
(3) 使用libguestfs工具修改磁盘映像。针对不同的操作系统进行修改会有所差别,主要包括: 安装VirtIO驱动程序、更新/etc/fstab和xorg.conf文件、重建initrd文件等。
(4) 有了虚拟机的配置与映像文件,就可以在目标Hypervisor上创建新虚拟机了。

真实的过程要比这复杂很多,首先看一下示例命令: 



#virt-v2v --help

virt-v2v: convert a guest to use KVM



 virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi -os imported esx_guest



 virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi esx_guest -o rhv -os rhv.nfs:/export_domain --network ovirtmgmt



 virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp



 virt-v2v -i disk disk.img -o local -os /var/tmp



 virt-v2v -i disk disk.img -o glance

...



virtv2v是一个命令行工具,最重要的选项是输入(i或ic)和输出(o)。输入是源Hypervisor、磁盘映像,而输出则是目标Hypervisor、磁盘映像。例如: 如果要从VMware ESXi转换虚拟机,则VMware ESXi或VMware vCenter是输入,转换后要在其中运行虚拟机的平台就是目标,它可以是独立的KVM宿主机或oVirt Glance(oVirt的存储)。


根据源Hypervisor、磁盘映像的不同,在转换期间会自动执行以下操作: 
(1) 调用virtinspector命令来获得源操作系统的信息。
(2) 如果是Xen虚拟机,则删除内核软件包,以及删除Xen驱动程序,例如xen_net、xen_blk等。
(3) 如果虚拟机安装了多个内核,则它将找出包含virtio驱动程序的最新内核。
(4) 如果新内核支持VirtIO,则将网络驱动程序替换为virtio_net,将块驱动程序替换为virtio_blk,否则使用非半虚拟驱动程序。
(5) 用cirrus替换显卡驱动程序。
(6) 更新/etc/fstab配置。
(7) 确保initrd可以引导真正的根设备。
(8) 执行通过选项设置的操作。例如: of所指定的新的磁盘格式。

注意: 目前尚不支持实时的v2v,所以需要在迁移之前将虚拟机关闭。
5.1.3virtv2v的安装
由于RHEL/CentOS 8的软件仓库提供了virtv2v软件包,所以可以很方便地使用dnf或yum软件包管理器进行安装,示例命令如下: 



#cat /etc/redhat-release 

CentOS Linux release 8.3.2011



#dnf -y install virt-v2v virtio-win libguestfs-winsupport



virtv2v是将虚拟机从非KVM的Hypervisor迁移到KVM的核心程序。virtiowin包括了适用于Windows操作系统的VirtIO半虚拟化驱动程序。libguestfswinsupport在virtv2v和virtp2v程序中增加了对NTFS文件系统的支持。后两个软件包对迁移运行Windows操作系统的虚拟机和物理机特别重要。
5.1.4V2V的准备工作
使用virtv2v实用程序进行V2V迁移,需要满足一些先决条件。
1. 源虚拟机操作系统的先决条件
(1) Linux: 确保运行的Linux操作系统支持virtio驱动程序。
(2) Windows: 临时禁用防病毒等安全软件,因为它们有可能会使virtv2v安装的新驱动程序无法正常工作。检查Windows组策略,特别是软件安装、驱动程序数据签名类的策略,防止引起virtv2v安装的新驱动程序无法正常工作。

2. 源Hypervisor的先决条件
(1) KVM虚拟化: 确保root用户可以通过SSH登录,例如: 在/etc/ssh/sshd_config中将PermitRootLogin指令设置为yes。
(2) VMware vSphere/ESXi虚拟化: 
 删除虚拟机中安装的VMwareTools软件。
 如果需要与VMware vCenter对话以执行转换,则需要管理员用户凭据具有访问数据存储区和虚拟机配置的最小权限集。
 目前不支持快照虚拟机。如果有快照,则可按P2V进行迁移。
(3) XEN虚拟化: 确保root用户可以通过SSH登录。因为需要下载新内核和驱动程序,转换虚拟机必须有权访问存储仓库。
5.1.5示例: 迁移VMware虚拟机
下面的示例是将虚拟机从VMware vSphere平台迁移至KVM平台。
VMware vCenter Server的IP地址是192.168.1.20,有一个名为ZZ的数据中心,虚拟机所在的ESXi服务器的IP地址是192.168.1.21,要迁移的虚拟机是一台名为TEMP的Windows 2003虚拟机。迁移的目标是v2v服务器本地的/var/tmp/目录。

首先通过virsh命令验证源Hypervisor是否可以正常访问,示例命令如下: 



#virsh -c 'vpx://192.168.1.20/ZZ/192.168.1.21?no_verify=1' \

list --all

Enter username for 192.168.1.20 [administrator]: tomtrain%5cchentao

Enter tomtrain%5cchentao's password for 192.168.1.20: 输入密码

 IdNameState

--------------------------------------

 -CT_Test_CentOS6.81shut off

 -TEMPshut off

 -TESTWIN7shut off



其中vpx的语法格式为vpx://vCenter的名称或IP/数据中心名称/主机名或IP。
在此实验环境中,VMware vCenter Server使用的是自签名证书,所以需要在上述命令的URI的最后添加?no_verify=1,这可以显式地禁用证书检查。
由于实验中使用的是域账户tomtrain\chentao,所以需要将域名与账户名之间的正斜线(\)进行URL转码(结果为%5c),输入的用户名为tomtrain%5cchentao。

测试通过后,就可以进行迁移操作,示例命令如下:  



#virt-v2v \

-ic vpx://tomtrain%5cchentao@192.168.1.20/Datacenter/esxi "TEMP" \

-o local -os /var/tmp -oa sparse



[ 0.0] Opening the source -i libvirt -ic vpx://tomtrainchentao@192.168.1.20/Datacenter/esxi TEMP

virt-v2v: error: because of libvirt bug 

https://bugzilla.redhat.com/show_bug.cgi?id=1134592 you must set this 

environment variable:



export LIBGUESTFS_BACKEND=direct and then rerun the virt-v2v command.



If reporting bugs, run virt-v2v with debugging enabled and include the 

complete output:



virt-v2v -v -x [...]



命令的选项参数的含义如下。
(1) ic uri: libvirt的URI。
(2) o <glance|json|libvirt|local|null|openstack|qemu|rhv|rhvupload|vdsm>: 设置输出模式。默认为libvirt,本实验是本地目录(local)。
(3) os <storage>: 设置输出存储位置。
(4) oa <sparse|preallocated>: 设置输出磁盘映像的分配模式,本实验是稀疏模式(sparse)。

这次执行会出错。根据信息提示,需要先设置一个环境变量,然后次执行virtv2v命令,示例命令如下: 



#export LIBGUESTFS_BACKEND=direct



#virt-v2v \

-ic vpx://tomtrain%5cchentao@192.168.1.20/Datacenter/esxi "TEMP" \

-o local -os /var/tmp -oa sparse



[ 0.0] Opening the source -i libvirt -ic vpx://tomtrain%5cchentao@192.168.1.20/ZZ/192.168.1.21?no_verify=1 TEMP

Enter tomtrain%5cchentao's password for 192.168.1.20: 






Enter host password for user 'tomtrain%5cchentao': 输入密码

cURL -q --insecure --user '<hidden>' --head --silent --URL 'https://192.168.1.20/folder/TEMP/TEMP-000001-flat.vmdk?dcPath=ZZ&dsName=local21-2'

HTTP/1.1 404 Not Found

Date: Thu, 8 Dec 2016 05:20:42 GMT

Set-Cookie: vmware_soap_session="52c57ad2-0133-5004-b5b0-f7debad220bd"; Path=/; HttpOnly; Secure; 

Connection: close

Content-Type: text; charset=plain

Content-Length: 0



virt-v2v: error: vcenter: URL not found: 

https://192.168.1.20/folder/TEMP/TEMP-000001-flat.vmdk?dcPath=ZZ&dsName=local21-2



The '--dcpath' parameter may be useful.See the explanation in the 

virt-v2v(1) man page OPTIONS section.



If reporting bugs, run virt-v2v with debugging enabled and include the 

complete output:



virt-v2v -v -x [...]



virtv2v命令不支持带快照的虚拟机,所以会出现上述错误。在VMware vSphere中删除这个虚拟机的快照,然后再次执行virtv2v命令,示例命令如下: 



#virt-v2v \

-ic vpx://tomtrain%5cchentao@192.168.1.20/Datacenter/esxi "TEMP" \

-o local -os /var/tmp -oa sparse



[ 0.0] Opening the source -i libvirt -ic vpx://tomtrain%5cchentao@192.168.1.20/ZZ/192.168.1.21?no_verify=1 TEMP

Enter tomtrain%5cchentao's password for 192.168.1.20: 输入密码

Enter host password for user 'tomtrain%5cchentao':

[ 8.0] Creating an overlay to protect the source from being modified

[ 9.0] Opening the overlay

[78.0] Initializing the target -o local -os /var/tmp

[78.0] Inspecting the overlay

[ 141.0] Checking for sufficient free disk space in the guest

[ 141.0] Estimating space required on target for each disk

[ 141.0] Converting Microsoft Windows Server 2003 to run on KVM

virt-v2v: This guest has virtio drivers installed.

[ 149.0] Mapping filesystem data to avoid copying unused and blank areas

[ 150.0] Closing the overlay

[ 150.0] Checking if the guest needs BIOS or UEFI to boot

[ 150.0] Copying disk 1/1 to /var/tmp/TEMP-sda (raw)

(3.00/100%)



这次命令执行成功后,开始进行迁移。
在迁移时,可以在控制台上看到进度和当前正在进行的转换步骤,例如安装virtio驱动程序。
迁移时间取决于虚拟机的磁盘大小和网络带宽。可以使用sar查看网络的使用情况,示例命令如下: 



#sar -n DEV 1 4

…

Avg:IFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s

Avg:eth0 2955.25 2553.0044537.24166.550.000.000.00

Avg:eth10.500.000.030.000.000.000.00

Avg:eth20.500.000.030.000.000.000.00

Avg:lo0.750.751.361.360.000.000.00

Avg:virbr0-nic0.000.000.000.000.000.000.00

Avg:virbr00.000.000.000.000.000.000.00



迁移完成后,virtv2v将在/var/tmp目录中创建一个新的XML文件和磁盘映像文件。
检查XML的内容,然后可以使用virsh define定义新虚拟机,从而完成本次转换。

提示: virtv2v会将一些与迁移相关的信息保存在系统日志/var/log/messages中,例如: 打开虚拟机的磁盘文件、向其中添加文件、修改注册表等操作。
5.1.6导入OVF/OVA格式的文件
开源虚拟化格式(Open Virtualization Format,OVF)文件是一种开源的文件规范,其描述了一个安全、可扩展的便携式虚拟机打包及分发格式。它一般由多个文件组成,包括OVF文件、MF文件、CERT文件、VMDK文件和ISO文件等。
开放虚拟化设备(Open Virtualization Appliance,OVA)文件与OVF文件的作用类似,不过它是打包后的文件(TAR格式),包含了OVF中的所有文件。与OVF相比,OVA是单一文件,所以更易于管理。
virtv2v支持导入OVA/OVF格式的文件,这就给虚拟化的迁移带来了更大的灵活性,例如这个场景: 
如果需要将在VirtualBox、Oracle VM或任何其他不受virtv2v支持的虚拟化平台上的虚拟机迁移到KVM中,则该怎么办?
有两种解决方案: 
(1) 把此虚拟机当作物理系统,然后使用virtp2v进行迁移。
(2) 先导出开放式虚拟化格式的文件(OVF或OVA),然后将其复制到virtv2v转换服务器,使用i ova选项进行导入。示例命令如下: 



 #export pool=vmdata



 #virt-v2v -i ova -os $pool /tmp/erptest.ova



上述命令将读取保存在OVA文件中的清单,并在本地创建虚拟机。生成的磁盘映像存储在名为vmdata的存储池中。
5.1.7转换OVF格式的文件
对于有些OVF格式的文件,甚至可以不用virtv2v的导入功能,就可以直接在KVM平台下使用。下面就以某厂商发布的OVF格式的文件演示一下,如图52所示。



图52OVF格式文件



首先,通过阅读OVF文件(XML格式)可以知道虚拟机有两个VMDK文件,然后将它们上传到KVM服务器上,示例命令如下: 



 #ls -l 

total 1339700

-rw-r--r--. 1 root root 1371156480 May22015 FS6U5-NSSVA-800-MK-disk1.vmdk

-rw-r--r--. 1 root root696320 May22015 FS6U5-NSSVA-800-MK-disk2.vmdk



查看这两个映像文件的信息,示例命令如下: 



 #qemu-img info FS6U5-NSSVA-800-MK-disk1.vmdk 

image: FS6U5-NSSVA-800-MK-disk1.vmdk

file format: vmdk

virtual size: 70G (75161927680 Bytes)

disk size: 1.3G

cluster_size: 65536

Format specific information:

cid: 1031567622

parent cid: 4294967295

create type: streamOptimized

extents:

[0]:

compressed: true

virtual size: 75161927680

filename: FS6U5-NSSVA-800-MK-disk1.vmdk

cluster size: 65536

format: 







 #qemu-img info FS6U5-NSSVA-800-MK-disk2.vmdk 

image: FS6U5-NSSVA-800-MK-disk2.vmdk

file format: vmdk

virtual size: 1.0G (1073741824 Bytes)

disk size: 680K

cluster_size: 65536

Format specific information:

cid: 2716224742

parent cid: 4294967295

create type: streamOptimized

extents:

[0]:

compressed: true

virtual size: 1073741824

filename: FS6U5-NSSVA-800-MK-disk2.vmdk

cluster size: 65536

format:



出于性能的考虑,可以把它们转换为qcow2格式,示例命令如下: 



 #qemu-img convert -O qcow2 FS6U5-NSSVA-800-MK-disk1.vmdk \

FS6U5-NSSVA-800-MK-disk1.qcow2



 #qemu-img convert -O qcow2 FS6U5-NSSVA-800-MK-disk2.vmdk \

FS6U5-NSSVA-800-MK-disk2.qcow2



提示: 转换磁盘映像格式并不是必需的。

根据OVF文件中的配置信息,确定新虚拟机的主要参数如下: 
(1) 两个vCPU。
(2) 4GB内存。
(3) 4个virtio网卡。
(4) 磁盘接口为SCSI接口。
(5) 显示协议是VNC。
(6) OS类型为RHEL6。

使用virtinstall命令利用现在的映像文件创建新的虚拟机,示例命令如下: 



 #virt-install \

--import \

--name=demo8 \

--vcpus=2 --ram=4096 \

--disk bus=scsi,path=/vm/falc/FS6U5-NSSVA-800-MK-disk1.qcow2 \

--disk bus=scsi,path=/vm/falc/FS6U5-NSSVA-800-MK-disk2.qcow2 \

--network type=bridge,source=br0 \

--network type=bridge,source=br0 \








--network type=bridge,source=br0 \

--network type=bridge,source=br0 \

--graphics vnc,listen=0.0.0.0 \

--os-type=Linux \

--os-variant=rhel6\

--noautoconsole



5.1.8与virtv2v相关的故障排除
在对virtv2v进行故障排除时,应注意以下几点: 
(1) 确保在virtv2v转换服务器上安装了必需的V2V软件包,例如libguestfswinsupport和virtiowin。
(2) 确保在源主机上启用了SSH。
(3) 确保目标宿主机具有足够的空间来容纳新的虚拟机。
(4) 确认所使用的virtv2v命令语法正确。
(5) 使用最新版本的virtv2v。

提示: virtv2v手册页中有每个参数的详细说明和丰富示例。

另外,还可以通过设置环境变量来启用virtv2v调试日志,示例命令如下: 



LIBGUESTFS_TRACE=1

LIBGUESTFS_DEBug=1



如下所示,这行命令会在屏幕上输出详细的执行过程: 



#LIBGUESTFS_TRACE=1 LIBGUESTFS_DEBug=1 virt-v2v -ic \

vpx://yunhedata%5cchentao@192.168.1.20/ZZ/192.168.1.21?no_verify=1 \

"TEMP" -o local -os /var/tmp -oa sparse 



5.2P2V迁移工具virtp2v
virtv2v可以与源Hypervisor进行对话,以获取虚拟机的硬件信息和元数据,但是,当源是物理系统时,virtv2v则无法收集有关硬件的信息。为了解决此问题,libguestfs项目提供了一个Live CD/USB,它是一个小的可引导的Linux操作系统,其中包括virtp2v的工具。用它启动物理主机,virtp2v会通过SSH将物理系统的数据发送到virtv2v主机,然后将其转换为目标Hypervisor上的虚拟机。

virtp2v可以将大多数物理计算机转换为虚拟机,但也对物理机有一些要求: 
(1) 至少具有512MB的RAM。
(2) 不支持大于2TB的卷。
(3) 仅支持对基于x86或x86_64体系的计算机进行P2V转换。
(4) 不支持软件RAID的根文件系统。
(5) 必须具有网络连接。
5.2.1创建或下载virtp2v可启动映像
获得virtp2v可启动映像有两种方法: 自己制作和下载libguestfs之前推荐的非官方的ISO二进制版本。

自己制作需要使用virtp2vmakedisk或virtp2vmakekickstart的实用程序,它们都是virtp2vmaker软件包的一部分,示例命令如下: 



#dnf -y install virt-p2v-maker



#rpm -qi virt-p2v-maker

Name: virt-p2v-maker

Epoch: 1

Version: 1.42.0

Release: 5.el8

...

Summary: Convert a physical machine to run on KVM

Description :

Virt-p2v converts (virtualizes) physical machines so they can be run

as virtual machines under KVM.



This package contains the tools needed to make a virt-p2v boot CD or

USB key which is booted on the physical machine to perform the

conversion.You also need virt-v2v installed somewhere else to

complete the conversion.



To convert virtual machines from other hypervisors, see virt-v2v.



制作用于启动的U盘,示例命令如下: 



#virt-p2v-make-disk -o /dev/sdX fedora-33



注意: 此操作会删除USB驱动器/dev/sdX中所有的数据。

制作启动ISO并进行刻录,示例命令如下: 



#virt-p2v-make-kickstart fedora



#Live CD-creator p2v.ks



这将为Fedora在当前目录中创建一个p2v.ks的kickstart文件。有了kickstart文件后,就可以使用Live CDcreator制作Live CD了。

提示: virtp2vmakedisk和Live CDcreator需要连接到互联网上的在线软件仓库,有时可能会失败。

libguestfs之前推荐过一个非官方的二进制版本,包含ISO文件和PXE引导映像,目前最新的版本是通过RHEL7.3构建的。其下载网址为http://oirase.annexia.org/virtp2v/。
将下载的ISO文件(virtp2v1.32.72.el7.iso)刻录成CD,或使用Rufus(https://rufus.ie/)类的工具制作一个启动U盘。

下面通过virtp2v1.32.72.el7.iso进行P2V的转换。
5.2.2示例: 迁移Windows 2008 R2服务器
使用virtp2v可引导的CD或U盘引导物理系统,就会出现启动菜单,如图53所示。



图53virtp2v启动菜单


通过键盘的上下键选中Start Virt P2V,然后按Enter键。virtp2v提供了一个GUI界面,输入virtv2v转换服务器的IP地址、root账号及密码,如图54所示。



图54连接到virtv2v转换服务器



如果网络中没有DHCP服务器,则需要单击Configure network按钮,然后进行网络配置,设置静态IP地址。
单击Test connection按钮,测试与转换服务器的SSH连接。如果成功,则可单击Next按钮继续。
这时会出现virtp2v的主配置界面,如图55所示。界面分为4部分: 
(1) 在Target Properties中,可以设置新虚拟机的名称、vCPUs的数量和内存大小。



(2) 右侧有3个窗格,用于控制将在新虚拟机中创建哪些硬盘、可移动媒体设备和网络接口。通常保持默认设置即可。
(3) 在左中部的Virtv2v output options中,可以指定输出目标、输出连接、输出存储位置、输出格式、存储分配方式。默认情况下,存储分配格式为稀疏格式。
(4) 左下角区域会显示virtp2v和virtv2v的角色及版本信息。


图55virtp2v主要配置界面


检查确认无误后,单击Start conversion按钮启动转换。在转换过程中,会显示动作及进度,如图56所示。



图56virtp2v转换进度窗口



转换完成后会弹出转换成功窗口,单击OK按钮,如图57所示。




图57virtp2v转换完成


登录新虚拟机,在设备管理器中查看硬件驱动程序,还可以根据需要安装及升级驱动程序,如图58所示。



图58检查新虚拟机的硬件驱动程序


5.2.3故障排错及杂项
如果运行virtp2v时出现故障,则需要根据屏幕提示和日志的信息进行线索查找,例如蓝屏错误。
在有些环境下,转换Windows Sever 2003操作系统成功后,新虚拟机在启动时会出现蓝屏错误,如图59所示。


图59启动时出现蓝屏错误


查看屏幕上显示的错误号码及摘要信息,可以知道这是一个Windows Server 2003经常出现的IDE接口0x0000007B错误。微软的一篇知识库文件对此有详细的说明: 

http://support.microsoft.com/kb/314082/enus

Booting a virtual clone (IDE) of a physical Windows system partition may fail with a BSOD referring to the problem


STOP:  0x0000007B (0xF741B84C,0xC0000034,0x00000000,0x00000000)

INACCESSIBLE_BOOT_DEVICE

this means that the source physical Windows machine had no support for IDE controller, or at least the one virtually replaced by kvm (see Microsoft KB article article for details):  as Microsoft suggests, create a mergeide.reg file (File: Mergeide.zip) file on the physical machine and merge that in the registry, 'before the P2V migration. Btw, it may not be necessary but should be no harm, anyway, and save you lots of time and headaches.




知道了原因,就可以很容易地找到解决方案了。在本示例中,需要在源主机上修改注册表来启用标准IDE驱动程序。可参考https://pve.proxmox.com/wiki/File: Mergeide.zip。

在进行P2V转换的时候,还有可能会遇到USB接口的软件加密狗。
解决方案是先将USB的加密狗插入宿主机的USB接口,然后获得USB设备的ID,示例命令如下: 



#lsusb

...

Bus 005 Device 007: ID 08e2:0002

...



有了设备ID,就可以使用USB“透传”功能,将USB加密狗分配给虚拟机。这可以通过在虚拟机的配置文件中添加以下内容实现: 



<hostdev mode='subsystem' type='usb' managed='no'>

<source>

<vendor id='0x08e2'/>

<product id='0x0002'/>

</source>

</hostdev>




5.3磁盘映像工具libguestfs
除了virtv2v和virtp2v之外,libguestfs工具集还有很多其他的工具。这些工具的简单说明如下。
 guestfs: 主要的API文档。
 guestfish: 交互式Shell程序。
 guestmount: 在宿主机上挂载虚拟机文件系统。
 guestunmount: 卸载虚拟机文件系统。
 virtalignmentscan: 检查虚拟机分区的对齐方式。
 virtbuilder: 快速生成映像文件。
 irtbuilderrepository: 创建virtbuilder库。
 virtcat: 显示映像中的文件内容。
 virtcopyin: 将宿主机的文件和目录复制到虚拟机。
 virtcopyout: 从虚拟机中将文件和目录复制到宿主机。
 virtcustomize: 自定义虚拟机。
 virtdf: 显示可用空间。
 virtdib: 安全的diskimagebuilder。
 virtdiff: 比较映像文件的差异。
 virtedit: 编辑映像文件。
 virtfilesystems: 显示有关文件系统、设备、LVM信息。
 virtformat: 擦除并制作空白磁盘。
 virtgetKernel: 从磁盘获取内核。
 virtinspector: 探查映像文件。
 virtlistfilesystems: 列出文件系统。
 virtlistpartitions: 列出分区。
 virtlog: 显示日志文件。
 virtls: 列出文件。
 virtmakefs: 创建文件系统。
 virtp2v: 将物理机转换到KVM平台上。
 virtp2vmakedisk: 制作用于P2V的ISO文件或U盘。
 virtp2vmakekickstart: 制作kickstart文件。
 virtrescue: 救援模式Shell。
 virtresize: 调整映像文件的大小。
 virtsparsify: 将映像文件设置为稀疏格式(精简配置)。
 virtsysprep: 克隆前删除虚拟机的个性化配置。
 virttail: 查看日志文件尾部。
 virttar: 归档文件。
 virttarin: 归档和上传文件。
 virttarout: 归档和下载文件
 virtv2v: 将其他平台的虚拟机转换到KVM平台上。
 virtwinreg: 导出和合并Windows注册表项。
 libguestfstesttool: 测试libguestfs。
 libguestfsmakefixedappliance: 使libguestfs固定设备。
 hivex: 提取Windows注册表配置单元。
 hivexregedit: 从regedit格式的文件合并和导出注册表更改。
 hivexsh: Windows注册表配置单元Shell。
 hivexml: 将Windows注册表配置单元转换为XML。
 hivexget: 从Windows注册表配置单元中提取数据。
 supermin: 用于构建supermin设备的工具。
 guestfsd: guestfs守护程序。

这些命令基本上要求虚拟机处于关闭状态。下面介绍几个常用的命令。
(1) virtdf类似于df命令,示例命令如下: 



#virt-df /vm/win2019.qcow2 

Filesystem1K-blocksUsedAvailableUse%

win2019.qcow2:/dev/sda1562172314085307646%

win2019.qcow2:/dev/sda2104293372 11664548 92628824 12%



(2) virtcat类似于cat命令,示例命令如下: 



#virt-cat /vm/centos8.3.qcows/etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1localhost localhost.localdomain localhost6 localhost6.localdomain6



(3) virtedit类似于vi命令,示例命令如下: 



#virt-edit /vm/centos8.3.qcows/etc/hosts



(4) virtls类似于ls或dir命令,示例命令如下: 



#virt-ls/vm/win2019.qcow2 '/Windows/System32/drivers/etc/'

hosts

lmhosts.sam

networks

protocol

services



(5) virt inspector用于探查映像文件中的操作系统信息,示例命令如下: 



#virt-inspector/vm/win2019.qcow2 | head

<?xml version="1.0"?>

<operatingsystems>

<operatingsystem>

<root>/dev/sda2</root>

<name>Windows</name>

<arch>x86_64</arch>

<distro>Windows</distro>

<product_name>Windows Server 2019 Standard</product_name>

<product_variant>Server</product_variant>

<major_version>10</major_version>



5.4本章小结
本章讲解了libguestfs工具集中两个用于转换的工具: virtv2v、virtp2v,它们可以实现虚拟机到虚拟机、物理机到虚拟机的转换,支持的操作系统有Windows和Linux操作系统,还讲解了如何通过启用调试日志进行排错。最后又简单了解了libguestfs工具集中的其他命令。
第6章将讲解备份与恢复。