Создание виртуальной машины с использованием облачного базового образа дистрибутива — на примере CentOS

Peter Boy, Jan Kuparinen Version F34-F36 Last review: 2022-05-10

Цель здесь — создать виртуальную машину на основе любого дистрибутива. Но вместо прохождения установщика конкретного дистрибутива используется облачный образ. Это сводит процесс установки к копированию образа диска с последующей начальной адаптацией к конкретной среде выполнения. Объём работы сокращается до нескольких минут.

Облачные образы

Облачный образ — это образ диска виртуальной машины, содержащий операционную систему конкретного дистрибутива. Он готов к запуску в виртуальной среде выполнения, настроенной под одну из облачных платформ, таких как Openstack, Amazon EC2, Google GCE и т. д. Большинство дистрибутивов также предоставляют универсальный образ или базовый образ со средой выполнения без дополнений под конкретную облачную систему. Такой универсальный образ (обычно) подходит для среды выполнения QEMU/KVM/libvirt.

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

В зависимости от дистрибутива облачные образы могут более или менее отличаться от установки по умолчанию с использованием установочных носителей дистрибутива. Есть также дистрибутивы, например Ubuntu, которые явно различают облачные образы и серверные образы. Документация о целях и различиях в основном скудна или отсутствует. Debian по крайней мере пытается документировать различия.

Системный администратор должен выяснить, соответствует ли облачный образ требованиям и ожиданиям, связанным с использованием виртуальной машины данного дистрибутива.

Как это работает

Облачный образ — это своего рода шаблон, независимое от среды выполнения загружаемое дерево каталогов универсальной операционной системы. Он используется непосредственно как загружаемый (виртуальный) системный диск в создаваемой виртуальной машине, хотя всё ещё практически непригоден из-за отсутствия конкретной конфигурации среды выполнения.

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

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

  • cloud-init

  • ignition

Оба предназначены для получения данных конфигурации из облачной системы при первой загрузке и применения их к образу. Разработчики, к счастью, проявили предусмотрительность и также предусмотрели процедуру 'nocloud'. Так что системный администратор автономного сервера может предоставить замену. Как можно догадаться, при разработке с ориентацией на облако вариант nocloud переживает трудные времена. Это остаётся в некоторой степени сложной задачей.

Третий вариант —

  • virt-customize

универсальный инструмент для изменения любой незапущенной виртуальной машины, предоставляемый guestfs-tools. Он позволяет устанавливать облачные образы более старых дистрибутивов, таких как CentOS 7 или более ранние редакции Ubuntu.

Что вы получаете

В частности, вы получаете время. Объём работы значительно ниже и соответственно быстрее.

Но с облачным базовым образом вы (обычно) не получаете альтернативно собранную, но в остальном идентичную сборку (серверного) дистрибутива. Есть некоторые тонкие различия. Некоторые из них концептуальные. Например, большинство облачных образов не устанавливают межсетевой экран. Обычно эту функцию предоставляет облачная система. Концепция использования постоянного хранилища также отличается из-за технических различий. И последнее, но не менее важное: у разработчиков облачных образов могут быть иные цели, чем у разработчиков серверного варианта установки дистрибутива.

Системный администратор решает, насколько функциональность идентична — настолько, что преимущества перевешивают недостатки и имеет смысл использовать конкретный облачный образ как виртуальную машину.

Как действовать

Прежде всего вам нужна работающая редакция Fedora Server с добавленной поддержкой виртуализации и активным демоном libvirtd. Мы предполагаем, что также настроена внутренняя сеть 'default' с virbr0, DHCP и DNS (см. раздел «Добавление поддержки виртуализации»). Внешнее сетевое подключение будет обеспечиваться через macvlan (интерфейс ethernet) соответственно macvtap (термин libvirt).

