Неделю назад я хотел проверить, как будет проходить обновление Mac OS X Server 10.6 на OS X Lion Server 10.7. Всё оказалось гораздо сложнее, чем я думал – процесс установки 10.7 в VMWare Fusion был мучительным. Ни VMWare Fusion, ни Parallels Desktop не поддерживают пока гостевую OS X Lion, ни десктопную, ни серверную.

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

Установка базируется на уже канонической статье об установке OS X 10.7 Developer Preview 2 в VMWare Fusion. Fusion – последний. Хостовая система – OS X Lion.

Беру установочный образ OS X Lion из раздела Recovery HD.

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *160.0 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Lion                    159.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
$ diskutil mount /dev/disk0s3
Volume Recovery HD on /dev/disk0s3 mounted

Монтирую образ:

$ open /Volumes/Recovery\ HD/com.apple.recovery.boot/BaseSystem.dmg

Захожу в Disk Utility, File/New/Blank Disk Image. Параметры взял из статьи (обратите внимание на “Image Format: DVD/CD master”):

01 vm lion

Клонирую установочный образ из Recovery HD в свежесозданный образ через Disk Utility:

02 vm lion

“Erase” приводит к тому, что появляется два “Mac OS X Base System”. Второй из Finder переименовываю обратно в “MyInstaller”:

04 vm lion

Теперь нужно скопировать необходимые для установки файлы из релиза OS X Lion. Списываю повторно установочный пакет из App Store по рецепту, описанному в “Re-Download Mac OS X Lion from the App Store“. По непонятной причине я не смог просто загрузиться с этого образа, поэтому иду на такие ухищрения.

Монтирую полный установочный образ:

$ open /Applications/Install\ Mac\ OS\ X\ Lion.app/Contents/SharedSupport/InstallESD.dmg

Теперь открыто три образа:

05 vm lion

  1. Mac OS X Base System – из Recovery HD
  2. Mac OS X Install ESD – из установочного пакета OS X Lion
  3. MyInstaller – пакет, который мы формируем.

Копирую kernelcache, в котором скомпонованы kext’ы (kernel extension) для ускорения загрузки:

$ sudo cp "/Volumes/Mac OS X Install ESD/kernelcache" /Volumes/MyInstaller/kernelcache

Для простоты копирую существующий com.apple.Boot.plist и удаляю строку с “root-dmg=file:///BaseSystem.dmg”:

$ sudo vim /Volumes/MyInstaller/Library/Preferences/SystemConfiguration/com.apple.Boot.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Kernel Flags</key>
   <key>Kernel Cache</key>
   <string>\kernelcache</string>
</dict>
</plist>

Копирую установочные пакеты (1.5 GB), предварительно удаляя нерабочий симлинк:

$ sudo rm /Volumes/MyInstaller/System/Installation/Packages
$ sudo cp -Rv "/Volumes/Mac OS X Install ESD/Packages" /Volumes/MyInstaller/System/Installation/Packages

Можно приступать к VMWare Fusion. Модифицируем VMWare Fusion, чтобы она не проверяла “серверность”:

$ sudo bash
# cd "/Library/Application Support/VMware Fusion/isoimages"
# mkdir original
# mv darwin.iso tools-key.pub *.sig original
# perl -n -p -e 's/ServerVersion.plist/SystemVersion.plist/g' < original/darwin.iso > darwin.iso
# openssl genrsa -out tools-priv.pem 2048
# openssl rsa -in tools-priv.pem -pubout -out tools-key.pub
# openssl dgst -sha1 -sign tools-priv.pem < darwin.iso > darwin.iso.sig
# for A in *.iso ; do openssl dgst -sha1 -sign tools-priv.pem < $A > $A.sig ; done

Тут начинается путаница, этот вариант у меня в итоге не сработал, поэтому добавляю второй костыль для “серверности” в образ MyInstaller.cdr:

$ sudo touch /Volumes/MyInstaller/System/Library/CoreServices/ServerVersion.plist

Образ готов, eject:

$ diskutil eject /Volumes/MyInstaller

Создаю новую виртуальную машину, “Continue without disc” (кстати, знаете, чем отличается disc от disk?). В “Use operating system installation disc image file” подставляю свежесозданный диск. Тип операционной системы понятен. Mac OS X Server 10.6 64 bit.

