Клонирование виртуальных машин#

Чтобы быстро создать новую ВМ с определенным набором свойств, можно клонировать существующую ВМ.

Клонирование создает новую ВМ, которая использует собственный образ диска для хранения, но большая часть конфигурации и сохраненных данных идентична исходной ВМ. Это позволяет подготовить несколько ВМ, оптимизированных для выполнения определенной задачи, без необходимости настраивать каждую в отдельности.

Принцип клонирования виртуальных машин#

При клонировании копируется XML-конфигурация исходной ВМ и образы ее дисков. Затем конфигурация корректируется для обеспечения уникальности новой ВМ. Данный процесс включает изменение имени ВМ и настройку использования клонированных образов диска. Данные, хранящиеся на виртуальных дисках клонированной ВМ, идентичны исходной.

Клонирование происходит быстрее, чем создание новой ВМ вместе с установкой ее с гостевой ОС. Процесс клонирования может быть использован для быстрого создания ВМ с определенной конфигурацией и содержимым.

Если требуется создать несколько клонов ВМ создайте шаблон, который не должен содержать:

  • уникальных параметров, таких как постоянная сетевая конфигурация МАС, которые могут помешать работе клонов;

  • конфиденциальных данных, таких как ключи SSH и файлы паролей.

Создание шаблонов виртуальных машин#

Шаблоны ВМ можно создавать с помощью утилиты virt-sysprep или вручную в соответствии с потребностями пользователя.

Создание шаблонов виртуальных машин с помощью утилиты virt-sysprep#

Чтобы создать шаблон для клонирования на основе существующей ВМ, используйте утилиту virt-sysprep. При этом удаляются элементы конфигурации, которые могут привести к неправильной работе клона, такие как определенные сетевые настройки или метаданные регистрации системы.

Предварительные условия#

  • На хосте установлен пакет guestfs-tools, в состав которого входит утилита virt-sysprep.

    Примечание

    Если пакет отсутствует, установите его командой:

    dnf install guestfs-tools
    
  • Исходная ВМ, рассматриваемая как основа для шаблона, выключена.

  • Известно расположение файла образа диска исходной ВМ, на который получены права владельца.

    Примечание

    Образы дисков ВМ, созданных c помощью системного подключения libvirt, расположены в каталоге /var/lib/libvirt/images и по умолчанию их владельцем является пользователь root:

    ls -la /var/lib/libvirt/images
    

    Пример вывода команды:

    -rw-------.  1 root root  9665380352 Jul 23 14:50 a-really-important-vm.qcow2
    -rw-------.  1 root root  8591507456 Jul 26  2017 an-actual-vm-that-i-use.qcow2
    -rw-------.  1 root root  8591507456 Jul 26  2017 totally-not-a-fake-vm.qcow2
    -rw-------.  1 root root 10739318784 Sep 20 17:57 another-vm-example.qcow2
    

Примечание

Рекомендуется сделать резервную копию важных данных исходного диска ВМ. Чтобы исключить повреждение исходной ВМ, вначале сделайте ее клон, а его используйте для создания шаблона.

Сценарий#

  1. Убедитесь, что пользователь, от имени которого был осуществлен вход в систему, является владельцем образа диска ВМ с помощью команды:

    whoami
    

    В результате выполнения команды выведется имя учетной записи пользователя, используемое в текущий момент.

    Примечание

    Рекомендуется сделать резервную копию образа диска ВМ. Для создания резервной копии используйте команду:

    cp /var/lib/libvirt/images/<original-vm>.qcow2 /var/lib/libvirt/images/<copy-original-vm>.qcow2
    

    Где <original-vm> и <copy-original-vm> - имена образа и копии диска ВМ соответственно.

    Копию можно использовать для проверки, была ли ВМ успешно преобразована в шаблон.

  2. Создайте шаблон с помощью команды virt-sysprep:

    virt-sysprep -a /var/lib/libvirt/images/<original-vm>.qcow2
    

    Где /var/lib/libvirt/images/<original-vm>.qcow2 – путь к образу диска исходной ВМ.

    Пример вывода команды:

    [   0.0] Examining the guest ...
    [   7.3] Performing "abrt-data" ...
    [   7.3] Performing "backup-files" ...
    [   9.6] Performing "bash-history" ...
    [   9.6] Performing "blkid-tab" ...
    [...]
    

Проверка#

Чтобы убедиться, что процесс клонирования прошел успешно, сравните измененный образ диска с исходным с помощью команды:

virt-diff -a /var/lib/libvirt/images/<copy-original-vm>.qcow2 -A /var/lib/libvirt/images/<original-vm>.qcow2

Пример вывода команды:

- - 0644       1001 /etc/group-
- - 0000        797 /etc/gshadow-
= - 0444         33 /etc/machine-id
[...]
- - 0600        409 /home/username/.bash_history
- d 0700          6 /home/username/.ssh
- - 0600        868 /root/.bash_history
[...]

Дополнительная информация#

Дополнительную информацию можно получить с помощью команды man virt-sysprep.

Создание шаблона виртуальной машины вручную#

Чтобы создать шаблон из существующей ВМ, можно вручную сбросить или изменить настройки гостевой ВМ для подготовки ее к клонированию.

Предварительные условия#

  • Известно расположение файла образа диска ВМ, на который получены права владельца.

  • ВМ выключена.