У вас есть различные варианты:

  • Использование графического интерактивного инструмента Cockpit для быстрой минимальной настройки виртуальной машины

  • Использование интерактивного инструмента командной строки virt-install для быстрой минимальной настройки виртуальной машины на основе cloud-init

  • Использование интерактивного инструмента командной строки virt-install для развёрнутой настройки виртуальной машины на основе cloud-init

  • Инструменты командной строки virt-customize и virt-install для довольно простой интерактивной настройки виртуальной машины

  • Использование любого из инструментов командной строки для автоматической установки на основе сценариев

Здесь мы рассмотрим только первые два варианта. Они настолько универсальны, что применимы практически к любым дистрибутивам. Последние сильно зависят от деталей конкретного дистрибутива.

Общая подготовка

Какой бы из представленных способов установки ни был выбран, облачный образ всегда нужно загрузить и проверить. В случае CentOS это включает следующие шаги.

  1. Проверьте на сайте проекта CentOS последний выпуск образа GenericCloud: https://cloud.centos.org/centos/9-stream/x86_64/images/ На момент написания это был CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2

  2. В окне терминала Cockpit загрузите файл универсального образа CentOS 9-stream и сохраните его в каталог /var/lib/libvirt/boot. По соглашению это расположение образов для установки по умолчанию в libvirt. Проверьте целостность загрузки.

    $ sudo su -
    # cd /var/lib/libvirt/boot
    # wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2
    # wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2.SHA256SUM
    # sha256sum --ignore-missing -c *.SHA256SUM

    Возможно, вы захотите собрать некоторую информацию об образе

    # qemu-img  info CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2
    
    image: CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2
    file format: qcow2
    virtual size: 10 GiB (10737418240 bytes)
    disk size: 777 MiB
    cluster_size: 65536
    Format specific information:
        compat: 0.10
        compression type: zlib
        refcount bits: 16

    Виртуальный размер, то есть объём хранилища, доступный виртуальной машине во время работы, составляет 10 ГиБ. Фактический размер файла гораздо меньше из-за динамического свойства формата qcow2. Он растёт по мере необходимости во время выполнения.

Использование Cockpit для графической интерактивной установки

Вы можете начать без какой-либо дополнительной подготовки.

Установка

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

Форма Cockpit `__Создать новую виртуальную машину__`

Когда форма только открывается, она выглядит немного иначе, чем на приведённом снимке экрана. Укажите имя для создаваемой виртуальной машины. Оно должно быть уникальным как минимум в пространстве имён хост-сервера и, в лучшем случае, в пространстве имён назначенного домена. Выберите тип подключения; для производственных развёртываний используйте system. Подробности о типе подключения см. в руководстве Добавление поддержки виртуализации.

Затем выберите тип установки Облачный базовый образ из раскрывающегося меню. Нижняя часть формы изменится и теперь будет напоминать приведённый выше снимок экрана, за исключением последних 3 строк. Заполните источник установки и операционную систему, укажите размер диска и объём ОЗУ.

Наконец, отметьте Задать параметры cloud init. Форма снова изменится и откроет последние 3 строки. Введите пароль root, при желании — дополнительные имя пользователя и пароль.

Вы обязаны ввести пароль root. Это одновременно активирует учётную запись root. В противном случае вы не сможете получить административные привилегии. Дополнительная учётная запись пользователя не поможет!

Системные администраторы не из США: облачный образ обычно сначала настраивает клавиатуру США, и вы сможете изменить раскладку клавиатуры не раньше первого входа в систему. Ограничьте пароль совпадающими позициями клавиш (и позже измените его, если захотите)

Выберите Создать, чтобы начать установку.

Через несколько секунд виртуальная машина запущена и работает.

Задачи после установки

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

Форма Cockpit `__Создать новую виртуальную машину__`

Созданная среда выполнения довольно базовая. При установке из облачного образа вы не можете отложить процесс создания и точно настроить конфигурацию среды выполнения, как при других вариантах установки. Есть конфигурация дисков по умолчанию, например CD-привод по умолчанию и один диск, как настроено. И есть только одно сетевое подключение, использующее виртуальную сеть libvirt по умолчанию.

