Что делать, если у вас возникло желание или необходимость заняться разработкой под MacOS или iOS, но под рукой нет макбука, а покупать его только чтобы открыть Xcode кажется делом сомнительным? Недавно я столкнулся с такой проблемой в одном из своих пет-проектов и решил ее достаточно просто и быстро. После выполнения нескольких достаточно примитивных шагов, мне удалось запустить MacOS Monterey как на скриншоте ниже.

image

Никакого Virtualbox, никакого Virtual Machine Manager. Из требований — только 100 Гб свободного места на диске и хотя бы 16 Гб оперативной памяти. В рунете я встречал описание похожих путей установки, вроде Docker-OSX или Sosumi. Но я бы хотел поделиться способом, который позволяет использовать актуальную версию MacOS (Sosumi — сразу минус) и не потратить уйму свободного времени на возню с конфигами и терминалом. Поехали.

Для начала установим все необходимые пакеты и добавим себя в группу kvm и libvirt:

sudo apt-get install qemu uml-utilities virt-manager git wget libguestfs-tools p7zip-full make dmg2img -y
sudo usermod -aG kvm $(whoami)
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG input $(whoami)

Теперь склонируем репозиторий проекта OSX-KVM в домашнюю директорию пользователя:

cd ~
git clone --depth 1 --recursive https://github.com/kholia/OSX-KVM.git
cd OSX-KVM
git pull --rebase

Приступим к самой установке. Скрипт fetch-macOS-v2.py позволит скачать образ операционной системы желаемой версии:

./fetch-macOS-v2.py
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15)
4. Big Sur (11.7) - RECOMMENDED
5. Monterey (12.6)
6. Ventura (13)

Скрипт выведет список версий ОС и предложит ввести номер. К сожалению, так и не удалось запустить MacOS Ventura из того образа, который предоставляется репозиторием. Я бы рекомендовал установить Monterey, чтобы пользоваться современными версиями Xcode и других инструментов.

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

dmg2img -i BaseSystem.dmg BaseSystem.img

Следующий, третий, шаг в установке — создадим виртуальный жесткий диск. Желательный объем для установки — не меньше 100 Гб постоянной памяти, чтобы можно было не только установить виртуалку, но и что-то внутри нее.

qemu-img create -f qcow2 mac_hdd_ng.img 128G

Перед тем, как запустить последнюю команду — отредактируем скрипт OpenCore-Boot.sh.

Строчку:

ALLOCATED_RAM="4096" # MiB

Заменим на:

ALLOCATED_RAM="8192" # MiB

… чтобы использовать 8 Гб при запуске виртуальной машины, а не 4 Гб. При этом желательно, чтобы оперативная память виртуальной машины не превышала половины от общей RAM хоста.

Скорее всего, вам понадобится также закомментировать строку…

-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off

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

Все, теперь мы полностью готовы к финальной стадии. Запускаем скрипт ./OpenCore-Boot.sh в терминале, который выдаст нам окно Qemu.

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

Первым появится экран с тремя опциями, из которых выберем macOS Base System:

image

Далее вы увидите юзер-френдли терминал с тысячами строк белого текста на черном фоне — не переживайте, это так и должно быть…

image

Через буквально несколько секунд появится такая менюшка, в которой нужно перейти в Disk Utility:

image

В меню Utility в правой колонке выберем тот диск, который создали командой qemu-img. Самый простой признак — его размер будет больше 100 Гб. Здесь важно не ошибиться и не отформатировать не тот диск. Если это случится, придется начинать установку заново.

image

Переименовав диск и нажав Erase, закроем Disk Utility и вернемся к более раннему меню. После выбора Reinstall macOS Monterey нажимаем Agree и выбираем диск, который переименовали и отформатировали в Disk Utility:

image

image

image

Далее появится прогрессбар установки, заполнение которого может занимать много, очень много времени. Рационально отключить у ноутбука спящий режим и оставить его на ночь для успешной установки. После ее окончания вы еще раз увидите немного бегущего белого текста на черном фоне и затем долгожданный экран первоначальной настройки macOS Monterey:

