Внимание, этот гайд предназначен для macOS хостов. Если у вас другой хост, некоторые настройки придётся переделывать!
Введение
В этой статье я буду использовать OpenCore (сокращённо OC) в качестве основного загрузчика и EDK II в качестве прошивки.
Для тех кто не знаком с OC советую почитать:
Также, здесь описана только установка версий 10.7-10.8, но в принципе эти инструкции довольно легко адаптировать под более новые версии.
Подготовка
Для папки с виртуальной машиной я обычно использую такую структуру:
🗂️ Имя виртуальной машины
📖 Firmware.rom (файл прошивки - edk2-x86_64-code.fd)
HD.qcow2 (образ жёсткого диска)
📀 Installer.dmg (образ установщика)
⚙️ run (скрипт запуска)
Settings.img (образ настроек NVRAM - edk2-i386-code.fd)
Сначала надо скачать образ установщика (советую вам использовать download manager, так как образ довольно увесистый), а затем скопировать .fd
файлы, которые лежат в /opt/homebrew/share/qemu
если вы устанавливали QEMU через Homebrew или в /usr/local/share
если собирали его сами.
Установщик, который вы скачали имеет следующую структуру:
🗂️ InstallMacOSX.dmg
🗜️ InstallMacOSX.pkg (архив в формате xar)
📄 Distribution (сценарий установки)
📦 InstallMacOSX.pkg (вложенный пакет)
🧾 Bom (метаданные)
📀 InstallESD.dmg (загрузочный образ)
PackageInfo
🗜️ Payload (остальные установочные данные)
⚙️ Scripts (скрипты пакета)
📁 Resources (ресурсы пакета)
Скопируйте загрузочный образ в папку виртуальной машины.
Установка OC
Теперь, когда мы подготовили основные компоненты, необходимо сделать образ ЖД и установить туда OpenCore.
Сначала скачиваем последний релиз OpenCore (я использовал 1.0.4
).
Затем нам понадобятся необходимые кекты: Lilu и VirtualSMC (остальные можно скачать по желанию). Я использовал релизы 1.7.0
для Lilu и 1.3.6
для VirtualSMC.
Как вы, возможно, заметили, все компоненты OC поставляются в виде двух версий: Release и Debug
Версия Debug отличается тем что там поддерживается логирования загрузки и выводится отладочная информация. Я советую именно её, по крайней мере до тех пор пока вы не отладите свою конфигурацию, и не убедитесь что ваша виртуальная машина работает идеально. Я же буду использовать Release версию.
Также нам понадобится инструмент GenSMBIOS для генерации серийных номеров и других полей. В принципе можно обойтись и без него, но это будет сложнее.
Стандартная структура OC такая:
🗂️ OpenCore-x.x.x-СБОРКА
📂 Docs
📄 Changelog.md (изменения новой версии)
📄 Configuration.pdf (документация параметров OpenCore)
Sample.plist (пример конфигурации)
📂 IA32 (32-битный загрузчик)
📁 EFI
📂 Utilities (полезные программы)
📂 X64 (64-битный загрузчик)
📁 EFI
Так как нам нужна 64-битная архитектура, копируем папку EFI
из каталога X64
в любое удобное место.
Структура папки EFI
примерно такова:
🗂️ EFI
📂 BOOT
⚙️ BOOTx64.efi (загрузчик)
📂 OC (настройки)
📁 ACPI (ACPI таблицы)
📁 Drivers (драйвера)
📁 Kexts (драйвера для OS X)
OpenCore.efi (главный исполняемы файл загрузчика)
📂 Resources (ресурсы OpenCanopy)
📁 Audio
📁 Font
📁 Image
📁 Label
📁 Tools (дополнительные программы)
Настройка OC
Разумеется из этих инструментов на понадобится далеко не всё. Можно смело удалять папки ACPI
и Resources
, а также файлы .contentVisibility
и .contentFlavour
из папки OC
. Также зайдите в папку Drivers
, и оставьте только следующие драйвера:
OpenHfsPlus.efi
OpenPartitionDxe.efi
OpenRuntime.efi
ResetNvramEntry.efi
Затем зайдите в папку Tools
и удалите всё кроме файла OpenShell.efi
.
Теперь перейдём к кекстам. Распакуйте архивы Lilu и VirtualSMC которые скачали. Извлеките файлы Lilu.kext
и VirtualSMC.kext
, и положите в папку Kexts
.
В итоге должна получится следующая структура (после -
обозначены бывшие имена фалов, не забудьте переименовать!):
🗂️ EFI
📂 BOOT
⚙️ BOOTx64.efi (загрузчик)
.contentVisibility (видимость раздела)
📂 OC (настройки)
📂 Drivers (драйвера)
🔧 Filesystems.efi (драйвер для HFS - OpenHfsPlus.efi)
🔧 Menu additions.efi (опция сброса NVRAM - ResetNvramEntry.efi)
🔧 Partition tables.efi (драйвер для схем разделов - OpenPartitionDxe.efi)
🔧 Runtime.efi (главный двигатель OpenCore - OpenRuntime.efi)
📂 Kexts (драйвера для OS X)
🧩 Lilu.kext (runtime для всех остальных кекстов)
🧩 Virtual SMC.kext (эмуляция SMC - VirtualSMC.kext)
OpenCore.efi (главный исполняемы файл загрузчика)
📂 Tools (дополнительные программы)
Shell.efi (программа командной строки - OpenShell.efi)
Таким образом, основная подготовка OpenCore закончена!
Генерация SMBIOS
Для начала нам понадобится данные SMBIOS, чтобы OS X корректно распознавала аппаратное обеспечение. Для этого откройте папку скачанного GenSMBIOS в терминале, и выполните следующую команду для запуска:
chmod +x GenSMBIOS.command
./GenSMBIOS.command
Выберите инструмент 3 и введите одну из следующих моделей (идентификатор указан в моноширным шрифтом):
iMac 2011, подходит для OS X Lion
iMac12,2
iMac 2012, подходит для OS X Mountain Lion
iMac13,2
Запишите 4 параметра:
Board serial
Apple ROM
Serial
SmUUID
Как закодировать Apple ROM в base64?
echo -n "Apple ROM" | xxd -r -p | base64
Просто поставьте свой Apple ROM в echo
.
Создание config.plist
Теперь осталось лишь сделать правильный конфиг (config.plist
).
Вот код config.plist (вы можете добавить или изменить что-то, либо использовать как есть):
<!-- config.plist -->
<plist>
<dict>
<key>Booter</key>
<dict>
<key>Quirks</key>
<dict>
<key>EnableSafeModeSlide</key>
<true/>
</dict>
</dict>
<key>UEFI</key>
<dict>
<key>ConnectDrivers</key>
<true/>
<key>Drivers</key>
<array>
<dict>
<key>Path</key>
<string>Runtime.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Partition tables.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Filesystems.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Menu additions.efi</string>
<key>Enabled</key>
<true/>
</dict>
</array>
<key>Input</key>
<dict>
<key>KeySupport</key>
<true/>
</dict>
<key>Quirks</key>
<dict>
<key>RequestBootVarRouting</key>
<true/>
</dict>
</dict>
<key>Misc</key>
<dict>
<key>Entries</key>
<array/>
<key>Boot</key>
<dict>
<key>ConsoleAttributes</key>
<integer>15</integer>
<key>PickerAttributes</key>
<integer>256</integer>
<key>PollAppleHotKeys</key>
<true/>
<key>ShowPicker</key>
<true/>
<key>Timeout</key>
<integer>5</integer>
</dict>
<key>Security</key>
<dict>
<key>AllowSetDefault</key>
<true/>
<key>DmgLoading</key>
<string>Any</string>
<key>ScanPolicy</key>
<integer>0</integer>
<key>SecureBootModel</key>
<string>Disabled</string>
<key>Vault</key>
<string>Optional</string>
</dict>
<key>Debug</key>
<dict>
<key>ApplePanic</key>
<true/>
<key>Target</key>
<integer>73</integer>
<key>DisplayLevel</key>
<integer>2147483650</integer>
</dict>
<key>Tools</key>
<array>
<dict>
<key>Name</key>
<string>UEFI Shell</string>
<key>Path</key>
<string>Shell.efi</string>
<key>Enabled</key>
<true/>
</dict>
</array>
</dict>
<key>NVRAM</key>
<dict>
<key>Add</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<dict>
<key>boot-args</key>
<string></string>
<key>run-efi-updater</key>
<string>No</string>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>boot-args</string>
</array>
</dict>
<key>WriteFlash</key>
<true/>
</dict>
<key>Kernel</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>BundlePath</key>
<string>Lilu.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/Lilu</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
<key>Arch</key>
<string>x86_64</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>BundlePath</key>
<string>Virtual SMC.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/VirtualSMC</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
<key>Arch</key>
<string>x86_64</string>
<key>Enabled</key>
<true/>
</dict>
</array>
<key>Emulate</key>
<dict>
<key>DummyPowerManagement</key>
<true/>
</dict>
<key>Scheme</key>
<dict>
<key>KernelArch</key>
<string>x86_64</string>
<key>FuzzyMatch</key>
<true/>
</dict>
</dict>
<key>PlatformInfo</key>
<dict>
<key>Automatic</key>
<true/>
<key>Generic</key>
<dict>
<key>MLB</key>
<string>Board serial</string>
<key>ROM</key>
<data>Apple ROM (base64 encoded)</data>
<key>SystemProductName</key>
<string>Type</string>
<key>SystemSerialNumber</key>
<string>Serial</string>
<key>SystemUUID</key>
<string>SmUUID</string>
</dict>
<key>UpdateDataHub</key>
<true/>
<key>UpdateSMBIOS</key>
<true/>
</dict>
</dict>
</plist>
Нужны пояснения?
<!-- config.plist -->
<plist>
<dict>
<key>Booter</key>
<dict>
<key>Quirks</key>
<dict>
<!-- Чтобы работал Safe mode -->
<key>EnableSafeModeSlide</key>
<true/>
</dict>
</dict>
<key>UEFI</key>
<dict>
<!-- Чтобы можно было загрузить драйвера -->
<key>ConnectDrivers</key>
<true/>
<key>Drivers</key>
<array>
<dict>
<key>Path</key>
<string>Runtime.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Partition tables.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Filesystems.efi</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>Path</key>
<string>Menu additions.efi</string>
<key>Enabled</key>
<true/>
</dict>
</array>
<key>Input</key>
<dict>
<!-- Чтобы в меню работала клавиатура -->
<key>KeySupport</key>
<true/>
</dict>
<key>Quirks</key>
<dict>
<!-- Чтобы работал выбор загрузочного диска из OS X -->
<key>RequestBootVarRouting</key>
<true/>
</dict>
</dict>
<key>Misc</key>
<dict>
<!-- Фикс для бага с .contentVisibility -->
<key>Entries</key>
<array/>
<key>Boot</key>
<dict>
<!-- Стиль XNU, яркий белый на чёрном -->
<key>ConsoleAttributes</key>
<integer>15</integer>
<!-- Restart идёт до Shut down -->
<key>PickerAttributes</key>
<integer>256</integer>
<!-- Чтобы работали горячие клавишы (например ⌘V) -->
<key>PollAppleHotKeys</key>
<true/>
<!-- Чтобы показывалось меню загрузки -->
<key>ShowPicker</key>
<true/>
<!-- Таймаут меню (в секундах) -->
<key>Timeout</key>
<integer>5</integer>
</dict>
<key>Security</key>
<dict>
<!-- Чтобы работала возможность поставить запись по умолчанию из меню (⌃⏎) -->
<key>AllowSetDefault</key>
<true/>
<!-- Возможность загружаться с неподписанных DMG -->
<key>DmgLoading</key>
<string>Any</string>
<!-- Чтобы показывались ВСЕ записи -->
<key>ScanPolicy</key>
<integer>0</integer>
<!-- Отключение Secure boot (10.8 его не поддерживает) -->
<key>SecureBootModel</key>
<string>Disabled</string>
<!-- Фикс для ошибки "OCS: No vault provided" -->
<key>Vault</key>
<string>Optional</string>
</dict>
<!-- Опции для отладки, игнорируются в Release сборке -->
<key>Debug</key>
<dict>
<!-- Сохранение паники в лог -->
<key>ApplePanic</key>
<true/>
<!-- Логирование, вывод в серийную консоль и сохранение в файл -->
<key>Target</key>
<integer>73</integer>
<!-- Логирование предупреждений и ошибок -->
<key>DisplayLevel</key>
<integer>2147483650</integer>
</dict>
<key>Tools</key>
<array>
<dict>
<key>Name</key>
<string>UEFI Shell</string>
<key>Path</key>
<string>Shell.efi</string>
<key>Enabled</key>
<true/>
</dict>
</array>
</dict>
<key>NVRAM</key>
<dict>
<key>Add</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<dict>
<!-- Можно добавить -v для отладки -->
<key>boot-args</key>
<string></string>
<!-- Чтобы обновление не попыталось перезаписать прошивку -->
<key>run-efi-updater</key>
<string>No</string>
</dict>
</dict>
<!-- Решение конфликта NVRAM -->
<key>Delete</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>boot-args</string>
</array>
</dict>
<!-- Чтобы работал выбор загрузочного диска из OS X -->
<key>WriteFlash</key>
<true/>
</dict>
<key>Kernel</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>BundlePath</key>
<string>Lilu.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/Lilu</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
<key>Arch</key>
<string>x86_64</string>
<key>Enabled</key>
<true/>
</dict>
<dict>
<key>BundlePath</key>
<string>Virtual SMC.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/VirtualSMC</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
<key>Arch</key>
<string>x86_64</string>
<key>Enabled</key>
<true/>
</dict>
</array>
<!-- Фикс для паники ядра на "AppleIntelCPUPowerManagment" -->
<key>Emulate</key>
<dict>
<key>DummyPowerManagement</key>
<true/>
</dict>
<key>Scheme</key>
<dict>
<key>KernelArch</key>
<string>x86_64</string>
<!-- Нужен для старых версий -->
<key>FuzzyMatch</key>
<true/>
</dict>
</dict>
<key>PlatformInfo</key>
<dict>
<!-- Нужен для того чтобы не пришлось указывать все параметры -->
<key>Automatic</key>
<true/>
<key>Generic</key>
<dict>
<!-- Нужны для iCloud -->
<key>MLB</key>
<string>Board serial</string>
<key>ROM</key>
<data>Apple ROM (base64 encoded)</data>
<!-- Чтобы OS X корректно распознавала АО -->
<key>SystemProductName</key>
<string>Type</string>
<key>SystemSerialNumber</key>
<string>Serial</string>
<key>SystemUUID</key>
<string>SmUUID</string>
</dict>
<!-- Чтобы настройки SMBIOS применялись -->
<key>UpdateDataHub</key>
<true/>
<key>UpdateSMBIOS</key>
<true/>
</dict>
</dict>
</plist>
НЕ ЗАБУДЬТЕ ПОДСТАВИТЬ КОРРЕКТНЫЕ ЗНАЧЕНИЯ SMBIOS В КОНФИГ!
Подготовка жёсткого диска
Сначала необходимо создать образ жёсткого диска. Желательно сделать образ размером в половину вашего реального жёсткого диска, но вы можете выбрать любой размер.
hdiutil create -size размерG HD.dmg
hdiutil attach -nomount HD.dmg
Далее посмотрите на вывод hdiutil
чтобы узнать куда он примонтировал диск. В дальнейших командах, diskX
, не забудьте заменить на реальную цифру!
diskutil eraseDisk JHFS+ "HD" diskX
diskutil mount diskXs1
diskutil mount diskXs2
Скопируйте EFI
папку в /Volumes/EFI
, а затем выполните последующие команды.
dot_clean {/Volumes/EFI,/Volumes/HD}
rm -rf {/Volumes/EFI,/Volumes/HD}/.*
hdiutil detach diskX
mv HD.dmg HD.img
qemu-img convert HD.img HD.qcow2 -O qcow2
rm HD.img
ВНИМАНИЕ! УБЕДИТЕСЬ ЧТО ЖЁСТКИЙ ДИСК ВАШЕГО КОМПЬЮТЕРА НЕ НАЗЫВАЕТСЯ HD
, ИНАЧЕ ВЫ МОЖЕТЕ СТЕРЕТЬ НЕКОТОРЫЕ ДАННЫЕ НА СВОЁМ КОМПЬЮТЕРЕ!
Создание run
Теперь, когда жёсткий диск и образ установщика подготовлены, осталось лишь написать скрипт запуска.
Однако сначала определим какая модель процессора соответствует выбранной модели ПК:
iMac 2011 →
SandyBridge
iMac 2012 →
IvyBridge
Вот код run (вы можете добавить или изменить что-то, либо использовать как есть):
#!/bin/zsh
sudo qemu-system-x86_64 \
-name "OS X Версия" \
-machine q35 \
-full-screen \
\
-drive if=pflash,file="Firmware.rom",readonly=true \
-drive if=pflash,file="Settings.img" \
\
-hda "HD.qcow2" \
-cdrom "Installer.dmg" \
\
-cpu Процессор,+sse4.1 \
-m оперативная памятьG \
-smp сумма ядер и потоков,cores=ядра,threads=потоки \
\
-device ich9-usb-uhci1 \
-device usb-mouse \
-device usb-kbd \
\
-device usb-audio,audiodev=audio \
-device e1000,netdev=network \
\
-audiodev id=audio,driver=coreaudio \
-netdev id=network,type=vmnet-shared \
\
-accel hvf/tcg (в зависимости от того что поддерживается)
Нужны пояснения?
#!/bin/zsh
# sudo нужно для корректной работы VMNet
sudo qemu-system-x86_64 \
# Имя виртуальной машины которое будет отображаться над окном
-name "OS X Версия" \
# Современный чипсет
-machine q35 \
# Во весь экран, для поноты ощущений
-full-screen \
\
# Прошивка и NVRAM
-drive if=pflash,file="Firmware.rom",readonly=true \
-drive if=pflash,file="Settings.img" \
\
# Жёсткий диск и DVD установщика
-hda "HD.img" \
-cdrom "Installer.dmg" \
\
# sse4.1 необходим для OS X
-cpu Penryn,+sse4.1 \
# Оперативная память и количество ядер/потоков
-m оперативная памятьG \
-smp сумма ядер и потоков,cores=ядра,threads=потоки \
\
# UHCI нужен чтобы работало USB Audio, а XHCI не работает в OS X
-device ich9-usb-uhci1 \
# USB мышка и клавиатура
-device usb-mouse \
-device usb-kbd \
\
# USB аудио (единственная аудиокарта работающая в OS X без драйверов)
-device usb-audio,audiodev=audio \
# Сетевая карта Gigabit Ethernet, работает нативно
-device e1000,netdev=network \
\
# Подключение аудио и сети к хосту, VMNet даёт реальный MAC и IP адреса
-audiodev id=audio,driver=coreaudio \
-netdev id=network,type=vmnet-shared \
\
# HVF это аппаратное ускорение, но если он недоступен, запаситесь терпение и включите TCG
-accel hvf/tcg (в зависимости от того что поддерживается)
НЕ ЗАБУДЬТЕ ПОДСТАВИТЬ КОРРЕКТНЫЕ ЗНАЧЕНИЯ В КОНФИГ!
БОНУС
Если у вас получилось установить OS X по этой статье, то вы наверняка успели столкнуться со следующей ошибкой: TLS handshake failed
(или если вы не лезли глубоко в систему: Safari cannot open this page
).
Это происходит из-за того что со времён тех версий OS X которые мы с вами ставили прошло много времени, и протоколы шифрования (вроде TLS 1.1) успели поменяться на более новые (как TLS 1.3), а поддержка старых протоколов была депрецирована.
Также, даже если вам удасться решить эту проблемы в столкнётесь с проблемой сертификатов, когда браузер будет утверждать что сайт не безопасен (что происходит из-за устаревшей базы сертификатов). Это уже не такая помеха как предыдущая ошибка, но также может раздражать.
Обе эти проблемы решает инструмент Legacy Mac Proxy. Он устанавливается из .pkg
установщика и в конце говорит какие шаги сделать в настройках чтобы его активировать.
Немного подробностей
Legacy Mac Proxy это MiTM (main in the middle) сервер, основанный на локальной версии прокси под названием Squid. Он делает сразу две вещи:
Перехватывает HTTPS соединения, дешифрует современные протоколы, а потом шифрует их обратно с помощью более старого алгоритма (зависит от версии OS X)
Добавляет свой коренной сертификат в Keychain Access и устанавливает к нему доверие, что позволяет избежать проблемы с устаревшей базой сертификатов
Также, прошу заметить, что некоторые браузеры (например Firefox) недоверяют системным сертификатам, потому потребуется экспортировать сертификат Squid из Keychain Access в .cer
формат, а затем импортировать его в браузер и установить к нему доверие вручную.
Заключение
Вот и всё, осталось только запустить run. Однако необходимо помнить, что его нужно запускать из той же папки, где он находится, иначе возникнут ошибки. Открепить ВМ от терминала можно добавив & disown
к ./run
.
Ну а если вы хотите настроить разрешение экрана виртуальной машины, можете нажать F2
при запуске UEFI, зайти в Device Manager → OVMF Platform Configuration, изменить там разрешение, и нажать F10
чтобы сохранить изменения. Не забудьте перезагрузиться!
Также помните, что форматировать диск в Disk Utility нельзя: во-первых, потому что он полностью готов к установке, а во-вторых, потому что там находится OpenCore.
P. S. Если у вас возникнут проблемы или вопросы, пишите в комментарии!