译者|赵庆尧本文将介绍导出KVM虚拟机磁盘和配置,然后导入到同一台机器或不同机器的步骤。我还将向您展示如何使用Bash脚本导出和导入KVM虚拟机。1.前言最近,我将我的管理程序从OracleVirtualBox切换到KVM,因为它的原生特性和性能。实际上我发现KVM虚拟机比Virtualbox虚拟机运行得更快。定期备份虚拟机是必不可少的。如果我们的KVM出现异常,我们可以使用备份的KVM来恢复虚拟机。导出和导入KVM虚拟机是两个不同的过程。首先,您必须检查磁盘映像的存储位置并将磁盘映像复制到备份位置。其次,导出机器配置供以后创建域使用。2.虚拟机配置获取虚拟机配置信息的方式有两种。您可以使用“Virsh”或“Virt-manager”。您可以使用Virt-manager或执行命令virsh来获取虚拟机的名称。$virshlist--allIdNameState------------------------------------Linux_Mint_20关闭mxlinux关闭popos_21_10关闭offrocky_linux_8shutoffubuntu20.04shutoffubuntu20.04-cloneshutoff当需要查看虚拟机的全部信息(即虚拟机配置)时,可以执行以下命令。该命令将以XML格式显示结果。$virshdumpxml虚拟机名称|少$virshdumpxmlubuntu20.04-clone|less您还可以通过管道连接到grep命令以获取特定的机器配置。假设您想查看内存分配,可以运行以下命令。$virshdumpxmlubuntu20.04-clone|grep-i"MEMORY"56320005632000如果你喜欢使用Virt-manager工具,那么你可以获取虚拟机通过“VirtualHardwareDetailsWindow(显示虚拟硬件)”选项中的XML子选项以XML格式显示配置信息。3.虚拟机磁盘位置虚拟机的磁盘是以qcow2格式创建的。默认情况下,虚拟机磁盘存储在/var/lib/libvirt/images/目录中,除非您明确指定磁盘路径。运行以下命令获取磁盘目录路径。$virshdumpxmlubuntu20.04-clone|grep-i"source"如果你使用的是Virt-manager工具,可以通过查看虚拟机磁盘信息上图中的磁盘选项。您使用了不同的路径来存储磁盘映像并想知道所有VM磁盘路径,那么您可以在终端或shell脚本中运行以下代码段:$virshdumpxmlubuntu20.04-clone|grep-i"source"4.导出配置信息和备份磁盘镜像既然您知道了如何获取虚拟机的磁盘路径和配置信息,下一步就是可以导出VM的配置信息并将磁盘镜像复制到不同的位置。要导出虚拟机信息,您可以运行以下“virshdumpxml”并将输出存储在XML文件中。$virshdumpxmlvm-name>/path/to/xm_file.xml$virshdumpxmlubuntu20.04-clone>~/Documents/ubuntu.xml接下来,我们使用以下命令将磁盘映像复制到另一个位置以备后用。$sudocp/var/lib/libvirt/images/ubuntu20.04-clone.qcow2~/Documents/这样就完成了KVM的导出。注意:您应该使用sudo或使用root来复制磁盘,因为磁盘归root所有。5.导入虚拟机要导入KVM虚拟机,必须运行以下命令使用导出的XML文件重新定义虚拟机。$virshdefine--file$virshdefine--file~/Documents/ubuntu.xml现在,您可以在Virt-manager中查看或执行virsh命令,域已成功创建。您还必须将磁盘映像复制到XML文件中定义的目录路径。在我的环境中,它是默认位置/var/lib/libvirt/images/,所以我使用下面的命令进行复制。sudocp~/Documents/ubuntu20.04-clone.qcow2/var/lib/libvirt/images/导入KVM就完成了。6.导出和导入KVM虚拟机的Bash脚本我创建了一个bash脚本来导出所有配置和磁盘映像。如果您有兴趣,可以查看我的GitHub存储库中的脚本。也感谢您对改进脚本的建议。#!/usr/bin/envbash#----------------------------------------------------------------------------------------------#作者:KARTHICKS#目的:此脚本将导出/导入配置和VM磁盘。##用法:#export函数将负责导出所有VM所需的内容。Runas"export"#import函数将负责导入所有VM所需的内容。Runas"import"##注意:在给出导出和导入路径时不要为目录添加尾随/。#------------------------------------------------------------------------------------------------#以root用户或exit触发脚本。if[[${UID}-ne0]];thenecho-e"[EXIT]-以root用户身份或使用sudo权限运行脚本..."exitfifunctionexport_vm(){#获取导出位置。read-p"提供要导出的磁盘和配置文件的目录路径:"EXPORT_LOCATION#如果没有则创建目标目录存在。[[-d${EXPORT_LOCATION}]]||mkdir-p${EXPORT_LOCATION}#使用virshdumpxml命令导出配置。VM_NAMES=($(virshlist--all|awk'(NR>2)'|awk'{print$2}'))forVMin${VM_NAMES[@]};dovirshdumpxml${VM}>${EXPORT_LOCATION}/${VM}.xmldone#使用rsync从默认位置复制整个目录。echo-e"\n[复制磁盘映像]\n"&&sudorsync-avxp--progress/var/lib/libvirt/images${EXPORT_LOCATION}echo-e"\n[导出文件]\n"&&ls-lR${EXPORT_LOCATION}}functionimport_vm(){#获取源位置.read-p"提供存储磁盘和配置文件的目录路径:“SOURCE_LOCATION#如果目录不可用则抛出错误并退出。[[-d${SOURCE_LOCATION}]]||{echo"目录不可用";出口1;}#将所有文件复制到默认磁盘位置。echo-e"[Copyingdiskimages]\n"&&sudorsync-avxp--progress${SOURCE_LOCATION}/images/var/lib/libvirt/if[[$?-eq0]];then#DefineVMecho-e"\n[DefiningVM]\n"forXML_FILEin${SOURCE_LOCATION}/*.xml;dovirshdefine--file${XML_FILE}doneecho-e"\n[ImportedVMList]\n"&&virshlist--allfi}case$1inexport)export_vm;;import)import_vm;;*)echo-e"USAGE:kvm_export_import.shexport-导出配置和diskkvm_export_import.shimport-定义VM并复制磁盘”;exitsac该脚本的用法如下您可以运行以下命令从GitHub克隆要点。$gitclonehttps://gist.github.com/d6c671597592fe5634a39b7974bc8029.git该脚本执行备份(即导出)和恢复(即导出)。让我们使用以下脚本导出KVM虚拟机。$sudobashkvm_export_import.shexport您必须提供要导出XML文件和磁盘映像的目录路径。提供导出目录时,请勿在路径后附加斜杠('/')。它将首先复制磁盘映像(.qcow2)并运行“virshdumpxml”命令以导出所有虚拟机配置。下图显示了导出的工作原理。当您将“import”作为参数传递时,它会首先将磁盘映像复制到默认位置/var/lib/libvirt/,并对所有导出的XML文件运行“virshdefine”命令。$sudobashkvm_export_import.shimport7.总结在本文中,我向您展示了如何导出KVM虚拟机并将它们导入到相同或不同的机器中。从头开始构建虚拟机是一项耗时的任务。因此,使用适当的策略来保护我们的虚拟机环境免受任何损害。译者介绍赵庆尧,51CTO社区编辑,从事驱动开发多年。他的研究兴趣包括安全操作系统和网络安全,并发表了与网络相关的专利。