Здравствуйте. Сегодня я расскажу как можно создать единый установочный носитель с множеством разных версий Windows не прибегая к использованию стороннего ПО. Таким образом вы будете полностью понимать какие манипуляции мы выполняем. Также я сделаю упор на то, чтобы как можно меньше энтропии привносить в этот мир изменять структуру оригинальных установочных дистрибутивов. Кому интересно — прошу под кат.

   Последние пару лет я устанавливал ОС линейки Windows NT 6.0+ исключительно с USB носителя. Иногда это была флешка, чаще — USB-HDD. (Далее для простоты буду называть установочный USB носитель просто — флешка).
Но в установочных носителей Windows есть неприятная особенность — жёстко прописаны пути к установочным файлам. Т.е. как минимум в корне флешки должны быть:
  Если нужна загрузка по UEFI (например, для установки системы на диск с GPT-стилем разделов), то — плюс ещё . Без хакинга эти имена не поменять. Для чего это может понадобиться? Да для того, чтобы иметь несколько дистрибутивов Windows на одной флешке! Ведь кто-то не переваривает Win8, ему Win7 ставь, а кто-то хочет систему поновее и пошустрее... Раньше я особо не заморачивался и просто скопировал эти файлы и папки с одного установочного ISO-шника (скажем, Win 8.1 x64). Переименовал  в . Потом покопировал с остальных ISO-шников только , попутно переименовывая их. И всё. Больше никаких телодвижений кроме записи загрузочного сектора и активации раздела флешки я не делал. В результате у меня была приблизительно такая структура файлов на флешке:
  Когда надо было установить какую-то из систем, я просто переименовывал соответствующие папки так, чтобы файлы требуемой Windows были в папке . Так продолжалось пару лет. Хорошо, что делать это приходилось не часто. Но настал день, когда нужно было погонять ноутбук одногрупницы на предмет неисправностей диска. Среди всего прочего было проведено и стирание информации без разбору — последовательное перезаписывание секторов по LBA, не взирая на такие мелочи как MBR, разделы и т.п. Естественно, после всех истязаний надо бы подготовить компьютер к использованию: разметить диск, поставить систему, приложения и т.п. Но надо ставить не что иное, как Windows 10! А то ведь точно забракует! Оно-то и не удивительно: если уже пользовалась 10-кой, то на старую винду возвращаться не будет. Скачал Media Creation Tool и принялся с его помощью качать образы 10-ки. Скачал. Поставил ей систему, драйверы и некоторые самые необходимые приложения. Visual Studio и остальное сама поставит. Но бардак на флешке совсем не радовал:
  Эти обстоятельства послужили тригером к решению: После прочтения нескольких статей в интернете о том, как это можно организовать, некоторые решения мне показались уж слишком извращенскими.
Например: с помощью Grub4Dos копировать файл ответов, записывать в файл путь к нужному ISO, монтировать этот ISO, загрузиться в WinPE, после этого снова монтировать этот же ISO (т.к. предыдущий теряется из-за перехода из реального режима в защищённый), потом искать букву диска с файлами установки… Ах, да! Если установочный носитель — это USB-HDD, а не флешка, то нужно перед этим ещё и подключать флешку, в корне которой лежит файл ответов… Словом — ужас. Конечно, в этом можно найти определённую логику: такой подход позволяет не распаковывать ISO-шки, а положить их в отдельную папку на флешке… Но надо поддерживать кучу других файлов…
Короче, это не наш путь.   Мы не будем играться с монтированием ISO, а просто разместим файлы для загрузки на установочном носителе. Но не просто перенесём эти файлы с установочных ISO (как было до этого), а немного переделаем их структуру так, чтобы можно было просто выбирать версию Windows для установки, не делая больше никаких рутинных действий (см. предысторию).
 
