UTM стала одним из самых популярных решений для виртуализации на macOS благодаря своей простоте и гибкости. Несмотря на удобный графический интерфейс, у многих пользователей возникает необходимость автоматизировать процесс создания виртуальных машин, особенно если речь идёт о развертывании большого количества окружений или интеграции с другими инструментами. К сожалению, официальная поддержка создания виртуальных машин через командную строку отсутствует, однако существует возможность реализовать этот процесс самостоятельно, используя комбинацию стандартных утилит macOS и возможностей UTM. Данное руководство поможет пошагово разобраться, как создать виртуальную машину UTM с помощью CLI, используя Apple Virtualization backend на примере Arch Linux. Для начала важно отметить, что весь процесс тестировался на UTM версии 4.
4.3 и macOS 14.0 Sonoma, поэтому рекомендуется использовать схожие версии для стабильной работы и избежать возможных несовместимостей. Автоматизация создания виртуальной машины начинается с подготовки необходимых инструментов. Помимо самого приложения UTM, требуются стандартные системные утилиты, такие как uuidgen для генерации уникальных идентификаторов, PlistBuddy для работы с plist-файлами конфигурации, swift для выполнения кода на Swift, а также hdiutil для создания и управления образами дисков.
Все они по умолчанию присутствуют в macOS. Основной сложностью является корректная генерация и привязка уникальных идентификаторов, так как UTM использует uuid версии 4 для большинства учетных записей, а для Apple Virtualization backend необходимо создать специальный машинный идентификатор, кодируемый с помощью Swift. Генерация UUID помогает системе однозначно идентифицировать виртуальные машины и их компоненты, предотвращая конфликты и ошибки загрузки. Определение имени виртуальной машины происходит на раннем этапе и влияет на структуру каталогов, где будут храниться все файлы и настройки. Желательно выбирать человекочитаемые и уникальные названия, чтобы облегчить дальнейшее администрирование.
После определения имени генерируются UUID для самой виртуальной машины и для устройства хранения данных. Следующий важный шаг — это запуск Swift REPL для создания уникального Apple виртуального идентификатора. Этот процесс включает выполнение простого Swift-кода, который использует Virtualization framework для генерации объекта VZGenericMachineIdentifier, а затем кодирует его в формате plist. Полученный файл считывается и конвертируется в формат, пригодный для вставки в конфигурацию виртуальной машины UTM. Создание виртуальной машины в UTM представляет собой процесс создания так называемого bundle — папки с определённой структурой, где хранятся все необходимые файлы для запуска виртуальной машины.
Сначала создаётся базовая структура каталогов, включая папку Data для хранения всех бинарных и конфигурационных файлов. Ключевым компонентом является файл config.plist, который описывает параметры виртуальной машины, такие как архитектура, количество CPU, размер памяти, параметры загрузки, подключённые устройства и многое другое. Для изменения и установки параметров в этом файле применяется утилита PlistBuddy. С её помощью последовательно добавляются все нужные ключи и значения, начиная с описания serial-порта для подключения терминала и заканчивая настройками backend-а Apple Virtualization.
В конфигурации обязательно указывается архитектура виртуальной машины — в нашем случае aarch64 (ARM 64-бит), количество процессорных ядер и объём оперативной памяти для стабильной работы гостевой системы. Особенное внимание уделяется настройкам загрузки: виртуальная машина загружается с использованием внешнего ядра Linux и initramfs. В качестве путей указываются скачанные ранее изображения ядра и ramdisk, загружаемые из надёжных источников. Ядро и initramfs скачиваются с сайта archboot.net, что гарантирует актуальность и поддержку ARM архитектуры.
Для конфигурации виртуализации задаются параметры, включающие поддержку указателя мыши, клавиатуры, звука, Entropy, Rosetta для совместимости с приложениями x86, а также функции, связанные с сетевой безопасностью и обменом данными между хостом и виртуальной машиной. Метаданные UTM заполняются с указанием иконки, названия виртуальной машины и уникального UUID, что позволяет визуально отличать и оперативно управлять виртуальными машинами внутри приложения. Важно отметить, что пока что через CLI невозможно добавить сетевые устройства, поэтому эту часть необходимо сделать вручную в графическом интерфейсе UTM. Это связано с особенностями настройки виртуальных сетевых адаптеров под macOS и спецификой backend-а. Для хранения виртуального диска создаётся образ размером 60 ГБ с помощью утилиты hdiutil.
Формат создаваемого файла — IMG, что отвечает требованиям и соглашениям UTM. После создания образа диск переименовывается в соответствии с уникальным UUID, чтобы потом правильным образом подключаться к виртуальной машине. В конце всех шагов импортируется созданный bundle в UTM путём открытия папки с виртуальной машиной через команду open. После этого в приложении UTM должна появиться новая машина. Если все настройки корректны, её можно запустить, а после добавления сетевого адаптера через GUI — полноценная виртуальная машина будет готова к использованию.
Данный метод хоть и не является официально поддерживаемым, но позволяет значительно упростить и ускорить процесс создания виртуальных машин для опытных пользователей и системных администраторов. Кроме того, основываясь на этом подходе, возможно модифицировать конфигурацию и для других операционных систем и архитектур, например, для QEMU, macOS или других дистрибутивов Linux. Важно помнить, что автоматизация через CLI требует аккуратности, так как малейшая ошибка в конфигурации plist-файлов может привести к сбоям при запуске. Рекомендуется тщательно проверять логи UTM и экспериментировать в безопастном окружении перед использованием в продуктивных целях. Наличие готового скрипта для генерации виртуальных машин открывает новые горизонты для DevOps-команд, исследователей и всех, кому необходим быстрый и программируемый доступ к виртуальному окружению.
Такой подход хорошо вписывается в CI/CD процессы и облегчает управление большим количеством виртуальных образов. При наличии нужных знаний и навыков можно расширить возможности автоматизации, интегрируя добавление сетевых устройств через GUI с помощью AppleScript или аналогичных средств автоматизации macOS. Таким образом, даже без официальной поддержки CLI со стороны UTM, существует эффективный способ создания и настройки виртуальных машин на базе Apple Virtualization. Вышеописанный пример с Arch Linux демонстрирует базовый путь и позволяет кастомизировать параметры под любые требования. Не стоит забывать и о регулярных обновлениях UTM и macOS, которые могут повлиять на работоспособность созданных конфигураций, поэтому рекомендуется отслеживать изменения и адаптировать скрипты под новые версии.
В итоге, создание виртуальной машины UTM через командную строку на macOS — задача выполнимая и очень полезная при грамотном подходе. Это ощутимо экономит время и силы, позволяя получить мощный инструмент для виртуализации и тестирования в удобном формате.