Войдите под учётной записью root. Если осмотреться, вы найдёте некоторое сходство с конфигурацией сервера CentOS. Cockpit установлен, но не активирован. Установка межсетевого экрана полностью отсутствует. Виртуальный диск содержит одну плоскую файловую систему XFS. Активная конфигурация сети находится в /etc/sysconfig/network-scripts (из-за ограничений cloud-init). Остатки конфигурации сети NetworkManager находятся в /etc/NetworkManager/system-connections.

Так что есть некоторая работа после установки.

Настройка локали и раскладки клавиатуры, отличной от США

Пользователи раскладки клавиатуры, отличной от США, вероятно, захотят в первую очередь настроить раскладку клавиатуры.

  1. Проверьте текущую конфигурацию локали

    # localectl
    System Locale: LANG=en_US.UTF-8
        VC Keymap: us
       X11 Layout: us
  2. Выведите список доступных раскладок клавиатуры, отфильтрованный по короткому коду вашей страны

    # localectl list-keymaps  | grep de-
    de-T3
    de-deadacute
    de-deadgraveacute
    de-deadtilde
    de-mac
    de-mac_nodeadkeys
    de-neo
    de-nodeadkeys
    ...
  3. Определите подходящую раскладку и примените её

    # localectl set-keymap de-nodeadkeys
    ...

    Настройка вступает в силу немедленно.

Настройка сети

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

Однако виртуальные машины в основном предоставляют публичные службы и требуют доступа к публичной сети, а также доступности из публичной сети. Ключевая часть — изолировать эти доступы от хост-сервера по соображениям безопасности.

Один вариант — привязать виртуальный мост к физическому интерфейсу и подключить виртуальную машину к этому мосту. Другой вариант — Mac-vlan, при котором виртуальная машина добавляет виртуальный интерфейс к физическому интерфейсу хоста. Он получает собственный MAC-адрес и собственный IP (и псевдонимы IP при необходимости). Набор инструментов libvirt называет это прямым подключением.

Последний теперь является рекомендуемым подходом. Он действует подобно мосту, но с меньшей системной нагрузкой. Недостаток в том, что прямое взаимодействие между хостом и виртуальными машинами невозможно, а между самими виртуальными машинами — возможно. Хосты и виртуальные машины могут взаимодействовать только через внутреннюю защищённую сеть. Для администраторов удалённых, не доступных напрямую серверов дополнительное большое преимущество в том, что после базовой установки и начальной настройки сети больше не нужно трогать драгоценное сетевое подключение.

  1. Войдя в систему, используйте окно терминала, чтобы задать статическое имя хоста. Это обеспечивает правильную настройку DNS в среде DHCP.

    $ hostnamectl set-hostname vm1-el9.example.com
    $ hostnamectl
  2. Если вы развернули окно терминала, нажмите на имя виртуальной машины в навигационной цепочке, чтобы вернуться к виду по умолчанию. Выберите завершение работы, чтобы остановить виртуальную машину.

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

    Форма Cockpit `__Конфигурация виртуального Ethernet__`

    Замените тип интерфейса на Прямое подключение и выберите внешний физический интерфейс хоста в поле Источник. Оставьте модель и MAC-адрес без изменений.

  4. Если вы также хотите внутреннюю сеть (а в большинстве случаев определённо должны), выберите Добавить сетевой интерфейс. Появится почти идентичная форма. Выберите Тип интерфейса как Виртуальная сеть, если он ещё не выбран, и default как Источник. Снова оставьте модель (Linux, perf) и MAC-адрес (Создавать автоматически) без изменений. Нажмите «Создать», чтобы завершить создание конфигурации сети.

  5. Снова запустите виртуальную машину.

