Сегодня хочу поделиться с вами способом создания Qemu-KVM виртуальной машины с OSX 10.8.2 в качестве гостевой операционной системы.
Итак приступим!
Нам понадобится CPU и материнская плата c поддержкой VT-x и VT-d. В моем случае - это ASRock Z77 Exreme 6 с процессором Intel Core i5 3470. Так же для работы с qemu-kvm необходим установленный дистрибутив Linux (например я использую Arch Linux).
Так как у меня не получилось запустить OSX с помощью штатного пакета qemu-kvm в составе Arch Linux, я решил попробовать собрать самостоятельно более новую версию Qemu версии 1.3.1.
yaourt -S celt spice cegui-0.6 texi2html
cegui-0.6 - для успешной сборки необходимо добавить в PKBUILD lua51 в зависимости сборки
wget
http://wiki.qemu.org/download/qemu-1.3.1.tar.bz2
(md5: 5dbc6c22f47efca71dfaae0dd80dcf9e)
tar -jxvf qemu-1.3.1.tar.bz2 qemu
cd qemu
./configure --python=/usr/bin/python2 --sysconfdir=/etc --enable-kvm --audio-drv-list=pa,alsa,sdl --audio-card-list=ac97,sb16,es1370,hda --enable-spice --enable-vhost-net --enable-guest-agent --enable-mixemu --libexecdir=/usr/lib/qemu --target-list=i386-softmmu,x86_64-softmmu,arm-softmmu,i386-linux-user,x86_64-linux-user,arm-linux-user,armeb-linux-user --enable-docs
make
make install
Далее мы соберем seabios из git для устранения бага с крахом окна "about this mac":
yaourt -S iasl git wget
export LANG=en_US.UTF-8
git clone git://git.seabios.org/seabios.git
wget
http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/seabios-mac-20121206.patch
nano seabios-mac-20121206.patch #Тут нам понадобится немного отредактировать содержимое файла, удалив все до 60 строки.
cd seabios
patch -p1 < ../seabios-mac-20121206.patch
make #у меня появилась необходимость сделать ln -s /usr/bin/python2 /usr/bin/python
su -c 'cp out/bios.bin /usr/share/qemu' #удалите или создайте резервную копию оригинального bios.bin, если это необходимо
(готовый PKGBUILD qemu.install seabios.bin qemu-1.3.1.pkg.tar.xz)
https://docs.google.com/file/d/0B6OXm8m4bGkWSDI0YlhjV0tOUTA/edit
https://docs.google.com/file/d/0B6OXm8m4bGkWMFZva04wR214LTQ/edit
https://docs.google.com/file/d/0B6OXm8m4bGkWYjJmbFdvOF9sNVE/edit
https://docs.google.com/file/d/0B6OXm8m4bGkWejc1ay1VV0VwOXc/edit
Теперь установим libvirt и вспомогательные утилиты для удобства управления нашими виртуальными машинами:
yaourt -S libvirt
systemctl enable libvirtd.service
yaourt -S spice-gtk gtk-vnc-git gnome-common automake-1.12
во время сборки gtk-vnc-git вы можете отредактировать PKGBUILD и удалить все зависимости
gtk3, если есть такая необходимость
yaourt -S virt-viewer #LANG=en_US.UTF-8 в PKGBUILD
для включения поддержки IOMMU в /etc/default/grub добавить
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
grub-mkconfig -o /boot/grub/grub.cfg
nano /etc/mkinitcpio.conf
MODULES="tun bridge kvm kvm-intel pci-hotplug pci-stub"
mkinitcpio -p linux
nano /etc/modprobe.d/modprobe.conf
blacklist radeon/nouveau/snd-hda-codec-hdmi... #(здесь вам необходимо заблокировать загрузку модулей ядра тех устройств, которые вы планируете пробрасывать в виртуальную машину)
Перезагрузите компьютер
На этом настройка хост-системы закончена.
-----------------------------------------------------------------------------------------------------------
Для создания установочного образа с OSX 10.8.2 нам понадобится оригинальный образ OSX и Chameleon.pkg.
http://www.insanelymac.com/forum/topic/277015-guide-installing-mountain-lion/
http://forum.appleinsider.ru/topic/1634-sozdaem-ustanovochnii-disk-s-os-x-lion/
------------------------------------------------------------------------------------------------------------
Содержимое папки /Extra/Extensions у меня получилось следующим:
ACHIPortInjector.kext
AppleACPIPS2Nub.kext
ApplePS2Controller.kext
ApplePS2Keyboard.kext
ApplePS2Mouse.kext
ATAPortInjector.kext
FakeSMC.kext
IOACHIBlockStorageInjector.kext
NullCPUPowerManagement.kext
SuperIOFamily.kext
virtio-net.kext
Профиль smbios: MacPro3,1
Параметры загрузки Chameleon:
CSTUsingSystemIO=Yes
EnableC3State=Yes
EthernetBuiltIn=Yes
ForceHPET=Yes
GUI=No
GenerateCStates=Yes
GeneratePStates=Yes
Graphics Mode=1280x800x32
Kernel Flags npci=0x2000 darkwake=0
Legacy Logo=Yes
PciRoot=1
QuietBoot=Yes
RestartFix=No
SystemType=1
USBBusFix=Yes
Дополнительные используемые мной утилиты в /Extra/Utils:
Chameleon Wizard
Chameleon-2.1svn-2069.pkg
Kext Utility
lspci V1.1
Multibeast 5.1.3-1
ShowHiddenFiles
https://docs.google.com/file/d/0B6OXm8m4bGkWd3dpSkVZbzIybms/edit - все необходимое ~ 30Mb
------------------------------------------------------------------------------------------------------------
yaourt -S dmg2img #сконвертируем установочный образ OSX в .img (dmg2img in.dmg out.img)
qemu-img create -f raw "/путь/до/*.img" 20G
------------------------------------------------------------------------------------------------------------
Сейчас мы создадим .xml файл с конфигурацией нашей виртуальной машины с OSX:
<domain type='kvm'>
<name>osx</name>
<uuid>91848507-02ce-7d89-1ef4-40039265bbf9</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-1.3'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu mode='custom' match='exact'>
<model fallback='allow'>core2duo</model>
<vendor>Intel</vendor>
<topology sockets='1' cores='2' threads='2'/>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/qemu/osx/osx-install.img'/>
#путь до установочного образа!
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/qemu/osx/osx.img'/>
#путь до образа виртуального диска ВМ!
<target dev='hdb' bus='ide'/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:bf:39:f3'/>
<source bridge='virbr0'/>
#Можно так же создать bridge через netcfg (br0)
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<graphics type='spice' autoport='yes'/>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' vram='65536' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
------------------------------------------------------------------------------------------------------------
теперь от суперпользователя выполним:
virsh define '</путь/до/.xml>'
virsh start osx
virt-viewer osx
------------------------------------------------------------------------------------------------------------
Далее выполняем установку OSX, подготовив жесткий диск Дисковой Утилитой установщика
После установки не отмонтируя установочный образ загружаем OSX в виртуальной машине и копируем содержимое папки Extra в корень установленной системы и выполняем установку Chameleon.pkg c опциями по-умолчанию. Далее приводим файлы smbios.plist и org.chameleon.Boot.plist в должный вид с помощью Chameleon Wizard.
ВНИМАНИЕ! В данный момент виртуальная машина с OSX не может получить IP-адрес и не поддерживается аудио-кодек, так же иногда при выключении - машина не останавливается, в этом случае следует использовать команду virsh destroy osx от супер-пользователя.
------------------------------------------------------------------------------------------------------------
После описанных выше действий мы можете отмонтировать установочный образ через EDITOR=nano virsh edit osx и удалить
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/qemu/osx/osx-install.img'/>
#путь до установочного образа!
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
Система должна загрузиться как положено (используйте флаг -v для вывода подробной информации или -s для загрузки в однопользовательский режим).
------------------------------------------------------------------------------------------------------------
Проброс GPU в виртуальную машину:
В данный момент хорошо пробрасываются только GPU производства AMD или Intel, в моем случае - это AMD Sapphire Radeon 6450 1024Mb (она хорошо поддерживается OSX). Желательно иметь для такого эксперимента монитор с 2 видео-входами - т.к. вы сможете переключаться с реального компьютера на виртуальный нажатием кнопки на мониторе и выбором соответствующего входа.
На хосте: lspci | grep VGA
Смотрим адрес шины нашего GPU (в моем случае - это
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Caicos [Radeon HD 6450])
EDITOR=nano virsh edit osx
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0' multifunction='on'/>
</hostdev>
virsh start osx
virt-viewer osx
Опции Chameleon Wizard для включения поддержки нашего GPU:
AtiConfig=Duckweed
Graphics Enabler=No
После установки этих значений загрузчика необходимо запустить Kext Utility для исправления всех прав в /S/L/E и перезагрузить ВМ.
Признаком удачного проброса должен стать стандартный серый фон экрана входа пользователя в OSX и появившееся изображение на втором входе вашего монитора или втором мониторе, подключенном к ВМ)
ну и полупрозрачная верхняя панель.
Так же можно проверить доступность проброшенного GPU через "Об этом Mac" или "Информацию о системе"
Ну вот и всё! Желаю вам удачного эксперимента и жду замечаний и подсказок по улучшению данной статьи! :-)