Также мы не будем здесь рассматривать создание дистрибутива Windows AiO (когда в одном sources\install.wim располагается множество разных версий системы), поскольку такой способ имеет много недостатков, среди которых: Делать мы всё будем руками и, как было обещано, без стороннего ПО. А то есть куча разных прог для создания супер мега крутых мультизагрузочных дисков, но толком не ясно что они делают и как. А у нас план — без стороннего софта и с минимальным вмешательством!
 
  Выбор-то и не большой: FAT32: это ваш выбор, если вам нужна загрузка по UEFI. Но помните: в этой ФС максимальный размер файла — 4 ГиБ.
exFAT: здесь нет столь ощутимого ограничения на размер файла, но загрузка по UEFI невозможна. Кроме того, некоторые загрузчики (например, Grub4Dos) не могут корректно с ней работать. Но BOOTMGR работает. Upd: По крайней мере, некоторые Live Linux ISO не запускаются .
NTFS: тут всё хорошо, за исключением того, что не все компьютеры поддерживают загрузку по UEFI с этой ФС. Вот и получается:
обязательно нужен UEFI — FAT32, не обязательно или не нужен вовсе — NTFS. Отформатируйте флешку в выбранную вами ФС.
Примечание: если ваша флешка уже имеет нужную ФС, то форматировать её необязательно. Но я бы всё-таки отформатировал ;)
 
  Это нужно для того, чтобы компьютер мог загрузиться с него (ну, или хотя бы попытаться...).
Тут есть различие между USB-HDD и флешками. Для USB-HDD это можно сделать так:
Откройте оснастку Управление дисками (diskmgmt.msc). Щёлкните правой кнопкой мыши по нужному разделу своего USB-HDD и выберите "Сделать раздел активным". Если этот пункт контекстного меню неактивен — значит раздел уже активен. Для флешки этот вариант не пройдёт. Тут пункт контекстного меню "Сделать раздел активным" будет всегда неактивен. Поэтому нужно использовать универсальный способ:
Откройте Командную строку (cmd.exe). Выполните такие команды:
  Теперь ваша флешка является загрузочной. Но она пока пуста. Самое время наполнить её смыслом.
 
  Нам нужен набор файлов менеджера загрузки. Это:
  Я скопировал эти файлы из самого свежего дистрибутива — Windows 10 x64 (Threshold 2). После этого уже можно протестировать как грузится флешка.
Если всё сделано правильно — вы увидите экран Windows Boot Manager c сообщением об ошибке. Ошибка — из-за того, что мы ещё не скопировали . Но нам просто важен факт, что bootmgr получает управление.
Если вы не увидите экран Windows Boot Manager, то возможно дело в том, что при форматировании система не записала загрузочный сектор совместимый с BOOTMGR. Чтобы сделать это вручную, выполните команду bootsect /nt60 <буква_диска>:, где <буква_диска> — ваша флешка.
 
  Файлы дистрибутива находятся в . Значит надо создать структуру папок, содержащую  из разных версий Windows под разными именами. Эту структуру можно делать как захочется. Но важно потом соблюдать соответствие путей. Я сделал так:
  Теперь в каждую из этих папок надо скопировать содержимое  из соответствующих ISO-шников. До сих пор на флешке было занято лишь несколько десятков МиБ. А теперь — несколько ГиБ.
 
  Мы хотим, чтобы можно было выбирать любую из этих систем просто из меню. Без переименовывая папок и т.п. рутины. Значит, надо добавить пункт меню для каждой из Windows. Помните, раньше мы копировали файлы диспетчера загрузки? Теперь нужно отредактировать файлы данных конфигурации загрузки. Это:
  Сначала включим отображение меню. И уберём таймаут, чтобы оно отображалось столь угодно долго до совершения выбора пользователем (мы ведь не просто загружаемся, а систему устанавливаем! Выбор должен быть осознанным ◕‿◕).
Чтобы сделать это выполните команды:
  где <буква_диска> здесь и далее — ваша флешка. Дальше будем добавлять пункты установки для каждой из систем. Сначала выполним команду