Проверьте сетевые подключения

  1. Проверьте внутренние подключения

    Из окна терминала в хост-системе вы должны иметь возможность пинговать вашу виртуальную машину через внутреннюю виртуальную сеть.

    $ ping  vm1-el9

    Если настройка службы имён на хосте корректна, короткое имя должно работать. В противном случае попробуйте внутреннее полное доменное имя (например, что-то вроде vm1-el9.example.lan). Если разрешение имён не работает, переключитесь на окно терминала Cockpit виртуальной машины. Используйте ip a, чтобы определить внутренний IP, и используйте его для пинга виртуальной машины.

    Если пинг IP-адреса работает, исправьте разрешение имён. В противном случае снова проверьте конфигурацию сети.

  2. Проверьте внешние подключения

    С машины в вашей сети попробуйте пингануть виртуальную машину

    $ ping  vm1-el9.example.com

    В случае проблем действуйте аналогично внутреннему подключению.

Усиление безопасности

Установка через Cockpit не может реализовать широко используемую концепцию безопасности с блокировкой учётной записи root. Она требует дополнительных административных изменений позже. Однако в конфигурации CentOS по умолчанию root может входить через ssh и пароль. Тем не менее определённая защита учётной записи root существует.

  1. Если уже есть другой пользователь и этому пользователю должны быть предоставлены административные права, учётную запись необходимо добавить в группу wheel.

    # usermod -aG wheel <USERNAME>

    Проверьте, работают ли вход и sudo!

  2. Если вы решите заблокировать учётную запись root, войдите под своим административным пользователем и выполните

    # sudo passwd -l root

    Выйдите из системы и попробуйте войти как root (например, используя экземпляр Cockpit хоста). Система должна ответить «Login incorrect».

  3. Если вы решите использовать учётную запись root и при установке выбрали простой пароль, вам следует задать длинный и надёжный пароль. Войдите как root и выполните

    # passwd

    Если root также нужен доступ по ssh, необходимо настроить вход по ключу. Выполните шаг 5 руководства Настройки после установки.

  4. Установите и активируйте межсетевой экран

    # dnf install firewalld
    # systemctl  enable  firewalld   --now
    # firewall-cmd  --list-all
  5. Если вы хотите использовать Cockpit, его нужно включить

    # systemctl  enable  cockpit.socket   --now

    Cockpit должен запуститься, как только вы подключитесь через браузер.

  6. Наконец, если вы хотите, чтобы виртуальная машина запускалась автоматически при запуске системы, отметьте соответствующий флажок в обзоре виртуальных машин Cockpit. Либо выполните

    # virsh autostart vm1-el9

Использование virt-install для интерактивной установки с минимальными усилиями через командную строку

Этот тип установки использует параметр --cloud-init у virt-install без какого-либо значения или параметров. Такой подход приводит к генерации и отображению пароля root вскоре после начала установки, что позволяет выполнить однократный вход. Вам, конечно, нужно записать или скопировать его.

Помимо этого, конфигурация ограничивается настройкой и запуском интерфейсов Ethernet с поддержкой DHCP. Другие интерфейсы в основном определяются, но далее с ними не работают.

Дополнительная подготовка

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

  1. Скопируйте образ диска из пула установочных носителей в пул образов дисков и в качестве цели выберите предполагаемое имя виртуальной машины.

    $ sudo su -
    # cd /var/lib/libvirt/boot
    # cp CentOS-Stream-GenericCloud-9-20220315.0.x86_64.qcow2  ../images/vm2-el9.qcow2
  2. Проверьте размер диска и при необходимости скорректируйте его. По умолчанию около 10 ГиБ.

    # qemu-img  info   /var/lib/libvirt/images/vm2-el9.qcow2
    # qemu-img resize  /var/lib/libvirt/images/vm2-el9.qcow2  +10G

    Приведённый выше пример добавляет 10 ГиБ к общему размеру около 20 ГиБ.

    Вы также можете изменить размер виртуального диска позже. Поэтому сейчас нет причины планировать слишком щедро по размеру. Из-за формата qcow2 изменение размера не влияет на текущий размер файла образа. Он динамически корректируется по мере необходимости до указанного максимума.

