需要注意的是,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"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml /images/kvm/centos6.img [root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5-clone.xml /images/kvm/centos6-clone.img
到磁盘文件目录查看:
[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"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml /images/kvm/centos6.img [root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/newcentos6.xml /opt/tools/newcentos6.img [root@kvm-node1 ~]# ll /images/kvm/centos6* -rwxr-xr-x 1 root root 10737418240 Jun 30 23:08 /images/kvm/centos6.img [root@kvm-node1 ~]# ll /opt/tools/newcentos6* -rwxr-xr-x 1 root root 10737418240 Jun 30 23:32 /opt/tools/newcentos6.img 3)指定多个存储路径 [root@kvm-node1 opt]# virt-clone > --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"'" '/<source file=/{print $2}' /etc/libvirt/qemu/centos6.5.xml /images/kvm/centos6.img [root@kvm-node1 ~]# awk -F"'" '/<source file=/{print $2}' /etc/libvirt/qemu/mycentos6.5.xml /images/kvm/mycentos6.img
查看原虚拟机的磁盘文件信息:
[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
使用vnc连接虚拟机后,发现网卡名字为eth2,因为原虚拟机已经存有eth0和eth1的配置文件,所以这里自动生成了eth2网卡,但是mac地址是我们之前指定的,所以需要手动修改
/etc/udev/rules.d/70-persistent-net.rules 相关配置,然后重启虚拟机即可,不再赘述。
综上,使用virt-clone克隆虚拟机的使用分为如下步骤:
1、 使用virt-clone命令进行克隆
2、 通过virsh edit命令修改克隆后虚拟机的VNC连接端口
3、 配置克隆后虚拟机的网卡