Устанавливаем Windows 7 на Macbook Air 2017 +16


С первых же строк надо оправдать цель этой затеи, ответить на три "почему": почему Windows, и почему именно 7, а также, почему macbook air 2017.

Как бы так зайти, не шибко кружа, к оправданию такого поступка? Windows на macbook это не диковинка, это удобно, надежно и привычно. Ну и позволяет нативно запускать некий специальный софт, который существует исключительно для этой ОС.

Почему Windows 7? Ну есть же люди что увлекаются ретрожелезом? Почему бы не побаловать себя ретро-ОС? Семерка стабильна и очень привычна, всё в ней на местах и не бесит. Пока еще себе можно это позволить, поддержка закончилась сравнительно недавно, и вроде система без обновлений еще не решето.

Теперь о том, что же не так с Macbook air 2017, собственно почему бы просто не поставить "семерку"? Вот тут как раз и суть этой статьи: нельзя просто взять и поставить Windows 7 на свежие макбуки! (боромир.жпг) Настолько нельзя, что на макбуках 2015-2017 годов не запускается даже установщик: висит на черном экране.

Эта статья компиляция личного опыта и перевода удивительно ценной ветки c macrumors. Охватывает позитивный опыт для макбуков с одним видеоядром в до-ретина эпоху. Про более новые модели данных у меня нет.

Проблемы при установке "семерки" сводятся к трем:

  • клавиатура и трекпад сидят на USB3, USB2 хаба нет;

  • накопитель с 2013 года nvme;

  • в EFI макбуков с 2015 года нет ни грамма поддержки legacy BIOS.

Первые две проблемы весьма технически решаются: интегрируются драйвера USB3 и поддержка NVME накопителей. Третьей проблеме стоит уделить больше внимания.

Суть от автора решения вот в чем:

Проблема не в Apple, проблема в Windows, а точнее в таких компонентах:

  1. Предзагрузочная среда из bootmgfw.efi и winload.efi. Для работы требует graphics output protocol (GOP), universal graphics adapter (UGA) или VGA подсистемы EFI для вывода текста для любых не-английских версий ОС, или протокол текстового вывода EFI для английской версии. В основном работает.

  2. Далее, среде требуется GOP с разрешением 1024х768 или 800х600 для отображения заставки с анимированным логотипом Windows. Тут поведение Windows идиотское (термин из оригинального поста), т.к. не стоит делать допущений про конкретные разрешения дисплея в будущем. Apple не предусматривает никаких иных разрешений GOP кроме родного для матрицы (для обсуждаемых макбуков это 1440х900). С другой стороны, если загрузка идет и без отображения логотипа, то исправлять это не обязательно (а загрузка идет).

  3. Главное проблемное место: виндовый GUI которому нужны драйвера. В установщике, Windows будет пробовать использовать для видео любой из встроенных драйверов, но на новом железе встроенных драйверов нет и остается только VGA драйвер. А так как протокол VGA основан на подсистеме BIOS, то работать в EFI он не будет без грязных хаков. Допущение о том, что протокол VGA будет работать на любой не-BIOS системе абсолютно дебильное (опять термин оригинала). Протокол VGA подразумевает использование прерывания int10h и VGA BIOS. Последний, в свою очередь, подразумевает использование реального режима х86, поддержки которого в 64-х битном EFI нет.
    Предположим, мы заставим устанавливаться систему в режиме unattended, и встроим видеодрайвер. Но нет, работать не будет из-за еще одного момента: проблема с регистром VGAE (0x3E) на мосту PCI-E. Даже если драйвера на видеоядро будут установлены, мы ничего на экране не увидим, пока карта не будет в режиме мастера шины PCI Reg (0x04)=7 и в родительском мосту PCI-E регистр VGAE не будет инициализирован значением (0x3E)=8. Если зайти в менеджер устройств по удаленному рабочему столу, то можно увидеть, что видеодрайвер работает нормально, но мониторов в системе нет. Ну и если ДО загрузки Windows установить эти значения в регистрах, а потом передать загрузку bootmgfw.efi, то всё более-менее заработает.

