Главная развилка Apple Silicon: виртуализация против эмуляции
Зафиксируем фундамент, иначе дальше будет каша. Виртуализация - это когда гостевая ОС той же архитектуры, что и хост, исполняет свой код прямо на железе через аппаратный гипервизор. Чип M-серии умеет это для ARM64-гостей, и накладные расходы минимальны - проценты, а не разы. Эмуляция - это когда чужую архитектуру (x86_64) интерпретирует или JIT-транслирует софт. Это медленно: замедление в разы, иногда в десять и более.
Из этого следует всё остальное. На Apple Silicon ты можешь:
- быстро запускать ARM64-Linux (Ubuntu arm64, Fedora aarch64, Debian arm64) - нативная скорость;
- быстро запускать Windows 11 on ARM (ARM64-сборка Windows) - нативная скорость;
- быстро запускать гостевой macOS (тоже ARM64) - нативная скорость;
- медленно эмулировать x86_64-Linux и x86_64-Windows целиком - через QEMU TCG.

Virtualization.framework: нативный фундамент Apple
Под всеми удобными приложениями лежит Apple Virtualization framework (он же VZ, доступен с macOS 11, на Apple Silicon раскрылся полностью). Это высокоуровневый API поверх низкоуровневого Hypervisor.framework. Hypervisor даёт голые примитивы доступа к аппаратной виртуализации; Virtualization.framework собирает из них готовую VM: виртуальные CPU, память, диск, сеть, консоль, проброс папок. Apple официально декларирует две вещи, которые VZ умеет на Apple Silicon: запускать macOS-гостей и запускать Linux-гостей. Windows в список не входит - его VZ официально не поддерживает, и это причина, почему Windows почти всегда идёт через сторонние движки.
Ключевые возможности VZ, которые ты увидишь в любой обёртке:
- Virtio-устройства - стандартные паравиртуальные диск, сеть, консоль, GPU, entropy. Гость с virtio-драйверами (любой свежий Linux) получает быстрый ввод-вывод;
- VirtioFS - общая папка между хостом и гостем без SMB/NFS, монтируется как файловая система;
- Rosetta-устройство - проброс трансляции x86 внутрь Linux-гостя (об этом отдельная секция);
- лимит на macOS-гостей - лицензия Apple разрешает запускать одновременно не более двух копий гостевого macOS на одном хосте. Это не техническое, а юридическое ограничение, но обёртки его соблюдают.
Код: Выделить всё
$ ls /System/Library/Frameworks/Virtualization.framework
Modules Resources Versions Virtualization
$ sw_vers
ProductName: macOS
ProductVersion: 26.0
BuildVersion: 25A...
Готовые движки: UTM, Parallels, VMware Fusion, Tart
Теперь по инструментам, потому что выбор тут не вкусовщина, а следствие задачи.
UTM - бесплатный опенсорс, GUI поверх двух движков сразу. Это его суперсила и источник путаницы. UTM mac умеет работать в двух режимах:
- Apple Virtualization (VZ) - быстрый нативный режим для ARM64-Linux и macOS-гостей;
- QEMU - универсальный режим, где QEMU использует Hypervisor.framework для ARM-нативной скорости ИЛИ чистую эмуляцию TCG для чужой архитектуры (x86 на ARM и наоборот).
Код: Выделить всё
$ brew install --cask utm
==> Installing Cask utm
==> Moving App 'UTM.app' to '/Applications/UTM.app'
utm was successfully installed!
VMware Fusion - после изменения политики Broadcom бесплатен для личного использования (и коммерческого тоже, без отдельной лицензии для базовой редакции). Зрелый, привычный админам VMware, на Apple Silicon крутит ARM-гостей через свой гипервизор. Хорош, если у тебя уже экосистема VMware и нужен знакомый формат.
Tart - CLI-инструмент от Cirrus Labs поверх Virtualization.framework, заточенный под CI и автоматизацию. Никакого GUI: ты тянешь готовый образ macOS или Linux из OCI-реестра (как Docker-образ), клонируешь и запускаешь. Это де-факто стандарт для сборок iOS/macOS на ферме маков.
Код: Выделить всё
$ brew install cirruslabs/cli/tart
$ tart clone ghcr.io/cirruslabs/macos-sequoia-base:latest seq
$ tart run seq
Сводка выбора движка:
- разработка под ARM-Linux, эксперименты, бесплатно - UTM (VZ-режим) или Tart;
- Windows на mac каждый день, нужен комфорт - Parallels;
- привычный VMware, личное использование - VMware Fusion;
- CI, фермы, автоматика, образы как код - Tart;
- надо именно эмулировать x86-ОС целиком - UTM в режиме QEMU (и терпение).
Тут больше всего мифов. На Apple Silicon ты ставишь не привычный x86-Windows, а Windows 11 on ARM - официальную ARM64-редакцию Microsoft. Она ставится в Parallels автоматически, в UTM - вручную (берёшь ARM64-образ Windows, создаёшь VM в VZ или QEMU-ARM режиме). Эта ARM-Windows на M-чипе летает почти как родная.
Дальше двухслойная трансляция, и её надо понимать, иначе ожидания разойдутся с реальностью. Внутри ARM-Windows есть собственный эмулятор от Microsoft, который на лету транслирует x86 и x86_64 Windows-приложения в ARM64. То есть твой старый x64-инсталлятор запустится - но через прослойку трансляции Windows, со своей просадкой. Получается стек: Mac (ARM-железо) -> гипервизор -> Windows on ARM (нативно) -> эмулятор x86 внутри Windows (для старого софта). Это работает для массы приложений, но тяжёлые x86-программы и особенно игры с античитами или специфичными драйверами могут не пойти.
Альтернатива - эмулировать x86-Windows целиком через QEMU в UTM. Тогда транслируется всё, включая ядро ОС, и скорость падает в разы: для разовой проверки сойдёт, для работы - нет. Практический вывод: на mac в 2026 правильный Windows - это ARM-сборка, а совместимость со старым x86-софтом закрывается встроенным эмулятором Windows, а не эмуляцией всей машины.
Rosetta внутри Linux-VM: x86-бинари без тормозов
Самая недооценённая фича. Rosetta 2 ты знаешь как транслятор x86-приложений macOS. Но Apple разрешает пробросить Rosetta внутрь Linux-гостя через Virtualization.framework. Результат почти магический: ARM64-ядро Linux, но x86_64-бинари в нём исполняются с близкой к нативной скоростью, потому что их транслирует не QEMU, а Rosetta - тот самый быстрый Apple-транслятор.
Зачем это нужно: ты на M-чипе, а тебе надо собрать или запустить x86_64-докер-образ, который не имеет ARM-сборки, или прогнать legacy x86-бинарь. Без Rosetta это эмуляция QEMU (медленно). С Rosetta - быстрая трансляция.
Как это выглядит в Linux-госте. Хост (через UTM в VZ-режиме или Tart) пробрасывает Rosetta как virtiofs-устройство с тегом rosetta. В гостевом Linux ты монтируешь его и регистрируешь как обработчик x86-бинарей через binfmt_misc:
Код: Выделить всё
# внутри Linux-гостя: монтируем проброшенную Rosetta
$ sudo mkdir -p /media/rosetta
$ sudo mount -t virtiofs rosetta /media/rosetta
# регистрируем как интерпретатор для x86_64-ELF
$ echo ':rosetta:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xfe\xfe\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/media/rosetta/rosetta:OCF' \
| sudo tee /proc/sys/fs/binfmt_misc/register
Код: Выделить всё
$ uname -m
aarch64
$ file ./hello-x86
./hello-x86: ELF 64-bit LSB executable, x86-64 ...
$ ./hello-x86
Hello from x86_64 on ARM via Rosetta!
Когда VM, когда контейнер, когда нативно
Не каждую задачу надо решать виртуалкой. Иерархия по весу:
- Нативно - если софт есть под macOS (через Homebrew, .app, бинарь arm64). Ноль накладных расходов. Сначала всегда проверяй, нет ли нативной версии;
- Контейнер - если нужна изоляция окружения и Linux-userspace, но не другое ядро как самоцель. Docker Desktop, OrbStack или нативный Apple container CLI (нативные Linux-контейнеры на Apple Silicon, появились в 2025). Контейнер легче VM: общее ядро (точнее - одно лёгкое Linux-ядро на все контейнеры), секунды на старт, мало памяти. Идеально для разработки и CI сервисов;
- Виртуалка - когда нужно именно другое ядро или другая ОС целиком: тестировать инсталлятор Windows, дёргать модули ядра Linux, держать гостевой macOS под CI, проверять поведение под конкретным дистрибутивом с его ядром. VM тяжелее: гигабайты памяти, десятки секунд на загрузку, полноценная ОС внутри.
Типичные грабли
- Ставят x86-Windows на M-чип и удивляются тормозам. На Apple Silicon бери Windows 11 on ARM, а не x64-образ. x86 целиком - это эмуляция;
- Путают режимы UTM. Создал Linux-VM в QEMU-эмуляции вместо Apple Virtualization - и получил эмуляцию там, где могла быть нативная скорость. Для ARM-гостя выбирай VZ-режим;
- Ждут x86-Linux-гостя нативно. Его нет: либо медленный QEMU TCG для всей машины, либо ARM-гость с Rosetta для отдельных x86-бинарей. Это разные вещи;
- Забывают про лимит двух macOS-гостей. Третий не стартует - это лицензия Apple, а не баг;
- Качают UTM из App Store и думают, что переплатили. Версия идентична бесплатной с getutm.app, оплата - это поддержка проекта;
- Rosetta в Linux без TSO. Работает, но медленнее, чем могла бы; на кастомных ядрах включают TSO;
- Мало ресурсов гостю. Дал VM 2 ГБ и одно ядро - получил тормоза не из-за виртуализации, а из-за голодания. Apple Silicon с единой памятью щедро делится, не жмись.
- Поставь UTM каской: brew install --cask utm и убедись, что приложение в /Applications;
- Скачай ARM64-образ свежей Ubuntu Server (aarch64). В UTM создай VM в режиме Apple Virtualization (Virtualize, не Emulate), дай ей 4 ГБ и 4 ядра, подцепи ISO, поставь систему;
- После установки внутри гостя выполни uname -m - убедись, что aarch64, и замерь, насколько быстро грузится система (это нативная скорость);
- Поставь Tart: brew install cirruslabs/cli/tart, склонируй базовый Linux-образ и запусти tart run - сравни путь через CLI с GUI UTM;
- (Продвинуто) В Ubuntu-госте смонтируй проброшенную Rosetta через virtiofs, зарегистрируй binfmt_misc и запусти любой x86_64-бинарь. Сравни время с тем же бинарём под чистой QEMU-эмуляцией;
- Для контраста создай в UTM вторую VM в режиме Emulate с x86_64 и загрузись в неё - почувствуй разницу в скорости своими руками.
- Почему ARM64-Linux на M-чипе работает быстро, а x86_64-Linux целиком - медленно? В чём разница между виртуализацией и эмуляцией?
- Поддерживает ли Virtualization.framework официально запуск Windows? Через что тогда обычно идёт Windows на mac и какую редакцию ты ставишь?
- Как Rosetta помогает внутри Linux-VM и почему это быстрее, чем QEMU? Что показывает uname -m в таком госте и почему x86-бинарь всё равно запускается?
- Дана задача - запустить Linux-сервис для разработки. Когда хватит контейнера, а когда нужна полноценная VM?
На Apple Silicon вся виртуализация mac крутится вокруг одной границы: ARM нативен и быстр, x86 - всегда трансляция. Virtualization.framework даёт нативный фундамент для Linux и macOS-гостей, а UTM, Parallels, VMware Fusion и Tart - разные двери к нему под разные задачи. Windows ставится ARM-сборкой, старый x86-софт внутри неё тянет встроенный эмулятор Windows. Rosetta пробрасывается в Linux-гость и даёт быстрые x86-бинари на ARM-ядре. И главное: прежде чем поднимать виртуалку, спроси себя - может, хватит контейнера или вообще нативной программы.