bcdedit /store <буква_диска>:\boot\bcd /enum {default}
чтобы узнать значение device и osdevice пункта по-умолчанию. Они будут приблизительно такими: Как правило, значения этих параметров в одном пункте загрузки одинаковые.
Мы будем для каждого дистрибутива Windows изменять путь к образу c WinPE (boot.wim), при этом оставляя таким же <GUID параметров ramdisk>. Это будут единственные различия между пунктами загрузки разных дистрибутивов.
  Параметр device определяет устройство, на котором лежит \windows\system32\boot\winload.exe (это значение указано в параметре path).
Параметр osdevice определяет устройство, на котором лежит \windows (это значение указано в параметре systemroot). В нашем случае значения device и osdevice состоят из пути к WIM-образу системы (в данном случае WinPE), который загружается в оперативную память (ramdisk). После запятой указан GUID записи, которая определяет параметры устройства, с которого будет загружаться WinPE (в нашем случае — ramdisk). На неё можно взглянуть подробнее: Ничего особенного. Будем использовать эти же параметры устройства для других пунктов загрузки. boot.sdi — Это по-сути образ пустого NTFS-тома. А в этот том уже монтируется образ из boot.wim. Поскольку пункт по-умолчанию уже полностью настроен (кроме значений device и osdevice), то мы просто будем его копировать и изменять.
  Здесь приведено несколько примеров создания новых пунктов загрузки на основе пункта по-умолчанию.
Не копируйте тупо команды отсюда! У вас будут другие GUID-ы. Эти примеры только чтобы понять что к чему.   После того, как все пункты добавлены удаляем пункт по-умолчанию:
bcdedit /store <буква_диска>:\boot\bcd /delete {default}   Если вам нужна загрузка по UEFI, то вам нужно также отредактировать другое хранилище конфигурации загрузки (то, которым руководствуется BootMgFw.efi). Тут всё точно так же как и там, за исключением пути к файлу BCD.
Т.е. вместо
bcdedit /store <буква_диска>:\boot\bcd
следует использовать
bcdedit /store <буква_диска>:\efi\microsoft\boot\bcd. Примечание. Вы не можете просто так взять и скопировать \boot\bcd в \efi\microsoft\boot\bcd! Они должны различаться как минимум параметрами path во всех пунктах, включая {memdiag}. Update
Посредством UEFI могут загружаться все 64-битные версии Windows NT 6.0+, а из 32-битных — только Windows 8+.
Кроме того, в пунктах установки ОС, предшествующих Windows 8, не должно быть параметра IsolatedContext со значением Yes. Иначе, у вас просто не запустится среда предустановки этой системы (т.е. вы не сможете установить, например, Windows 7 x64 в режиме UEFI).   Итак, у нас при загрузке с флешки уже есть рабочее меню, где мы можем выбирать нужную версию Windows. Загрузитесь и убедитесь, что при выборе определённого пункта меню загружается соответствующая Windows PE.   Мы ещё не всё сделали. Ведь, если попытаться установить какую-то из систем, то получим неприятный сюрприз:  Почему это произошло? Дело в том, что программа установки ищет образ install.wim или сжатый install.esd в папке sources на всех доступных томах. Windows 10 в случае неудачи ещё пытается искать в папках x64\sources или x86\sources в зависимости от разрядности. В нашем случае — не находит нигде.
Она думает, что, наверное, нет драйвера от установочного носителя и предлагает его загрузить.   Вы уже можете установить Windows из своей флешки, вручную правильно запустив программу установки. Есть несколько вариантов.
    Это всё хорошо, но мы же не хотим вручную запускать установку, правда? Хотим чтобы оно само. Значит надо сделать так, чтобы оно само запускало установку откуда надо.   Рассмотрим запуск Windows PE, чтобы понять, как с минимальным вмешательством заставить её выполнять то, что нам нужно.
