вторник, 29 января 2013 г.

Виртуальная машина Qemu-KVM с OSX Mountain Lion 10.8.2

Сегодня хочу поделиться с вами способом создания 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 и появившееся изображение на втором входе вашего монитора или втором мониторе, подключенном к ВМ)

http://savepic.org/2678452.png - вот такой, 

ну и полупрозрачная верхняя панель.
Так же можно проверить доступность проброшенного GPU через "Об этом Mac" или "Информацию о системе"

Ну вот и всё! Желаю вам удачного эксперимента и жду замечаний и подсказок по улучшению данной статьи! :-)




1 комментарий:

  1. Мужик!
    Я попробую это сделать на своем арче в выходные.
    Сколько волос на жопе было выдрано в процессе?

    ОтветитьУдалить