Сценарий#

  1. Настройте ВМ для клонирования:

    • Установите на клон необходимое программное обеспечение.

    • Настройте неуникальные параметры ОС и приложений.

  2. Удалите сетевые настройки:

    • Удалите все постоянные правила udev с помощью команды:

      rm -f /etc/udev/rules.d/70-persistent-net.rules
      

      Примечание

      Если правила udev не удаляются, имя первой сетевой карты может быть eth1, а не eth0.

    • Удалите уникальную информацию из файлов NMConnection в каталоге /etc/NetworkManager/system-connections/.

      • Удалите MAC-адрес, IP-адрес, DNS, шлюз и любую другую уникальную информацию или нежелательные настройки:

        *ID=ExampleNetwork
        BOOTPROTO="dhcp"
        HWADDR="AA:BB:CC:DD:EE:FF"                  <- УДАЛИТЬ
        NM_CONTROLLED="yes"
        ONBOOT="yes"
        TYPE="Ethernet"
        UUID="954bd22c-f96c-4b59-9445-b39dd86ac8ab" <- УДАЛИТЬ
        
      • Удалите аналогичную уникальную информацию и нежелательные настройки из файлов /etc/hosts и /etc/resolv.conf.

  3. Удалите прочую уникальную и чувствительную информацию:

    • Удалите пары открытых и закрытых ключей SSH с помощью команды:

      rm -rf /etc/ssh/<ssh_host_example>
      

      Где <ssh_host_example> – файл с информацией о ключах SSH.

    • Удалите конфигурацию LVM устройств с помощью команды:

      rm /etc/lvm/devices/system.<devices>
      

      Где <devices> – имя устройства.

    • Удалите любые другие идентификаторы или параметры, специфические для приложений, которые могут вызвать конфликты при работе на нескольких машинах.

  4. Удалите файл gnome-initial-setup-done, чтобы настроить ВМ для запуска мастера настройки при следующей загрузке с помощью команды:

    rm ~/.config/gnome-initial-setup-done
    

Примечание

Мастер настройки, который запустится при следующей загрузке, зависит от конфигураций, которые были удалены из ВМ. При первой загрузке клона также рекомендуется изменить имя хоста.

Клонирование виртуальных машин с помощью интерфейса командной строки#

Чтобы создать новую ВМ с определенным набором свойств, можно клонировать существующую с помощью интерфейса командной строки.

Предварительные условия#

  • Исходная ВМ выключена.

  • На диске достаточно места для хранения клонированных образов дисков.

Примечание

При создании нескольких клонов ВМ удалите уникальные данные и настройки из исходной ВМ, чтобы обеспечить корректную работу клонов. Дополнительную информацию см. в разделе «Создание шаблона виртуальной машины вручную» -> «Предварительные условия».

Сценарий#

Клонирование ВМ осуществляется с помощью утилиты virt-clone с опциями, которые подходят для используемых среды и сценария использования.

Некоторые примеры вариантов применения утилиты virt-clone:

  • Чтобы клонировать локальную ВМ с именем <example-vm> и создать ВМ <example-vm>-clone воспользуйтесь командой:

    virt-clone --original <example-vm> --auto-clone
    

    Команда создает и размещает образ диска <example-vm>-clone.qcow2 в том же месте, что и образ диска исходной ВМ, и с теми же данными.

    Вывод команды:

    Allocating '<example-vm>-clone.qcow2'                            | 50.0 GB  00:05:37
    
    Clone '<example-vm>-clone' created successfully.
    
  • Для того чтобы клонировать ВМ с именем <example-vm> и создать локальный клон с именем <custom-name-vm>, которая использует только два из существующих дисков <example-vm>, воспользуйтесь командой:

    virt-clone --original <example-vm> --name <custom-name-vm> --file /var/lib/libvirt/images/disk-1-<example-vm>.qcow2 --file /var/lib/libvirt/images/disk-2-<example-vm>.qcow2
    

    Вывод команды:

    Allocating 'disk-1-<example-vm>-clone.qcow2'                                      | 78.0 GB  00:05:37
    Allocating 'disk-2-<example-vm>-clone.qcow2'                                      | 80.0 GB  00:05:37
    
    Clone '<custom-name-vm>' created successfully.
    
  • Для клонирования ВМ на другой хост, выполните ее миграцию без переопределения на локальном хосте. Чтобы клонировать созданную в предыдущем примере ВМ <custom-name-vm> в удаленную систему hh.hh.hh.hh, включая ее локальные диски, используйте следующие команды:

    virsh migrate --offline --persistent <custom-name-vm> qemu+ssh://root@hh.hh.hh.hh/system
    

    Введите пароль:

    root@hh.hh.hh.hh's password:
    

    Скопируйте диски:

    scp /var/lib/libvirt/images/<disk-1-<example-vm>-clone>.qcow2 root@hh.hh.hh.hh/<user@remote_host.com>://var/lib/libvirt/images/
    
    scp /var/lib/libvirt/images/<disk-1-<example-vm>-clone>.qcow2 root@hh.hh.hh.hh/<user@remote_host.com>://var/lib/libvirt/images/
    

    Где <example-vm> – исходная ВМ для <custom-name-vm>.

Проверка#

Чтобы проверить, что ВМ успешно клонирована и работает корректно, выполните следующие шаги:

  1. Убедитесь, что клон добавлен в список ВМ на хосте, с помощью команды:

    virsh list --all
    

    Пример вывода команды:

    Id   Name                  State
    ---------------------------------------
    -    <example-vm>          shut off
    -    <example-vm-clone>    shut off
    
  2. Запустите клон и проверьте, загрузился ли он корректно, с помощью команды:

    virsh start <example-vm-clone>
    

    Пример вывода команды:

    Domain '<example-vm-clone>' started