В параметре реестра HKLM\SYSTEM\Setup\CmdLine указано первое приложение, которое выполняется после запуска WinPE. Это winpeshl.exe. Оно делает всякие полезные вещи, как то: Нам нужно выполнить свой сценарий, который найдёт на флешке нужный файл и запустит его. Как видите, у нас не один вариант: Я продемонстрирую вариант только с добавлением файлов (минимальное вмешательство, да).
  На примере дистрибутива Windows 10 x64.
Итак, нам нужно редактировать содержимое тома X:, которое монтируется из boot.wim. Сначала узнаем индекс образа для монтирования:
  Нам нужен не чистый Windows PE, а установочный — Windows Setup. Т.е. индекс — 2.
Ещё нам нужно создать папку, куда будем монтировать образ. Я создал C:\mnt.
  Теперь, как и запланировали, копируем в C:\mnt\Windows\System32\ файлы winpeshl.ini и свой файл сценария (я назвал его runsetup.cmd).
  А за тем, чтобы файлы winpeshl.ini и runsetup.cmd были универсальны для всех дистрибутивов Windows NT 6.0+. Т.е. их не нужно отдельно модифицировать под установку Win7, Win8 и т.п. Путь к папке дистрибутива определяется автоматически. Также добавлен простой способ запуска Восстановления системы, т.к. из-за прямого запуска \sources\setup.exe вместо X:\setup.exe мы теряем страницу:
 Разница только в том, что в нашем случае мы язык выбираем уже после запуска установки Windows или Восстановления системы. В оригинальных ISO образах X:\setup.exe сообщает языковые настройки запускаемым через него приложениям. Внимание! В предоставленном мной runsetup.cmd путь к программе установки определяется по шаблону <буква_флешки>:\\<путь_и_префикс_к_папкам_дистрибутивов>_<версия>_<архитектура>\setup.exe
(строка %RamdiskSourceDrive%\%WinDistAfx%_%WinVerAfx%_%WinArchAfx%\setup.exe). Т.е. в моём случае сценарий будет формировать пути (в зависимости от того, из какого дистрибутива был запущен) наподобие: Если вы создавали на флешке другую структуру папок и их названий — сделайте соответствующие изменения. Осталось отмонтировать образ с сохранением изменений:
  Готово! Теперь нужно повторить эти действия для остальных boot.wim. После этого у вас на флешке будут все желаемые дистрибутивы, которые вы сможете просто выбирать из меню и продолжать установку как будто на флешке только одна версия Windows!   Тут ещё несколько советов по улучшению вашей установочной флешки.   Для этого нужно поместить файлик ei.cfg рядом с программой установки 
Retail Помещать нужно в папку откуда запускается setup.exe. Постольку у нас он запускается с флешки, а не с ramdisk-а (boot.wim), то и кладём ei.cfg в папки дистрибутивов на флешке. (+1 преимущество от запуска установки прямо с флешки, вместо запуска с ramdisk-а с параметром /installFrom).   Таким образом можно сделать возможность циклического перехода из одного меню в другое без перезагрузки компьютера. И уже не важно какой из загрузчиков был запущен первым: BOOTMGR или GRLDR.   В новейших BootMgr сделали загрузку образа boot.wim на ramdisk без анимации. Т.е. просто выводится статический логотип Windows и всё, ждите. Можно вернуть прогрессбар, как было раньше. Он хоть будет давать информацию о степени загрузки WinPE в оперативную память.
  Правда, вместе с этим вы отключите новый стиль меню дополнительных параметров и сообщений об ошибках (на голубом фоне, с управлением функциональными клавишами), но то такое (^̮^)   Это в дополнение к предыдущему украшательству. Работает по Windows 7 включительно. В Windows 8+ майки это выпилили почему-то (не даёт эффекта).
  Применив предыдущие два украшательства прикольнее всего грузится Windows 7. Но это всё — баловство.   Итак, что мы сделали: На этом всё. Вопросы, замечания и пожелания приветствуются (ʘ‿ʘ) Software Engineer