适用

适用于需要创建虚拟机的副本的情况。例如,如果您需要创建一个虚拟机的测试环境,或者需要将虚拟机部署到多个主机上,则可以使用KVM克隆。

因素

需要创建多个虚拟机副本
需要快速创建虚拟机副本
需要避免重复的安装和配置过程

步骤

问题描述

现在,我想在不同的 KVM 虚拟机上部署不同的服务。但是,我不想重复的安装虚拟机。我希望能够从一个虚拟机上复制出一个新的虚拟机,并且在新虚拟机上安装不同的服务。

解决方案

首先,使用 virsh 命令的 install 功能,先安装一台 KVM 虚拟机,并且配置好初始环境。然后使用 virsh 命令的 clone 功能克隆出新的虚拟机。

声明:

  • 克隆虚拟机时,会复制虚拟机的配置文件和磁盘文件(包括虚拟机的名称、内存、CPU、磁盘、网络等。但是,克隆的虚拟机将有一个新的虚拟机ID,并且不会包含源虚拟机的数据)。
  • 克隆虚拟机时,不会复制虚拟机的快照文件。
  • 克隆虚拟机时,不会复制虚拟机的日志文件。

实施过程

先查看下物理机上有哪些 KVM 虚拟机:

1
2
3
4
5
6
7
leazhi@debian:~$ virsh list --all
Id Name State
--------------------------------
1 vm001-ubuntu22 running
2 vm002-debian12 running
7 vm000-ubuntu22 running
9 vm180-ubuntu22 running

现在,假设我要克隆 vm180-ubuntu22 为 vm181-ubuntu22,则如下操作:

1.先闭关运行的 vm180-ubuntu22 虚拟机:

1
2
leazhi@debian:~$ virsh shutdown --domain vm180-ubuntu22
Domain 'vm180-ubuntu22' is being shutdown

关闭完成后,再次使用命令 virsh list --all 查看虚拟机列表,发现 vm180-ubuntu22 已经是关机状态了:

1
2
3
4
5
6
7
leazhi@debian:~$ virsh list --all
Id Name State
---------------------------------
1 vm001-ubuntu22 running
2 vm002-debian12 running
7 vm000-ubuntu22 running
- vm180-ubuntu22 shut off

2.执行克隆命令:

1
2
3
4
leazhi@debian:~$ virt-clone -o vm180-ubuntu22 -n vm181-ubuntu22 -f /data/kvm/storage/vm181-ubuntu22
Allocating 'vm181-ubuntu22' | 4.9 GB 00:00:12 ...

Clone 'vm181-ubuntu22' created successfully.

参数说明:

  • -o:指定源虚拟机名称;
  • -n:指定克隆虚拟机名称;
  • -f:指定克隆虚拟机存储路径。

克隆完成,查看虚拟机列表·

1
2
3
4
5
6
7
8
leazhi@debian:~$ virsh list --all
Id Name State
---------------------------------
1 vm001-ubuntu22 running
2 vm002-debian12 running
7 vm000-ubuntu22 running
- vm180-ubuntu22 shut off
- vm181-ubuntu22 shut off

3.启动克隆虚拟机:

1
2
leazhi@debian:~$ virsh start vm181-ubuntu22
Domain 'vm181-ubuntu22' started

再次查看虚拟机列表,发现 vm181-ubuntu22 已经启动了:

1
2
3
4
5
6
7
8
leazhi@debian:~$ virsh list --all
Id Name State
---------------------------------
1 vm001-ubuntu22 running
2 vm002-debian12 running
7 vm000-ubuntu22 running
10 vm181-ubuntu22 running
- vm180-ubuntu22 shut off

4.虚拟机启动完成后,使用命令 virsh console vm181-ubuntu22 进行连接,连接到虚拟机中,进行操作(修改IP 地址和 Hostname)。