Customize Settings. Сохраняю VM с именем Lion. В секции “Hard Disks” снимаю галочку с “Split into 2 GB files”, Apply. В “Processors & RAM” ставлю память 2048 – да, при меньшем количестве памяти система не стартует (можно правда поправить OSInstall.mpkg, но это отдельная тема). Остальное не трогаю, разве что меняю сетевое подключение с NAT на Bridged, это касается моей конфигурации сети.

07 vm lion

В инструкции ищу ссылку на файл nvram.zip и списываю его. Нахожу в Finder виртуальную машину, Secondary Click, “Show Package Content”. Переношу куда-нибудь старый файл Lion.nvram, забрасываю списанный файл и переименовываю по имени виртуальной машины:

08 vm lion

Без замены файла nvram VM не запустится. Как сделать этот файл “с нуля”, я не знаю, может кто-то просветит?

Запускаю виртуальную машину. После двух костылей “серверности” процесс начался:

09 vm lion

Но в установленной системе файла ServerVersion.plist нет, и при старте выдаётся ошибка:

10 vm lion

Есть два варианта:

  1. Загрузиться с установочного образа. Предпочтительнее, так как нужно сделать ещё одну дополнительную операцию (об этом ниже).
  2. Смонтировать диск виртуальной машины через MacFUSE.

Загрузка с установочного образа

Запускаю виртуальную машину, сразу же нажимаю пробел, вызывается BIOS (не уверен, что это не EFI/etc, но это несущественно):

11 vm lion

Boot Manager. Выбираю первый из “EFI SCSI Device”. Не получится – повторяю и выбираю второй:

12 vm lion

Запускаю Utilities/Terminal.app:

13 vm lion

Делаю “серверность”:

$ sudo touch /Volumes/Macintosh\ HD/System/Library/CoreServices/ServerVersion.plist

Обычно грустно смотреть на серый экран виртуальной машины, если она не запускается уже десятую минуту. Для придания осмысленности процессу нужно включить загрузку операционной системы в Verbose mode. Однако клавиатурная комбинация Command+V у меня почему-то не работает в Fusion…

В том же терминале выполняю команду:

# nvram boot-args="-v"

“-x” тоже держу наготове, если VM зависнет на сообщении вида “Sandbox: sandboxd(125) deny distributed-notification-post”. Тогда снова загрузка с образа, включение Safe mode:

# nvram boot-args="-x -v"

Но не забудьте после успешного запуска системы отключить Safe Mode, оставив Verbose:

$ sudo nvram boot-args="-v"

или вернуть всё к обычному состоянию

$ sudo nvram boot-args=""

Вот сеанс:

14 vm lion

В конце – рестарт системы через “shutdown -r now”.

Монтирование диска через MacFUSE

Версия MacFuse с Google Code не поддерживает Lion, в этом я убедился после его установки. Нашёл новую версию на сайте Tuxera: macfuse-core-10.5-2.1.9.dmg. После установки vmware-vmdkMounter начинает работать.

Монтирую образ:

$ sudo /Library/Application\ Support/VMware\ Fusion/VMDKMounter.app/Contents/MacOS/vmware-vmdkMounter /Volumes/Data/Virtual\ Machines.localized/Lion.vmwarevm/Lion.vmdk
$ sudo touch /Volumes/Lion.vmdk/System/Library/CoreServices/ServerVersion.plist

Не помешает примонтированный образ добавить в исключения Spotlight, иначе индексирование зря нагрузит систему.

Отмонтировать можно традиционно через Finder, а потом нужно прервать запущенный ранее vmware-vmdkMounter.

Финиш

Вуаля! Система запустилась и можно приступать к настройке:

15 vm lion

Кстати, на будущее не помешает на этой стадии сделать Shutdown VM, смонтировать диск через MacFUSE описанным выше методом и сделать dmg-файл, чтобы можно было быстро откатиться в случае необходимости или же начать новые эксперименты, не проделывая указанные выше операции. Disk Utility, выбрать смонтированный в vmware-vmdkMounter раздел, New/Disk Image from Macintosh HD:

16 vm lion

Почему не Take Snapshot? А потому что vmware-vmdkMounter не может смонтировать образ со снепшотами.

Всё. Терпение, труд и Google всё перетрут.