Автор оригинального поста, davidcie написал утилиту, которая:

  1. Разблокирует для записи область памяти C0000:CFFFF где обычно находится VGA ROM. Эта область памяти свободна при загрузке, но заблокирована для записи. Для этого используется EFI_LEGACY_REGION_PROTOCOL,  EFI_LEGACY_REGION2_PROTOCOL или Memory Type Range Registers в зависимости от того, какой метод доступен.

  2. Устанавливается обработчик int10h в область C0000:CFFFF который обрабатывает основные жизненно необходимые вызовы Windows 7 и сообщает об отсутствии поддержки для менее важных.

  3. Заполняет и делает доступной для Windows информацию видео режимов VESA совместимую с используемым адаптером, так ОС получает возможность выводить графику прямо в фреймбуфер, до момента установки полноценного видеодрайвера взамен vgapnp.sys

  4. Блокирует для дальнейшего использования регион памяти C0000:CFFFF

  5. Правит таблицу прерываний чтобы int10h указывал куда надо.

  6. отображает логотип Windows wavy flag или любой другой.

  7. Продолжает загрузку  \efi\microsoft\boot\bootmgfw.efi если такой файл есть на том же разделе, и таким образом загружается Windows.

С теорией всё, перейдем к практике.

Установка может быть выполнена как с флешек (Windows - единственная ОС) так и без флешек вовсе (макось на одном разделе, винда на другом).

Я считаю что удобнее и проще сначала установить MacOS и дальше работать только с встроенным диском, без всяких флешек: это сильно ускоряет все процессы, было бы место. Кстати, о месте: обычный NVME накопитель формата m2 прекрасно устанавливается в macbook с переходником типа такого. Установленная околопоследняя версия MacOS подразумевается.

Шаг 1. Разметка диска.

Утилита Bootcamp весьма успешно разбивает диск на разделы для установки Windows: уменьшает раздел MacOS, создает 10-и гигабайтный ex-Fat раздел для установочного образа и NTFS раздел для Windows. Схема прекрасная, но делать так мы не будем потому, что при первой же загрузке в MacOS этот раздел уничтожается и свободное место присоединяется к разделу MacOS. А перезагружаться придется. Потому в Disk Utility уменьшаем основной раздел MacOS до любого разумного значения и на освободившемся месте создаем ExFAT раздел размером гигабайт 10-16 и NTFS раздел на всё оставшееся место. Если под Windows хочется иметь второй раздел для файлов ака диск D: то стоит создать его прямо сейчас. Будущий системный раздел Windows может быть в любом месте жесткого диска: сразу после раздела с макосью, после загрузочного 10-гигабайтного или вовсе в конце - для EFI загрузки и GPT стиля разметки это не важно.

У меня получилось нечто такое:

Шаг 2. Поиск и подготовка дистрибутива Windows 7

Есть большой соблазн сходить на какой-нибудь трекер и утащить подготовленный дистрибутив семерки с уже интегрированными драйверами USB и поддержкой NVME. Однако, у меня не получилось найти ни одного рабочего: самый большой успех - удачная установка системы и невозможность её загрузки (зависание на disk.sys в безопасном режиме). Потому я прошел долгий и тернистый путь ручной подготовки дистрибутива из "чистого" образа. И упс, а на этом пути потребуется еще один Windows для работы с образом. Можно сходить на другой компьютер, а можно накатить десятку на подготовленный раздел, и сделать всё на самом макбуке, разницы нет.

Установить Windows 10 - просто

Ничего проще установки Windows 10 (а то и 11) нет: нужно содержимое установочного ISO как "есть" перебросить на раздел exFat, можно просто перетащить из Finder'а. В меню Bootcamp выбрать "скачать ПО поддержки Macbook" и закинуть на тот же раздел. После перезагрузки жмем левый Alt во время "тадам" и выбираем загрузку с Windows раздела. После установки Windows находим файлы bootcamp на установочном разделе и всё, система готова.