image

Вот и все, дальнейшие действия — как при обычной настройке macOS. Может быть, существуют еще более простые способы запускать Monterey или даже Ventura из-под линуксового хоста, но этот показался наиболее оптимальным по затратам времени и усилий лично мне.
В заключение упомяну, что при запуске уже установленной виртуальной машины можно столкнуться с такой проблемой:

image

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

Комментарии (53)


  1. dlinyj
    18.05.2023 07:59
    +10

    Меня поражает мощь и блеск qemu, потрясающий инструмент. Спасибо большое за статью!


  1. cat_chi
    18.05.2023 07:59
    +52

    Никакого Virtualbox, никакого Virtual Machine Manager

    Сначала это...

    sudo apt-get install qemu uml-utilities virt-manager

    Затем это.
    Вы же в курсе, что virt-manager – это и есть Virtual Machine Manager? :)

    "Мы поставим virt-manager, но использовать его не будем, потому что..."

    Так почему?


    1. t3n3t
      18.05.2023 07:59

      .


  1. JohnDaniels
    18.05.2023 07:59
    +1

    1. А как там насчет прокинуть в macOS usb или bluetooth?
      Пробовал через https://github.com/foxlet/macOS-Simple-KVM, так и не удалось подружить с iPhone.

    2. Я правильно понимаю, что в xcode можно таким образом собирать и публиковать приложения для iOs?


    1. glider_skobb Автор
      18.05.2023 07:59
      +2

      Да, я отправляю билды приложений с такой виртуалки на айфон, все работает)

      Для этого в OpenCore-Boot.sh надо добавить строку:

      -device usb-host,bus=ehci.0,vendorid=0x05ac,productid=0x12a8,guest-reset=false,id=iphone

      Не погружался в подробности этих параметров, но vendorid это айдишник Apple, productid это айдишник для iPhone. Есть пара нюансов: после вставки шнура в порт USB нужно нажать Trust на телефоне до запуска виртуалки и второе - у меня не получалось использовать одновременно использовать проводную мышь и держать подключенный айфон. Видимо, если в другие USB-порты подключено что-то еще, оно перебивает шину. Но я не спец

      Подробнее можно почтитать здесь: https://github.com/arindas/mac-on-linux-with-qemu/issues/25


      1. ivanrt
        18.05.2023 07:59
        +4

        Я передаю целый USB порт - подключать и отключать можно что хочешь. Не очень известная опция: -device usb-host,hostbus=1,hostport=7,bus=usb.0

        lsusb даст понять какие есть bus и port на хосте, а опцию bus можно убрать или поставить тот который у вас задан в VM


  1. ev_i
    18.05.2023 07:59

    Как с производительностью решения? Есть видео как бегает xcode?


    1. General_Failure
      18.05.2023 07:59
      +11

      Для начала бы увидеть, как икскод на родном ябловском железе бегает


      1. ev_i
        18.05.2023 07:59
        +1

        Я запускал через VMWare из-под windows на i7-11370 + 32GBRAM и оно весьма тормозило.


        1. FreeNickname
          18.05.2023 07:59
          +5

          "Мне Мойша по телефону напел"


        1. ReadOnlySadUser
          18.05.2023 07:59

          "Весьма" - это очень мягко сказано :)


          1. nochkin
            18.05.2023 07:59

            Запускал под qemu (Proxmox) и вроде достаточно нормально работала. У меня виртуалка на своём отдельном SSD, который выделен только для OSX. Вроде как это даёт небольшой прирост к скорости на i/o.

            Вообще, XCode сама по себе не из торопливых приложений даже на родном железе. При возможности я кодил в VSC, а собирал и гонял тесты в XCode.


      1. Terimoun
        18.05.2023 07:59

        И как примерно он бегает?


        1. General_Failure
          18.05.2023 07:59
          +2

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

          Проблема усугубляется, когда в большом проекте очень грязный код - большие файлы, излишняя связанность, нет модификаторов доступа (то есть по умолчанию всё открыто) - индексирование проекта, автоподсказки, подсветка страдают. Правда и такого бардака, как в моём нынешнем проекте, я больше нигде не видел.


        1. aGGre55or
          18.05.2023 07:59

          Плохо бегает. Собирал хакинтош для целей звукозаписи и не только, и в целом он работал значительно производительней мака взятого за образец. Logic и Final Cut очень хорошо работали. Решил посмотреть ради интереса на Xcode, так вот он тормозил настолько, что всякие идеи тратить время в нём на перенос чего-нибудь в эко-систему macOS развеялись сразу. Надо очень любить мак чтобы этим пользоваться, а если ещё и на оригинальном железе...)


    1. vit9696
      18.05.2023 07:59
      +13

      Если не хотите, чтобы оно тормозило, надо пробрасывать дискретную GPU в виртуалку через VT-d.

      Также в упомянутом в статье репозитории неграмотно настроен эмулируемый процессор. С -cpu Penryn вместо host или хотя бы Haswell XNU будет загружать Mach-O только в режиме архитектуры x86_64, а не x86_64h, что приведёт к тому, что не во всех системных библиотеках будут работать оптимизации AVX 2.0, а это дополнительно снижает производительность.


      1. glider_skobb Автор
        18.05.2023 07:59

        Была бы дискретная видеокарта...

        У меня встроенная AMD Renoir, живём с тем, что есть


  1. SamOwaR
    18.05.2023 07:59
    +5

    Я бы рекомендовал установить Monterey, чтобы пользоваться современными версиями Xcode и других инструментов.

    Для последнего Xcode нужна Ventura. И только с последнего Xcode можно отправлять приложения в стор.


    1. dimakey
      18.05.2023 07:59
      +2

      В стор можно отправлять с Xcode 14.2 - он нормально на Monterey становится.


  1. Mitai
    18.05.2023 07:59
    +2

    OpenCore


  1. h1pp0
    18.05.2023 07:59

    А можете внутри Geekbench запустить? Интересно насколько производительность падает относительно хоста


    1. nochkin
      18.05.2023 07:59

      qemu -- достаточно хороший эмулятор в этом плане. Особенно если ставить cpu host, то вообще будет довольно близко.


  1. usrsse2
    18.05.2023 07:59
    +4

    > В заключение упомяну, что при запуске уже установленной виртуальной машины можно столкнуться с такой проблемой

    Это паника ядра, но вывод списка загруженных кекстов закрывает саму панику. Нужно в config.plist поставить PanicNoKextDump=YES (см. OpenCore Configuration.pdf), чтобы увидеть.


  1. falconandy
    18.05.2023 07:59
    +3

    Мне тоже понадобился XCode для эпизодических задач. Не помню, но какой-то первый нагугленный вариант с ходу не завелся. Потом нашел OneClick macOS Simple KVM. Ничего не настраивал вроде бы — только добавил ядер и памяти до 16ГБ и пару раз уже расширял диск. Устройства не пробрасывал, интеграцию с буфером обмена тоже не делал. Процессор со встройкой (AMD Ryzen 5700G), SSD.
    Особо вроде ничего не тормозит в XCode и AppCode. Единственное, что умирает на несколько секунд — это анимированная минимизация окна. Но так я делаю очень редко и лень искать, где что отключить.


    1. ArtRoman
      18.05.2023 07:59
      +4

      Единственное, что умирает на несколько секунд — это анимированная
      минимизация окна. Но так я делаю очень редко и лень искать, где что
      отключить.

      Посмотрите Системные настройки - Рабочий стол и Dock - Убирать в Dock с эффектом "Простое уменьшение", также могут помочь включение опций "Уменьшить движение", "Уменьшить прозрачность" в Универсальном доступе - Дисплей. Это помогает и для удалёнки, создаёт меньше перерисовок.


  1. cherv2
    18.05.2023 07:59
    -2

    Круто конечно в плане поюзать, но для разработки сомневаюсь что подойдёт, например запуститься ли Swift 5.8 c последними конкуренси абилками? Хотя под линукс он и компилится, но думаю на эмулятор такое не прокатит


    1. nochkin
      18.05.2023 07:59

      Наличие эмулятора на Swift 5.8 не влияет.


  1. Angel_of_Sorrow
    18.05.2023 07:59
    +1

    Но как обычно есть нюансы с работой аппстора на такой вируталке, и еще куча проблем. Оно неполноценно(например установка brew на такой машине с 16 ядрами + 48 рам занимало минут 20. Установка сертбота еще минут 40 из под этого brew), но для целей MacOS server или иного MDM решения вполне подойдет. Вполне аналогично разворачивается под проксмоксом кстати. Если не пробрасывать gpu становиться больно, причем что при прямом взаимодействии, что через vnc


  1. prefrontalCortex
    18.05.2023 07:59

    Статья пришлась очень кстати, как раз собирался заняться сборкой пет-проекта под макось.

    Подскажите, каким образом можно прокинуть видеокарту внутрь такой виртуалки? А то простое сворачивание окна с Geanie-эффектом всё намертво вешает на несколько секунд.


    1. Johan_Palych
      18.05.2023 07:59
      +1

      MacOS официально поддерживается в VMware Fusion и есть дрова с поддержкой графики 'VMware Tools on macOS - com.vmware.kext.VMwareGfx'
      Народ ставит бесплатный VMware Workstation Player. Патчит его. Ставит MacOS и VMwareTools. Все давно отработано. Материалов в сети масса.
      Есть и поддержка iCloud supported device


      1. vit9696
        18.05.2023 07:59
        +2

        В VMware Workstation Player есть драйвер только с софтварным рендерингом, и его производительность плюс-минус эквивалентна virtio gpu без ускорения, который используется в QEMU, тем более, что во втором случае драйвер писали вообще в Apple. Хардварный рендеринг с пробросом виртуальной GPU Metal работает же только на macOS Host или с пробросом реальной GPU через VT-d.


        1. Johan_Palych
          18.05.2023 07:59
          +2

          Лет 8-м использую на ноутах VMware Workstation Player с виртулками MacOS в походном(командировочном) варианте.
          Графикой доволен(darwin.iso darwinPre15.iso) да и сами машинки быстро бегают.
          На работе VMware Fusion.
          Ну а для дома Proxmox VE без MacOS
          Годная дока от Mr. Macintosh: List of Mac BoardID, DeviceID, Model Identifiers & Machine Models

          Хорошо работает и на AMD-ных процах:

          smc.version = "0"
          cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011"
          cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111"
          cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110"
          cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001"
          cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001"
          cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000"
          cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011"
          cpuid.1.edx = "0000:0111:1000:1011:1111:1011:1111:1111"
          smbios.reflectHost = "TRUE"
          hw.model = "MacBookPro14,3"
          board-id = "Mac-551B86E5744E2388"



  1. slonopotamus
    18.05.2023 07:59

    А вы же в курсе, что эти действия нарушают EULA, да?


    1. DerRotBaron
      18.05.2023 07:59

      С массой звёздочек и нарушением презумпции невиновности.
      Во-первых автор может запускать это на железе Apple, что легально до такой степени, что так работают в Штатах "облака маков".
      Во-вторых с 1280 ГК РФ можно и на не-яблочное железо попробовать "натянуть".
      Но автору бы не помешало добавить это в дисклеймер, и в корпоративной среде такие эксперименты лучше бы не ставить, если только это не забивший на международное право госсектор некоей неназванной страны


      1. slonopotamus
        18.05.2023 07:59
        +2

        Цитирую:

        под рукой нет макбука, а покупать его только чтобы открыть Xcode кажется делом сомнительным


        1. aGGre55or
          18.05.2023 07:59
          +1

          Если бы все разработчики читали EULA, то у пользователей macOS точно не было бы портов ПО и репозиториев типа Homebrew.


  1. klirichek
    18.05.2023 07:59

    Я думал, будет что-то вроде докера... Чтобы "прямо без виртуалок".
    А тут виртуалка, причём другая. В смысле, чтобы запустить - придётся сперва заглушить и выгрузить модули virtualbox.

    (по секрету: под макось можно собирать с помощью ванильного clang (начиная с 13-го). С консольными приложухами вообще "на ура". На любой платформе, хоть на raspberry pi)


    1. 13werwolf13
      18.05.2023 07:59
      +1

      А тут виртуалка, причём друга

      ну что значит "другая"?
      самая "родная" для linux и самая адекватная (настолько что именно на qemu/kvm работает большинство хостеров)

      ну а то что:

      придётся сперва заглушить и выгрузить модули virtualbox

      так это просто означает что вы зачем-то замусорили свою систему этими модулями


      1. klirichek
        18.05.2023 07:59

        Не "зачем-то замусорил" а активно пользуюсь. И поэтому если надо макось - запускаю виртуалку с ним там же.

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


    1. prefrontalCortex
      18.05.2023 07:59

      придётся сперва заглушить и выгрузить модули virtualbox.

      Зачем? Qemu прекрасно работает при загруженных модулях VirtualBox.


      1. klirichek
        18.05.2023 07:59

        Сам по себе - да, работает. Например, софтово arm эмулировать.

        Но как только ему нужен kvm (а без него смысла особого нет) - тут же всё заканчивается. По крайней мере несколько лет назад нужно было выбирать - либо kvm, либо vbox. Оба вместе не живут.


    1. falconandy
      18.05.2023 07:59

      Виртуалку virtualbox просто закрываю, после чего macOS в qemu нормально загружается. Kubuntu 22.04


      1. klirichek
        18.05.2023 07:59

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

        Когда-то так и делали - смотрели, чтобы не была запущена противоположная виртуалка, потом выгружали её модули, запускали свои и запускали свою виртуалку. И был выбор в определённый момент времени - либо работать с семейством qemu через kvm, либо с virtualbox через vbox. Оба одновременно, увы, не работали. Собственно, и сейчас не работают. Просто в тот момент, когда clang научился быть по-настоящему кросс-платформенным, надобность в этих всех виртуалках для сборки отпала (для тестов всё ещё нужны).


        1. falconandy
          18.05.2023 07:59

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


    1. Johan_Palych
      18.05.2023 07:59

      1. klirichek
        18.05.2023 07:59

        Да, очень давно эмулирует (но тут же статья, что оно "без всяких вот этих", якобы).

        И не может совместно с kvm. Что бы там ни писали на SO в вопросе 10-летней давности. Софтовая эмуляция - пожалуйста. А вот Intel-VT или AMD-V (тогда это имеет хоть какой-то смысл) - кто первый халат надел, тот и доктор.


  1. Marwin
    18.05.2023 07:59
    +1

    А с запуском на Hyper-V есть какие-нить новости? Понимаю, что вероятно можно собссно описанным выше методом в Hyper-V запустить что-то линуксовое, а там уже макось, но хотелось бы более прямолинейно.

    Есть некий проект https://github.com/acidanthera/MacHyperVSupport но там что-то ни разу не Далее-Далее-Profit даже для давнего гентушника ))


    1. vit9696
      18.05.2023 07:59
      +1

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


      1. Marwin
        18.05.2023 07:59

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


  1. diskreee
    18.05.2023 07:59

    Это возможно установить на WSL? Было бы классно иметь все 3 ОС на одной машине.


    1. glider_skobb Автор
      18.05.2023 07:59

      Да, вполне себе можно. Не могу сейчас найти конкретный пример, но с похожими технологиями: https://www.youtube.com/watch?v=BxBw16OCQME