Про неработающий iCloud на хакинтошах

Количество писем, в которых обладатели хакинтошей спрашивают у нас, почему у них не работает сервис iCloud, с каждой неделей только растёт. Чтобы не отвечать на каждое письмо одно и то же, попробуем разобраться в проблеме в отдельном материале.

На самом деле, коварство Apple тут не причём — в iCloud нет никакой проверки на то, хакинтош у вас или настоящий Мак. Корни проблемы кроются совершенно в другом и весьма неожиданном месте. Виновник проблемы — неверный идентификатор сетевого интерфейса Ethernet. Это звучит как бред, но причина именно в этом. Как ни странно, если сетевые интерфейсы на вашем компьютере воспринимаются системой в неверном порядке, вы получаете целый букет разнообразных проблем:

  • iCloud откажется подключаться
  • Mac App Store не будет принимать ваш пароль
  • FaceTime не захочет совершать звонки
  • Time Machine может выдавать ошибки при бэкапах

Чтобы избежать этих проблем, нужно всего лишь заставить Mac OS X воспринимать Ethernet как встроенный (для этого есть специальное свойство built-in) и присвоить ему идентификатор en0.

Между прочим, на эти же проблемы жалуются многие пользователи реальных Маков, достаточно заглянуть на форумы поддержки Apple и убедиться в этом. Зато у хакинтошников есть гораздо больше действенных способов решения проблемы :)

Способы решения мы расположим в порядке нарастания сложности:

1. Причина номер 1 — отсутствие в настройках загрузчика специальной опции, активирующей патч, присваивающий Ethernet-интерфейсу свойство built-in. Для Chameleon в файле /Extra/org.chameleon.boot.plist нужно добавить секцию:

[php]<key>EthernetBuiltIn</key>
<string>Yes</string>[/php]

Если вы пользуетесь XPC, то в файле /EFI/XPC/settings.plist нужно добавить или дополнить секцию:

[php]<key>InjectEthernet</key>
<dict>
<key>Vendor</key>
<string>0x10ec</string>
<key>Device</key>
<string>0x8168</string>
</dict>[/php]

Поля Vendor и Device надо заменить на идентификаторы производителя и модели Ethernet-карточки. Проще всего узнать их из свойств устройства в Диспетчере задач Windows.

2. В файле настроек вашего загрузчика также важно проверить наличие UUID. Это уникальный идентификатор вашего оборудования, который определяется на основе MAC-адреса сетевой карточки. Учтите, что если UUID меняется, то Mac OS X начинает считать, что это уже другой компьютер. Неприятные последствия этого состоят в сбросе ряда настроек системы, а самое неприятное последствие — сброс авторизации в iTunes Store и App Store. Поэтому перед экспериментами с UUID обязательно деавторизуйтесь в iTunes!

В Chameleon UUID задаётся в файле /Extra/SMBIOS.plist в секции:

[php]<key>SMUUID</key>
<string>00000000-0000-1000-8000-000000000000</string>[/php]

В XPC за идентификатор отвечает ключ PlatformUUID в файле setting.plist. UUID может включать любые цифры и буквы от A до F. Если не хочется фантазировать, можете ввести нули, а последние цифры заменить на MAC-адрес сетевой карточки. Он узнается в свойствах системы (Яблочко в менюбаре-Об этом компьютере-Подробнее-Отчёт о системе-Сеть-Ethernet-MAC-адрес).

3. Ещё одна вероятная причина — устаревший загрузчик. Если вы используете Chameleon, первым делом обновите его на последние билды. Дело в том, что встроенный в загрузчик патч, присваивавший сетевым интерфейсам правильные номера, в последние месяцы дорабатывался, но стало только хуже. Проблема с этим патчем решилась лишь относительно недавно.

4. Если всё в порядке, а iCloud и другие сервисы Apple всё равно не работают, надо проверить, какие идентификаторы присвоены сетевым интерфейсам. Для этого опять надо заглянуть в свойства сети (Яблочко в менюбаре-Об этом компьютере-Подробнее-Отчёт о системе-Сеть). На нашем скриншоте всё в порядке:

Всё в порядке потому, что Ethernet получил идентификатор en0. Если у вас он получает идентификатор en1 или en2, то с большой долей уверенности можно утверждать, что ничего работать не будет.

Сбросить идентификаторы можно следующим образом:

  • отключитесь от всех сетей (сеть электропитания не в счёт :)
  • зайдите в настройки системы, в пульт «Сеть». По очереди слева выберите все пункты и нажимайте минус внизу, пока не удалите все интерфейсы:

  • удалите (или переместите в безопасное место) файлы /Библиотеки/Preferences/SystemConfiguration/com.apple.network.identification.plist и /Библиотеки/Preferences/SystemConfiguration/NetworkInterfaces.plist
  • перезагрузитесь
  • зайдите в пульт настроек «Сеть» и нажмите плюс. Выберите интерфейс «Ethernet»
  • перезагрузитесь
  • зайдите в свойства сетей и проверьте, получил ли Ethernet идентификатор en0. Если да, можно добавлять остальные интерфейсы в пульте настроек сети

5. Наконец, если ваша сетевая карта прописана в DSDT, убедитесь, что в её свойствах указано свойство built-in. Это должно выглядеть как-то так:

[php]Device (LAN)
{
Name (_ADR, 0x01)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x04)
{
"built-in",
Buffer (0x01)
{
0x01
},
"device_type",
Buffer (0x09)
{
"ethernet"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}[/php]

Надеемся, что до четвёртого и пятого способов у вас дело не дойдёт. Как показывает практика, чаще всего хватает обновления загрузчика. Удачи вам с хакинтошами ;)