Клонирование виртуальных машин KVM
Для клонирования ВМ можно использовать простую команду virt-clone. Это утилита командной строки для клонирования существующих образов виртуальных машин с использованием библиотеки "libvirt". Она скопирует образы дисков любой существующей ВМ и определит нового гостя с идентичной конфигурацией виртуального оборудования. Элементы, которые требуют уникальности, будут обновлены, чтобы избежать столкновения между старыми и новыми ВМ.
Или
Или
ИЛИ поставьте ВМ на паузу:
Давайте сгенерируем новую ВМ на основе vm1
Приведенная выше команда клонировала ВМ vm1, автоматически сгенерировав новое имя vm1-clone и путь к образу. Теперь можно запустить или снять с паузы оригинальную ВМ:
Или
Теперь можно запустить склонированную vm1-clone:
И убедиться, что она запущена:
И наконец, подключаемся к ВМ:
После входа в клонированную ВМ с помощью ssh вы можете изменить их:
Но что делать, если у вам надо сделать 10 клонов? Для этого можно воспользоваться утилитой virt-sysprep, чтобы изменить hostname ВМ и сбросить все настройки внутри ОС.
Сначала установите пакет libguestfs-tools:
Теперь можно запустить virt-sysprep:
Вот такой у меня вывод после запуска virt-sysprep -d pgsql-1 --hostname pgsql-1:
Как клонировать существующие образы виртуальных машин KVM в Linux
Для клонирования ВМ и создания новых инстансов в KVM# virt-clone --original {Domain-Vm-Name-Here} --auto-clone
Или
# virt-clone --original {Domain-Vm-Name-Here} --name {New-Domain-Vm-Name-Here} --auto-clone
Или
# virt-clone --original {Domain-Vm-Name-Here} \
--name {New-Domain-Vm-Name-Here} --file {/var/lib/libvirt/images/File.Name.here}
Пример клонирования ВМ с помощью virt-clone
ВМ для клонирования должна быть приостановлена или отключена. Чтобы корректно завершить работу ВМ с именем vm1, выполните:$ sudo virsh shutdown vm1
ИЛИ поставьте ВМ на паузу:
$ sudo virsh suspend vm1
$ virsh list
Domain vm1 suspended
Id Name State
----------------------------------------------------
1 terraform running
5 vm1 paused
Давайте сгенерируем новую ВМ на основе vm1
$ sudo virt-clone --original vm1 --auto-clone
WARNING Setting the graphics device port to autoport, in order to avoid conflicting.
Allocating 'vm1-clone.qcow2' | 10 GB 00:00:04
Clone 'vm1-clone' created successfully.
Приведенная выше команда клонировала ВМ vm1, автоматически сгенерировав новое имя vm1-clone и путь к образу. Теперь можно запустить или снять с паузы оригинальную ВМ:
$ sudo virsh start vm1
Или
$ sudo virsh resume vm1
Теперь можно запустить склонированную vm1-clone:
$ sudo virsh start vm1-clone
И убедиться, что она запущена:
$ virsh list
И наконец, подключаемся к ВМ:
$ ssh 192.168.122.123
Примечание
virt-clone ничего не меняет в гостевой ОС, он только дублирует диски и вносит изменения на стороне хоста. Таким образом, такие вещи, как изменение паролей, изменение статического IP-адреса, ssh-ключей, имен хостов и т. д. не входят в сферу применения этого инструмента.После входа в клонированную ВМ с помощью ssh вы можете изменить их:
$ ssh 192.168.122.123
$ sudo -s
# echo 'vm1-clone' > /etc/hostname
# sed -i 's/vm1/vm1-clone/g' /etc/hosts
# reboot
# rm -v /etc/ssh/ssh_host_*
# dpkg-reconfigure openssh-server
# passwd <password>
Но что делать, если у вам надо сделать 10 клонов? Для этого можно воспользоваться утилитой virt-sysprep, чтобы изменить hostname ВМ и сбросить все настройки внутри ОС.
Сначала установите пакет libguestfs-tools:
# yum install -y libguestfs-tools
Теперь можно запустить virt-sysprep:
# virsh suspend vm01
# virt-clone --original vm01 --name vm02 --file /var/lib/libvirt/images/vm02-disk01.qcow2
# virsh resume vm01
# virt-sysprep -d vm02 --hostname vm02
Вот такой у меня вывод после запуска virt-sysprep -d pgsql-1 --hostname pgsql-1:
[root@kvm libvirt]# virt-sysprep -d pgsql-1 --hostname pgsql-1
[ 0.0] Examining the guest ...
[ 9.5] Performing "abrt-data" ...
[ 9.5] Performing "backup-files" ...
[ 10.9] Performing "bash-history" ...
[ 10.9] Performing "blkid-tab" ...
[ 10.9] Performing "crash-data" ...
[ 10.9] Performing "cron-spool" ...
[ 10.9] Performing "dhcp-client-state" ...
[ 10.9] Performing "dhcp-server-state" ...
[ 10.9] Performing "dovecot-data" ...
[ 10.9] Performing "logfiles" ...
[ 11.1] Performing "machine-id" ...
[ 11.1] Performing "mail-spool" ...
[ 11.1] Performing "net-hostname" ...
[ 11.2] Performing "net-hwaddr" ...
[ 11.2] Performing "pacct-log" ...
[ 11.2] Performing "package-manager-cache" ...
[ 11.2] Performing "pam-data" ...
[ 11.2] Performing "passwd-backups" ...
[ 11.2] Performing "puppet-data-log" ...
[ 11.2] Performing "rh-subscription-manager" ...
[ 11.2] Performing "rhn-systemid" ...
[ 11.2] Performing "rpm-db" ...
[ 11.2] Performing "samba-db-log" ...
[ 11.2] Performing "script" ...
[ 11.2] Performing "smolt-uuid" ...
[ 11.3] Performing "ssh-hostkeys" ...
[ 11.3] Performing "ssh-userdir" ...
[ 11.3] Performing "sssd-db-log" ...
[ 11.3] Performing "tmp-files" ...
[ 11.3] Performing "udev-persistent-net" ...
[ 11.3] Performing "utmp" ...
[ 11.3] Performing "yum-uuid" ...
[ 11.3] Performing "customize" ...
[ 11.3] Setting a random seed
[ 11.3] Setting the machine ID in /etc/machine-id
[ 11.3] Setting the hostname: pgsql-1
[ 11.7] Performing "lvm-uuids" ...