Для дальнейшей работы нужен дистрибутив Windows 7 "чистый SP1" и набор драйверов/исправлений:

  • Intel USB 3.0 Windows 7 x64 drivers (файлы сейчас бывают пропадают из интернетов, на момент написания статьи рабочая ссылка вот, для поиска по названию можно использовать такую фразу: Intel® USB 3.0 eXtensible Host Controller Driver for Intel® 8/9/100 Series and Intel® C220/C610 Chipset Family

  • Хотфиксы для поддержки NVME: KB2775511, KB2990941, KB3087873. Первый хотфикс содержит много чего, но нам от него надо принятие цифровой подписи Apple bootcamp drivers. Скачать их (хотфиксы) еще тяжелее, на сайте microsoft они уже не доступны, но по названию гуглятся.

  • Утилита VgaShim.

  • Структура папок: в любом удобном месте создать папки inject, inject\drivers и inject\hotfixes. В папку inject положить файлы boot.wim и install.wim из дистрибутива Windows (лежат в папке Sources). Туда же положить

  • Два скрипта интеграции:

do_boot.wim.bat и do_install.wim.bat

do_boot.wim.bat

@echo off
ECHO Preparing folders...
mkdir mount
mkdir mount\winpe
mkdir mount\setup
mkdir drivers
mkdir hotfixes
ECHO (WinPE) Mounting image
dism /mount-wim /wimfile:boot.wim /index:1 /mountdir:mount\winpe /quiet
ECHO (WinPE) Adding drivers
dism /image:mount\winpe /add-driver /recurse /forceunsigned /driver:drivers
ECHO (WinPE) Adding hotfixes
dism /image:mount\winpe /add-package /packagepath:hotfixes
ECHO (WinPE) Commiting changes
dism /unmount-wim /mountdir:mount\winpe /commit /quiet
ECHO (WinPE) Done!
ECHO (SETUP) Mounting image
dism /mount-wim /wimfile:boot.wim /index:2 /mountdir:mount\setup /quiet
ECHO (SETUP) Adding drivers dism /image:mount\setup /add-driver /recurse /forceunsigned /driver:drivers
ECHO (SETPUP) Adding hotfixes dism /image:mount\setup /add-package /packagepath:hotfixes
ECHO (SETUP) Commiting changes
dism /unmount-wim /mountdir:mount\setup /commit /quiet
ECHO (SETUP) Done!
PAUSE

do_install.wim.bat

@echo off ECHO Preparing folders...
mkdir mount mkdir mount\system mkdir mount\winre mkdir drivers mkdir hotfixes
ECHO (SYSTEM) Listing install.wim images
dism /get-wiminfo /WimFile:install.wim set /p image_index="Which image do you want to modify? Please give me a number: "
ECHO (SYSTEM) Mounting selected image
dism /mount-wim /wimfile:install.wim /index:%image_index% /mountdir:mount\system
ECHO (SYSTEM) Adding drivers
dism /image:mount\system /add-driver /recurse /forceunsigned /driver:drivers
ECHO (SYSTEM) Adding hotfixes
dism /image:mount\system /add-package /packagepath:hotfixes /quiet
ECHO (WinRE) Mounting Windows Recovery
dism /mount-wim /wimfile:mount\system\Windows\System32\Recovery\winRE.wim /index:1 /mountdir:mount\winre /quiet
ECHO (WinRE) Adding drivers to Windows Recovery dism /image:mount\winre /add-driver /recurse /forceunsigned /driver:drivers
ECHO (WinRE) Commiting changes to Windows Recovery
dism /unmount-wim /mountdir:mount\winre /commit /quiet
ECHO (SYSTEM) Copying bootmgfw.efi to your inject folder /y mount\system\Windows\Boot\EFI\bootmgfw.efi
ECHO (SYSTEM) Commiting changes to system
dism /unmount-wim /mountdir:mount\system /commit /quiet
ECHO (SYSTEM) All done!
PAUSE

У меня получился такой минимально работоспособный комплект. В этом комплекте также содержатся скрипты интеграции.

После выполнения скриптов мы получаем модифицированные файлы boot.wim и install.wim, копируем на их место на загрузочном разделе с заменой.

Теперь надо разместить VgaShim на системном EFI разделе. Подмонтировать его в MacOs можно командами:sudo mkdir /Volumes/esp
sudo mount -t msdos /dev/disk0s1 /Volumes/esp

В Windows: mountvol P: /S

В папке EFI/Boot необходимо заменить файл bootx64.efi на VgaShim: файлы VgaShim.efi и VgaShim.bmp переименовать в bootx64.efi и bootx64.bmp соответственно, и ими заменить содержимое папки Boot.

На установочном разделе (флешка или exFat раздел нашего диска) необходимо создать папку efi\boot и скопировать туда файлы VgaShim bootx64.efi и bootx64.bmp с раздела ESP. В папку efi\microsoft\boot необходимо скопировать файл bootmgfw.efi который возник в папке inject после выполнения скриптов интеграции.

Ну, вроде бы всё готово для загрузки установщика Windows 7. Если на целевом компьютере еще нет установленного Windows, то можно загружаться, удерживая alt: загрузка пойдет с раздела с установщиком. Если уже установлена десятка/одиннадцатая windows, то надо создать запись BCD для установочного раздела. Я использовал утилиту EasyBCD где создается новая запись WIM Image примерно так:

Если всё сделано правильно, то при загрузке с Windows раздела ноутбук ускоренно проиграет анимационную заставку Windows 7. Ура! Для первого запуска стоит использовать безопасный режим VgaShim, когда работает текстовый вывод. Для этого при старте системы с Windows раздела необходимо жать F8. После знакомого прогрессбара "loading files" и минутного ожидания с черным экраном должна возникнуть среда установки с курсором мыши. Если мышь и клавиатура не работают, то что-то пошло не так на этапе интеграции драйверов. Дальше еще один костыль: установщик windows хочет драйвера CD-ROM, и не пускает дальше. Чтобы обойти эту проблему нужно вызвать консоль комбинацией Shift-F10 и выполнить команду  setup /installfrom:<your letter>:\sources\install.wim, где <your letter> буква диска с образом установки (может быть любая, найти букву можно перебором или утилитой diskpart командой list volume. Тернисто, правда? Но по идее дальше никаких подводных камней и Windows установится куда прикажете.

Шаг 3. Драйвера.

Теперь пора устанавливать драйвера. Файлы драйверов для семерки приходится собирать из разных выпусков bootcamp, автор поста для macbook Air 2015 собрал пак. Для моего не подошли драйвера клавиатуры и трекпада, их я взял отдельно из BootCamp5.1.5640.

Ну, вот вроде и победа? До окончательной победы нужно привести Windows в актуальное состояние обновив WindowsUpdateAgent, и потратив вечер-два на самообновление и отключить гибернацию (powercfg -h off).

Итоги таковы: работает всё на 99,99% с легкими неудобствами:

Первое неудобство заключается в том, что любые стартовые сообщения Windows не видны. И, если, например, ОС хочет режим восстановления, то этого не видно за черным экраном. Ситуацию помогает решить нажатие F8 на этапе работы VgaShim.

Второе - не работает толком панель управления Bootcamp, ругается на старте о невозможности сменить загрузочное устройство. Из настроек там (мне) нужно только поведение функциональных кнопок F1-F12, вручную изменить можно в реестре HKEY_CURRENT_USER\Software\Apple Inc.\Apple Keyboard Support\OSXFnBehavior.

В device manager мылит глаза Mobile 5th Generation Intel(R) Core(TM) Premium SKU LPC Controller без драйвера.

Из удобств можно отметить куда как большую отзывчивость системы как по сравнению с MacOS так и с более свежими Windows. Загрузка от нажатия на кнопку питания до состояния "можно работать" секунд 8-15, и это неплохо. Работа от батарей точно не хуже чем в родной ОС или десятке, расход зависит только от прожорливости приложений. Кнопки управления - работают. А собственно, что еще надо?

Данная статья будет полезна не только маководам-ренегатам с новыми макбуками и ностальгией по "семерке", а и всем владельцам относительно нового железа с UEFI - принцип тот же.




К сожалению, не доступен сервер mySQL