Установка

Используйте окно терминала для выполнения

# virt-install  --name vm2-el9\
     --memory 2048  --cpu host --vcpus 2 --graphics none\
     --os-variant centos-stream9\
     --import  \
     --disk /var/lib/libvirt/images/vm2-el9.qcow2,format=qcow2,bus=virtio \
     --network type=direct,source=enp0s25,source_mode=bridge,model=virtio \
     --network bridge=virbr0,model=virtio  \
     --cloud-init

Параметры довольно описательны. Более подробное объяснение вы найдёте в приложении.

Вы увидите много вывода:

WARNING  Defaulting to --cloud-init root-password-generate=yes,disable=yes

Starting install...
Password for first root login is: YFlTBHprYYDh5gZ7
Creating domain...                                                                                            |    0 B  00:00:00

Running text console command: virsh --connect qemu:///system console vm2-el9
Connected to domain 'vm2-el9'
Escape character is ^] (Ctrl + ])

[    0.000000] Linux version 5.14.0-71.el9.x86_64 (mockbuild@x86-05.....
...
...
...
[  OK  ] Finished Execute cloud user/final scripts.
[  OK  ] Reached target Cloud-init target.
[  OK  ] Created slice Slice ...
[  OK  ] Started dbus-:1.2-org...

CentOS Stream 9
Kernel 5.14.0-71.el9.x86_64 on an x86_64

Activate the web console with: systemctl enable --now cockpit.socket

localhost login:

Установка заканчивается активным открытым терминалом в созданной виртуальной машине!

Войдите в учётную запись root, указав пароль, показанный в начале процесса установки (YFlTBHprYYDh5gZ7 в этом примере). Этот пароль одноразовый и должен быть заменён при первом входе.

Системные администраторы не из США: облачный образ обычно сначала настраивает клавиатуру США! Проще всего скопировать и вставить пароль. Ограничьте новый пароль совпадающими позициями клавиш, выберите довольно простой, чтобы минимизировать вероятность опечаток, и позже смените его на надёжный пароль после настройки клавиатуры.

Задачи после установки

Как обычно, и в информатике действует «закон сохранения энергии». Чем ниже усилия при установке, тем выше требования после установки.

  1. Системным администраторам не из США следует сначала настроить раскладку.

    1. Проверьте текущую конфигурацию локали

      # localectl
      System Locale: LANG=en_US.UTF-8
          VC Keymap: us
         X11 Layout: us
    2. Выведите список доступных раскладок клавиатуры, отфильтрованный по короткому коду вашей страны. Замените «de-» на код вашей страны, то есть «<КОД_СТРАНЫ>-»

      # localectl list-keymaps  | grep de-
      de-T3
      de-deadacute
      de-deadgraveacute
      de-deadtilde
      de-mac
      de-mac_nodeadkeys
      de-neo
      de-nodeadkeys
      ...
    3. Определите подходящую раскладку и примените её

      # localectl set-keymap de-nodeadkeys
      ...

      Настройка вступает в силу немедленно.

  2. Проверьте сетевое подключение

    # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ....
        ...
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
        link/ether ....
        altname enp1s0
        inet uuu.vvv.www.xxx/zz ......
        ...
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
        link/ether ....
        altname enp2s0
        inet uuu.vvv.www.xxx/zz ...
        ...

    Если DHCP был доступен для всех интерфейсов, отображается полная конфигурация интерфейсов.

    Проверьте подключение:

    # ping guardian.co.uk
    # ping <YOUR_EXTERNAL_DEFAULT_GATEWAY_ADDRESS>
    # ping 192.168.122.1  # your host system internal virtual network address

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

    Проверьте интерфейсные устройства.

    # nmcli dev
    DEVICE  TYPE      STATE      CONNECTION
    eth0    ethernet  connected  System eth0
    eth1    ethernet  connected  Wired connection 1
    lo      loopback  unmanaged  --

    Активная (авторитетная) конфигурация внешнего сетевого подключения находится в /etc/sysconfig/network-scripts/ifcfg-eth0. Файл /etc/NetworkManager/system-connections/ens3.nmconnection — это остаток от конфигурации системы по умолчанию до cloud-init. В настоящее время cloud-init придерживается устаревшего расположения в файловой системе. Постоянного файла конфигурации для внутреннего интерфейса к libvirt virbr0 нет. Конфигурация создаётся автоматически при каждом процессе загрузки.

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

    # nmcli con mod 'Wired connection 1' connection.id eth1

    Переименование запускает NetworkManager на создание файла /etc/sysconfig/network-scripts/ifcfg-eth1 с текущей конфигурацией.

    Если DHCP недоступен для внешнего интерфейса, файл конфигурации — это просто заготовка. Используйте утилиту NetworkManager nmcli, чтобы задать статическую конфигурацию.

  3. Если размер виртуального диска был изменён, необходимо скорректировать размеры разделов.

    # cfdisk  /dev/vda

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

    Затем измените размер файловой системы, если это ещё не сделано. Сначала проверьте размер файловой системы, например с помощью df.

    # df -h
    # resize2fs -p /dev/vda1
  4. Наконец, зададим имя хоста

    # ##hostnamectl set-hostname  VM_NAME.example.com
    # hostnamectl set-hostname  vm2-el9.example.com

Выйдите и закройте консоль, нажав <ctrl>+].

