克隆KVM虚拟机使用到的命令是virt-clone,该工具主要用来克隆虚拟机,也可以使用一系列参数对克隆出的新虚拟机进行定制化。

需要注意的是,virt-clone不会修改Guest OS内的任何信息,它仅仅只是复制虚拟机磁盘并在宿主机端做一些修改。所以,类似修改密码、设置静态IP地址等都无法通过virt-clone来完成。


virt-clone的用法:

        基础选项:

                --version:查看版本

                -h,--help:查看帮助信息

                --connect=URI:连接到虚拟机管理程序 libvirt 的URI

        一般选项:

                -o ORIGINAL_GUEST, --original=ORIGINAL_GUEST:原来的虚拟机名称,原虚拟机必须处于关机或者暂定状态

                --original-xml=ORIGINAL_XML:使用XML文件作为原始虚拟机

                --auto-clone:从原来的虚拟机配置自动生成克隆名称和存储路径。例如,原虚拟机名为VM01,那克隆的虚拟机名为VM01-clone,原虚拟机的磁盘路径为/usr/src/VM01.img,克隆后的虚拟机磁盘路径为/usr/src/VM01-clone.img

                -n NEW_NAME, --name=NEW_NAME:新的虚拟机名称

                -u NEW_UUID, --uuid=NEW_UUID:克隆虚拟机的新的UUID,默认值是一个随机生成的UUID

        存储选项:               

                -f NEW_DISKFILE, --file=NEW_DISKFILE:指定新的虚拟机磁盘文件

                --force-copy=TARGET:强制复制设备

                --nonsparse:不使用稀疏文件复制磁盘映像

                --preserve-data:不克隆存储设备,新的虚拟机镜像通过--file指定原始的未做修改的镜像,并将它同克隆后的虚拟机的XML文件关联起来

        网络选项:

               -m NEW_MAC, --mac=NEW_MAC:设置一个新的mac地址,默认是一个随机的mac

        混杂选项:

               --print-xml:并不真正执行克隆操作,而是仅仅打印自动生成的克隆后的XML文件

               --replace:不检查命名冲突,允许使用新的克隆替换已经存在的虚拟机

               -d, --debug:打印debug调试信息

               --prompt:要求用户输入多种条件或者必须的选项

               --force:不使用命令提示符来输入,相当于在适用的选项直接回复yes选项,并结束所有的命令提示符操作

               -q, --quiet: 仅仅输出错误信息,阻止其他信息的输出

 

virt-clone克隆虚拟机示例:

[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     centos6.5                      running
[root@kvm-node1 ~]# virsh shutdown centos6.5
Domain centos6.5 is being shutdown
[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------

1)使用--auto-clone进行克隆

首先,确认源虚拟机已关机后,使用virt-clone进行虚拟机克隆。

[root@kvm-node1 ~]# virt-clone -o centos6.5 --auto-clone
Cloning centos6.img                                                                     |  10 GB     02:04     
Clone 'centos6.5-clone' created successfully.

待虚拟机克隆完成后,使用virsh list --all查看系统中已注册的domain.

[root@kvm-node1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     centos6.5-clone                shut off

再到宿主机的libvirt目录查看虚拟机的xml文件:

[root@kvm-node1 ~]# ll /etc/libvirt/qemu/
total 12
-rw------- 1 root root 3071 Jun 30 23:09 centos6.5-clone.xml
-rw------- 1 root root 3053 Jun 26 03:25 centos6.5.xml
drwx------ 3 root root 4096 Jun 25 07:16 networks

检查源虚拟机和克隆出的虚拟机的xml配置的磁盘文件位置:

[root@kvm-node1 ~]# awk -F"'" '/ 
  

到磁盘文件目录查看:

[root@kvm-node1 ~]# ll /images/kvm/centos6*
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:11 /images/kvm/centos6-clone.img
-rwxr-xr-x 1 root root 10737418240 Jun 30 23:08 /images/kvm/centos6.img

2)使用--name对新虚拟机进行命名,使用--file指定存储位置

[root@kvm-node1 ~]# virt-clone --original centos6.5 --name newcentos6 --file /opt/tools/newcentos6.img
Cloning centos6.img                                                                     |  10 GB     01:06     
Clone 'newcentos6' created successfully.
[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     newcentos6                     shut off
[root@kvm-node1 ~]# ll /etc/libvirt/qemu/
total 12
-rw------- 1 root root 3053 Jun 26 03:25 centos6.5.xml
drwx------ 3 root root 4096 Jun 25 07:16 networks
-rw------- 1 root root 3057 Jun 30 23:31 newcentos6.xml
[root@kvm-node1 ~]# awk -F"'" '/ --connect qemu:///system \
> --original centos6.5 \
> --name centos6.5-2 \
> --file /usr/src/centos6.5-2-system.img \
> --file /usr/src/centos6.5-2-data.img
Cloning centos6.img                                                                     |  10 GB     01:21     
Clone 'centos6.5-2' created successfully.

注意:使用多个--file的场景为原虚拟机有多个磁盘,比如系统盘和数据盘,或者系统盘和CDROM(因为光盘是只读,所以需要使用--force选项)等。

4)使用已有的物理磁盘用作新虚拟机的磁盘文件

首先,检查一下原虚拟机的磁盘映像文件:

[root@kvm-node1 ~]# qemu-img info /images/kvm/centos6.img 
image: /images/kvm/centos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
使用qemu-img创建一个新的映像文件:
[root@kvm-node1 ~]# qemu-img create -f raw -o size=10G /images/kvm/mycentos6.img
Formatting '/images/kvm/mycentos6.img', fmt=raw size=10737418240

查看新的映像文件信息: 

[root@kvm-node1 ~]# qemu-img info /images/kvm/mycentos6.img 
image: /images/kvm/mycentos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0

使用virt-clone进行虚拟机克隆操作,因为是对已有文件进行覆盖写入,注意要指定--force参数,不然会报错。

[root@kvm-node1 ~]# virt-clone --connect qemu:///system --original centos6.5 --name mycentos6.5 --file /images/kvm/mycentos6.img --force --mac 52:54:00:26:5a:86
Cloning centos6.img                                                                     |  10 GB     00:59     
Clone 'mycentos6.5' created successfully.

克隆成功后,使用virsh list -all查看:

[root@kvm-node1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     mycentos6.5                    shut off

检查新旧虚拟机配置文件中定义的磁盘文件路径:

[root@kvm-node1 ~]# awk -F"'" '/ 
  

查看原虚拟机的磁盘文件信息:

[root@kvm-node1 ~]# qemu-img info /images/kvm/mycentos6.img 
image: /images/kvm/mycentos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G

再检查克隆后的虚拟机的磁盘文件信息:

[root@kvm-node1 ~]# qemu-img info /images/kvm/centos6.img 
image: /images/kvm/centos6.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.5G

注意:虽然克隆后的虚拟机显示disk size为10G,但是在文件系统中占用的空间仍旧和原虚拟机一样。

最后,检查一下两个虚拟机配置文件中设定的mac地址:

[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' centos6.5.xml 
awk: cmd. line:1: fatal: cannot open file `centos6.5.xml' for reading (No such file or directory)
[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' /etc/libvirt/qemu/centos6.5.xml 
52:54:00:26:5a:8d
[root@kvm-node1 ~]# awk -F"'" '/mac address/{print $2}' /etc/libvirt/qemu/mycentos6.5.xml 
52:54:00:26:5a:86

可以看到,克隆的虚拟机已经将mac地址修改成virt-clone中设置的值了。

注意:使用已经存在的磁盘去克隆虚拟机,要求已存在的磁盘空间大于或等于原虚拟机的磁盘空间大小,如果已存在的磁盘空间比原虚拟机的磁盘空间大,那么在克隆完成后虚拟机会在第一次启动时进行文件系统调整。


使用克隆后的虚拟机:

以上面最后一种方法创建的虚拟机mycentos6.5为例:

[root@kvm-node1 kvm]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos6.5                      shut off
 -     mycentos6.5                    shut off
[root@kvm-node1 kvm]# virsh start centos6.5
Domain centos6.5 started
[root@kvm-node1 kvm]# virsh start mycentos6.5
error: Failed to start domain mycentos6.5
error: internal error Process exited while reading console log output: char device redirected to /dev/pts/3
2018-06-30T16:14:43.410547Z qemu-kvm: Failed to start VNC server on `0.0.0.0:0': socket bind failed: Address already in use

这里出现一个错误,是因为VNC监听地址已使用,需要重新制定一个新的端口,这里使用virsh edit命令进行修改:


[root@kvm-node1 kvm]# virsh edit mycentos6.5
Domain mycentos6.5 XML configuration edited.

说明:只是将mycentos6.5.xml中的VNC端口由5900修改为5901. 

[root@kvm-node1 kvm]# virsh start mycentos6.5
Domain mycentos6.5 started

KVM虚拟机的克隆_第1张图片

使用vnc连接虚拟机后,发现网卡名字为eth2,因为原虚拟机已经存有eth0和eth1的配置文件,所以这里自动生成了eth2网卡,但是mac地址是我们之前指定的,所以需要手动修改

/etc/udev/rules.d/70-persistent-net.rules 相关配置,然后重启虚拟机即可,不再赘述。

综上,使用virt-clone克隆虚拟机的使用分为如下步骤:

1、 使用virt-clone命令进行克隆

2、 通过virsh edit命令修改克隆后虚拟机的VNC连接端口

3、 配置克隆后虚拟机的网卡