Вы можете перезагрузить виртуальную машину и затем снова проверить /var/lib/libvirt/dnsmasq/virbr0.status. Теперь там указано имя хоста, внутреннее разрешение имён теперь работает.

Если ваш внешний сервер DHCP также предоставляет динамический DNS, вы должны иметь возможность подключиться к вашей виртуальной машине из публичной сети:

# ping VM_NAME.example.com

Последнее действие — включить автозапуск виртуальной машины.

# virsh  autostart  VM_NAME

Теперь всё работает нормально, почти из коробки. Теперь вы начнёте детально настраивать виртуальную машину в соответствии с её предполагаемым использованием. Так же, как это требовалось бы после стандартной установки.

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

Заключение

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

Использование облачных базовых образов для создания установки виртуальной машины дистрибутива сопряжено с некоторыми неизбежными неудобствами и недостатками из-за различной природы этих технологий. Так что в производственном развёртывании вам, возможно, лучше подойдут выделенные образы виртуальных машин, если они доступны. Но для экспериментов и тестирования это должно быть жизнеспособно и уместно.

Приложение

Краткое объяснение используемых параметров virt-install

--name VM_NAME

Уникальное имя устанавливаемой виртуальной машины, отображаемое, например, в списке виртуальных машин

--memory 3074

Объём выделяемой памяти, скорректируйте по необходимости

--cpu host

тот же тип ЦП, что у хоста

--vcpus 3

число ЦП для виртуальной машины, скорректируйте по необходимости

--os-variant centos-stream9

Целевая операционная система. Скорректируйте дистрибутив и версию по необходимости

--import

Фиксированный, пропускает процедуру установки и загружается с первого (виртуального) диска, указанного первым параметром диска.

--graphics none

Фиксированный, обеспечивает перенаправление приглашения входа виртуальной машины в окно терминала хоста для немедленного доступа.

--disk /var/lib/libvirt/images/VM_NAME.qcow2, format=qcow2,bus=virtio

файл образа диска, скорректируйте VM_NAME

--network direct,source=enpXsY,source_mode=bridge, model=virtio

укажите внешнюю сеть (macvlan) первой, она получит имя eth0 как обычно. Скорректируйте имя интерфейса по необходимости.

--network bridge=virbr0,model=virtio

укажите внутреннюю сеть (мост, созданный libvirt) второй. Она получит имя eth1 как обычно.

--cloud-init

Работа с конфигурацией nocloud с использованием значений по умолчанию