Как стать автором
Обновить

Создаём установочный носитель с множеством версий Windows NT 6.0+ без использования стороннего софта

Время на прочтение18 мин
Количество просмотров124K

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


Также я сделаю упор на то, чтобы как можно меньше энтропии привносить в этот мир изменять структуру оригинальных установочных дистрибутивов.


Кому интересно — прошу под кат.


 


Предыстория


Последние пару лет я устанавливал ОС линейки Windows NT 6.0+ исключительно с USB носителя. Иногда это была флешка, чаще — USB-HDD. (Далее для простоты буду называть установочный USB носитель просто — флешка).
Но в установочных носителей Windows есть неприятная особенность — жёстко прописаны пути к установочным файлам. Т.е. как минимум в корне флешки должны быть:
 


[boot]
[sources]
bootmgr

Если нужна загрузка по UEFI (например, для установки системы на диск с GPT-стилем разделов), то — плюс ещё [efi].


Без хакинга эти имена не поменять. Для чего это может понадобиться? Да для того, чтобы иметь несколько дистрибутивов Windows на одной флешке! Ведь кто-то не переваривает Win8, ему Win7 ставь, а кто-то хочет систему поновее и пошустрее...


Раньше я особо не заморачивался и просто скопировал эти файлы и папки с одного установочного ISO-шника (скажем, Win 8.1 x64). Переименовал [sources] в [sources_w8x64]. Потом покопировал с остальных ISO-шников только [sources], попутно переименовывая их. И всё. Больше никаких телодвижений кроме записи загрузочного сектора и активации раздела флешки я не делал. В результате у меня была приблизительно такая структура файлов на флешке:
 


[boot]
[sources]
[sources_w7x86]
[sources_w8x64]
[sources_w8x86]
bootmgr

Когда надо было установить какую-то из систем, я просто переименовывал соответствующие папки так, чтобы файлы требуемой Windows были в папке [sources].


Так продолжалось пару лет. Хорошо, что делать это приходилось не часто. Но настал день, когда нужно было погонять ноутбук одногрупницы на предмет неисправностей диска. Среди всего прочего было проведено и стирание информации без разбору — последовательное перезаписывание секторов по LBA, не взирая на такие мелочи как MBR, разделы и т.п. Естественно, после всех истязаний надо бы подготовить компьютер к использованию: разметить диск, поставить систему, приложения и т.п. Но надо ставить не что иное, как Windows 10! А то ведь точно забракует! Оно-то и не удивительно: если уже пользовалась 10-кой, то на старую винду возвращаться не будет. Скачал Media Creation Tool и принялся с его помощью качать образы 10-ки. Скачал. Поставил ей систему, драйверы и некоторые самые необходимые приложения. Visual Studio и остальное сама поставит. Но бардак на флешке совсем не радовал:
 


[boot]
[sources]
[sources_w7x64]
[sources_w7x86]
[sources_w8x64]
[sources_w8x86]
[sources_w10x86]
bootmgr

Эти обстоятельства послужили тригером к решению:


Хватит это терпеть!

После прочтения нескольких статей в интернете о том, как это можно организовать, некоторые решения мне показались уж слишком извращенскими.
Например: с помощью Grub4Dos копировать файл ответов, записывать в файл путь к нужному ISO, монтировать этот ISO, загрузиться в WinPE, после этого снова монтировать этот же ISO (т.к. предыдущий теряется из-за перехода из реального режима в защищённый), потом искать букву диска с файлами установки… Ах, да! Если установочный носитель — это USB-HDD, а не флешка, то нужно перед этим ещё и подключать флешку, в корне которой лежит файл ответов… Словом — ужас.


Конечно, в этом можно найти определённую логику: такой подход позволяет не распаковывать ISO-шки, а положить их в отдельную папку на флешке… Но надо поддерживать кучу других файлов…
Короче, это не наш путь.


 


Творим


План


Мы не будем играться с монтированием ISO, а просто разместим файлы для загрузки на установочном носителе. Но не просто перенесём эти файлы с установочных ISO (как было до этого), а немного переделаем их структуру так, чтобы можно было просто выбирать версию Windows для установки, не делая больше никаких рутинных действий (см. предысторию).
 
Также мы не будем здесь рассматривать создание дистрибутива Windows AiO (когда в одном sources\install.wim располагается множество разных версий системы), поскольку такой способ имеет много недостатков, среди которых:


  • один файл огромного размера
    • нельзя использовать FAT32, а следовательно и UEFI
    • невозможно впоследствии использовать флешку меньшего объёма пропустив копирование ненужных дистрибутивов
  • трудности с обновлением конкретного дистрибутива (надо удалить из образа старый, и добавить новый)
  • не факт, что вообще можно поселить в одном образе, например, Win7 и Win10 (не проверял)

One more thingДелать мы всё будем руками и, как было обещано, без стороннего ПО. А то есть куча разных прог для создания супер мега крутых мультизагрузочных дисков, но толком не ясно что они делают и как. А у нас план — без стороннего софта и с минимальным вмешательством!
 
 


Подготовка флешки


Определитесь с файловой системой


Выбор-то и не большой:


  • FAT32
  • exFAT
  • NTFS

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). Выполните такие команды:
 


DiskPart
list disk
select disk <номер вашей флешки (можно идентифицировать по размеру из предыдущей команды)>
list part
select part <номер раздела, который требуется сделать активным (обычно 1)>
active
exit

Пример
Пример активации раздела с помощью DiskPart

Теперь ваша флешка является загрузочной. Но она пока пуста. Самое время наполнить её смыслом.
 
 


Наполнение дистрибутивами



Файлы диспетчера загрузки Windows


Нам нужен набор файлов менеджера загрузки. Это:
 


[boot]
[efi] - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))
bootmgr
bootmgr.efi - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))

Я скопировал эти файлы из самого свежего дистрибутива — Windows 10 x64 (Threshold 2).


После этого уже можно протестировать как грузится флешка.
Если всё сделано правильно — вы увидите экран Windows Boot Manager c сообщением об ошибке. Ошибка — из-за того, что мы ещё не скопировали [sources]. Но нам просто важен факт, что bootmgr получает управление.
Если вы не увидите экран Windows Boot Manager, то возможно дело в том, что при форматировании система не записала загрузочный сектор совместимый с BOOTMGR. Чтобы сделать это вручную, выполните команду bootsect /nt60 <буква_диска>:, где <буква_диска> — ваша флешка.
 
 


Дистрибутивы


Файлы дистрибутива находятся в [sources]. Значит надо создать структуру папок, содержащую [sources] из разных версий Windows под разными именами. Эту структуру можно делать как захочется. Но важно потом соблюдать соответствие путей. Я сделал так:
 


[WinDists]
 |- [Win_7_ia32]
 |- [Win_7_x64]
 |- [Win_8.1_ia32]
 |- [Win_8.1_x64]
 |- [Win_10_ia32]
 |- [Win_10_x64]

Теперь в каждую из этих папок надо скопировать содержимое [sources] из соответствующих ISO-шников. До сих пор на флешке было занято лишь несколько десятков МиБ. А теперь — несколько ГиБ.
 
 


Настройка


Меню


Мы хотим, чтобы можно было выбирать любую из этих систем просто из меню. Без переименовывая папок и т.п. рутины. Значит, надо добавить пункт меню для каждой из Windows.


Помните, раньше мы копировали файлы диспетчера загрузки? Теперь нужно отредактировать файлы данных конфигурации загрузки. Это:
 


[boot]
 |- bcd
[efi]
 |- [microsoft]
     |- [boot]
         |- bcd - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))


Редактируем BCD


Сначала включим отображение меню. И уберём таймаут, чтобы оно отображалось столь угодно долго до совершения выбора пользователем (мы ведь не просто загружаемся, а систему устанавливаем! Выбор должен быть осознанным ◕‿◕).
Чтобы сделать это выполните команды:
 


bcdedit /store <буква_диска>:\boot\bcd /set {bootmgr} DisplayBootMenu True
bcdedit /store <буква_диска>:\boot\bcd /deletevalue {bootmgr} Timeout

где <буква_диска> здесь и далее — ваша флешка.


Дальше будем добавлять пункты установки для каждой из систем. Сначала выполним команду
bcdedit /store <буква_диска>:\boot\bcd /enum {default}
чтобы узнать значение device и osdevice пункта по-умолчанию. Они будут приблизительно такими:


device      ramdisk=[boot]\sources\boot.wim,{<GUID параметров ramdisk>}
osdevice    ramdisk=[boot]\sources\boot.wim,{<GUID параметров ramdisk>}

Как правило, значения этих параметров в одном пункте загрузки одинаковые.
Мы будем для каждого дистрибутива 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). На неё можно взглянуть подробнее:


bcdedit /store <буква_диска>:\boot\bcd /enum {<GUID параметров ramdisk>}

Параметры устройств
-------------------
идентификатор           {<GUID параметров ramdisk>}
ramdisksdidevice        boot
ramdisksdipath          \boot\boot.sdi

Ничего особенного. Будем использовать эти же параметры устройства для других пунктов загрузки.


boot.sdi — Это по-сути образ пустого NTFS-тома. А в этот том уже монтируется образ из boot.wim.


Поскольку пункт по-умолчанию уже полностью настроен (кроме значений device и osdevice), то мы просто будем его копировать и изменять.
 


Добавление пунктов

  1. Скопировать пункт по-умолчанию:
    bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "<название нового пункта>"
    Будет выдано сообщение с GUID нового пункта. Приблизительно такое:
    Запись успешно скопирована в {<GUID новосозданного пункта>}
     
  2. Изменить в нём вышеупомянутые параметры:
    bcdedit /store <буква_диска>:\boot\bcd /set {<GUID новосозданного пункта>} device ramdisk=[boot]\<путь к дистрибутиву>\boot.wim,{<GUID параметров ramdisk>}
     
    bcdedit /store <буква_диска>:\boot\bcd /set {<GUID новосозданного пункта>} osdevice ramdisk=[boot]\<путь к дистрибутиву>\boot.wim,{<GUID параметров ramdisk>}
     
    Эти две команды отличаются только одним словом (выделено).

Примеры

Здесь приведено несколько примеров создания новых пунктов загрузки на основе пункта по-умолчанию.
Не копируйте тупо команды отсюда! У вас будут другие GUID-ы. Эти примеры только чтобы понять что к чему.


bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 7 (32-bit) Setup"
Запись успешно скопирована в {90fff3ef-3b91-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {90fff3ef-3b91-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_7_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {90fff3ef-3b91-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_7_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 7 (64-bit) Setup"
Запись успешно скопирована в {e5f9b9b7-3bb1-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {e5f9b9b7-3bb1-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_7_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {e5f9b9b7-3bb1-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_7_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 8.1 (32-bit) Setup"
Запись успешно скопирована в {cda5bc88-3bb4-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {cda5bc88-3bb4-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_8.1_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {cda5bc88-3bb4-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_8.1_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 8.1 (64-bit) Setup"
Запись успешно скопирована в {330e8636-3bb5-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {330e8636-3bb5-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_8.1_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {330e8636-3bb5-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_8.1_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 10 (32-bit) Setup"
Запись успешно скопирована в {87c0826c-3bb5-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {87c0826c-3bb5-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_10_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {87c0826c-3bb5-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_10_ia32\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Windows 10 (64-bit) Setup"
Запись успешно скопирована в {dd7288b2-3bb8-11e6-839b-d850e607fea0}.

bcdedit /store <буква_диска>:\boot\bcd /set {dd7288b2-3bb8-11e6-839b-d850e607fea0} device ramdisk=[boot]\WinDists\Win_10_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}
bcdedit /store <буква_диска>:\boot\bcd /set {dd7288b2-3bb8-11e6-839b-d850e607fea0} osdevice ramdisk=[boot]\WinDists\Win_10_x64\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f}

bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "Other Windows Setup (from \sources)"
The entry was successfully copied to {c9ff9b3a-3c53-11e6-839c-d850e607fea0}.

 


Завершение редактирования BCD

После того, как все пункты добавлены удаляем пункт по-умолчанию:
bcdedit /store <буква_диска>:\boot\bcd /delete {default}


 


Редактируем BCD для UEFI


Если вам нужна загрузка по UEFI, то вам нужно также отредактировать другое хранилище конфигурации загрузки (то, которым руководствуется BootMgFw.efi).


Тут всё точно так же как и там, за исключением пути к файлу BCD.
Т.е. вместо
bcdedit /store <буква_диска>:\boot\bcd
следует использовать
bcdedit /store <буква_диска>:\efi\microsoft\boot\bcd.


Нельзя просто так взятьПримечание. Вы не можете просто так взять и скопировать \boot\bcd в \efi\microsoft\boot\bcd! Они должны различаться как минимум параметрами path во всех пунктах, включая {memdiag}.


\windows\system32\boot\winload.exe vs \windows\system32\boot\winload.efi
\boot\memtest.exe vs \efi\microsoft\boot\memtest.efi

Update
Посредством UEFI могут загружаться все 64-битные версии Windows NT 6.0+, а из 32-битных — только Windows 8+.
Кроме того, в пунктах установки ОС, предшествующих Windows 8, не должно быть параметра IsolatedContext со значением Yes. Иначе, у вас просто не запустится среда предустановки этой системы (т.е. вы не сможете установить, например, Windows 7 x64 в режиме UEFI).


 


Windows PE


Итак, у нас при загрузке с флешки уже есть рабочее меню, где мы можем выбирать нужную версию Windows. Загрузитесь и убедитесь, что при выборе определённого пункта меню загружается соответствующая Windows PE.


 


Проблема


Мы ещё не всё сделали. Ведь, если попытаться установить какую-то из систем, то получим неприятный сюрприз:


No Sources Error


Почему это произошло? Дело в том, что программа установки ищет образ install.wim или сжатый install.esd в папке sources на всех доступных томах. Windows 10 в случае неудачи ещё пытается искать в папках x64\sources или x86\sources в зависимости от разрядности. В нашем случае — не находит нигде.
Она думает, что, наверное, нет драйвера от установочного носителя и предлагает его загрузить.


 


Варианты решения


Вы уже можете установить Windows из своей флешки, вручную правильно запустив программу установки. Есть несколько вариантов.
 


  • Файл ответов
    С помощью файла ответов можно указать множество параметров установки. В том числе образ, откуда устанавливать систему.
    Путь к образу указывается в элементе Microsoft-Windows-Setup | ImageInstall | OSImage | InstallFrom | Path.
    Заставить программу установки использовать файл ответов можно либо явно:
    setup.exe /unattend:<путь к файлу ответов>
    Либо поместив его по одному из заранее определённых путей.
    Но в этом способе есть проблема. В файле ответов должен быть абсолютный путь. Удобно, когда надо устанавливать из сети. Но не практично для нашего случая. Компьютеры разные — буква флешки будет меняться. Не наш вариант. А ещё и явно указывать путь к файлу ответов — ну вообще не вариант.
     
  • Запуск программы установки с параметром
    Можно найти образ с помощью сценария cmd.exe. А потом запустить установщик, явно указав ему куда смотреть:
    X:\sources\setup.exe /installFrom:<путь к install.wim или install.esd>
    Этот вариант подходит. Вы сможете установить систему как с обычного установочного ISO.
    Но есть вариант ещё лучше.
     
  • Запуск программы установки с флешки
    Можно запустить установку не с X: (монтированный образ boot.wim), а прямо с флешки! Таким образом не придётся явно указывать путь к install.wim или install.esd. Программа установки сама найдёт этот файл рядом с собой (в папке запуска)!
    Так, например, для установки Win 10 x64 нужно выполнить:
    <буква флешки>:\WinDists\Win_10_x64\setup.exe
    У этого способа много преимуществ. Ведь мы фактически полностью отказываемся от использования чего-либо из X:\sources, в пользу соответствующей папки на флешке. А это значит, что мы впоследствии можем модифицировать её без внесения изменений в образ boot.wim. Удобно же! Например, можно положить сюда индивидуальный (для этого конкретного дистрибутива) файл ответов (рядом с setup.exe) и он будет подхвачен согласно 6-му пункту отсюда.

 


Решение


Это всё хорошо, но мы же не хотим вручную запускать установку, правда? Хотим чтобы оно само. Значит надо сделать так, чтобы оно само запускало установку откуда надо.


 


Варианты автоматизации

Рассмотрим запуск Windows PE, чтобы понять, как с минимальным вмешательством заставить её выполнять то, что нам нужно.
В параметре реестра HKLM\SYSTEM\Setup\CmdLine указано первое приложение, которое выполняется после запуска WinPE. Это winpeshl.exe. Оно делает всякие полезные вещи, как то:


  1. Включает фоновую картинку (запуск WallpaperHost.exe)
  2. Проверяет, есть ли рядом файл winpeshl.ini. Если есть — выполняет из него команды.
  3. Инициализирует PNP
  4. Если файла winpeshl.ini не было — пытается запустить одно из приложений (в порядке приоритета):
    • X:\$Windows.~BT\sources\setup.exe
    • X:\setup.exe
    • X:\windows\system32\cmd.exe /k startnet.cmd

Нам нужно выполнить свой сценарий, который найдёт на флешке нужный файл и запустит его. Как видите, у нас не один вариант:


  • добавить файл сценария и winpeshl.ini с командой на запуск cmd.exe для выполнения нашего сценария
  • удалить/переименовать X:\setup.exe и отредактировать startnet.cmd

Я продемонстрирую вариант только с добавлением файлов (минимальное вмешательство, да).
 



Модифицируем boot.wim

На примере дистрибутива Windows 10 x64.
Итак, нам нужно редактировать содержимое тома X:, которое монтируется из boot.wim. Сначала узнаем индекс образа для монтирования:
 


dism /get-wimInfo /wimFile:<буква_флешки>:\WinDists\Win_10_x64\boot.wim

Cистема DISM
Версия: 6.3.9600.17031

Сведения об образе : <буква_флешки>:\WinDists\Win_10_x64\boot.wim

Индекс: 1
Имя : Microsoft Windows PE (x64)
Описание : Microsoft Windows PE (x64)
Размер (байт): 1 357 917 901

Индекс: 2
Имя : Microsoft Windows Setup (x64)
Описание : Microsoft Windows Setup (x64)
Размер (байт): 1 540 370 231

Операция успешно завершена.

Нам нужен не чистый Windows PE, а установочный — Windows Setup. Т.е. индекс — 2.
Ещё нам нужно создать папку, куда будем монтировать образ. Я создал C:\mnt.
 


dism /mount-wim /wimFile:<буква_флешки>:\WinDists\Win_10_x64\boot.wim /index:2 /mountDir:C:\mnt

Cистема DISM
Версия: 6.3.9600.17031

Подключение образа
[==========================100.0%==========================]
Операция успешно завершена.

Теперь, как и запланировали, копируем в C:\mnt\Windows\System32\ файлы winpeshl.ini и свой файл сценария (я назвал его runsetup.cmd).
 


Содержимое winpeshl.ini
[LaunchApps]
cmd.exe, "/k runsetup.cmd"

Содержимое runsetup.cmd
@echo off
Title TishSerg Windows Setup Bootstrapper v1.0
color 9f

ver
echo.
echo [%time%] Initializing Windows PE...
Wpeinit

echo.
Wpeutil UpdateBootInfo > nul
for /f "tokens=3" %%a in (
    'reg query "HKLM\System\CurrentControlSet\Control" /v PEBootRamdiskSourceDrive'
) do set RamdiskSourceDrive=%%a
echo [%time%] Detected setup media: %RamdiskSourceDrive%

echo.
:: Windows dist path Affix
set WinDistAfx=WinDists\Win

:: Find Windows arch Affix
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
    set WinArchAfx=ia32
) else (
    set WinArchAfx=x64
)

:: Find Windows version Affix
for /f "tokens=3" %%b in (
    'reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber'
) do set /a CurrentBuildNumber=%%b
if %CurrentBuildNumber% lss 6100 (
    :: Build < 6100 is Vista
    set WinVerAfx=Vista
    echo [%time%] Determined version of Windows: Vista (build %CurrentBuildNumber%^) %PROCESSOR_ARCHITECTURE%
) else if %CurrentBuildNumber% lss 7700 (
    :: Build < 7700 is 7
    set WinVerAfx=7
    echo [%time%] Determined version of Windows: 7 (build %CurrentBuildNumber%^) %PROCESSOR_ARCHITECTURE%
) else if %CurrentBuildNumber% lss 9300 (
    :: Build < 9300 is 8
    set WinVerAfx=8
    echo [%time%] Determined version of Windows: 8 (build %CurrentBuildNumber%^) %PROCESSOR_ARCHITECTURE%
) else if %CurrentBuildNumber% lss 9700 (
    :: Build < 9700 is 8.1
    set WinVerAfx=8.1
    echo [%time%] Determined version of Windows: 8.1 (build %CurrentBuildNumber%^) %PROCESSOR_ARCHITECTURE%
) else (
    :: Build > 9700 is 10
    set WinVerAfx=10
    echo [%time%] Determined version of Windows: 10 (build %CurrentBuildNumber%^) %PROCESSOR_ARCHITECTURE%
)

echo.
echo [%time%] Launching Windows Setup (%RamdiskSourceDrive%\%WinDistAfx%_%WinVerAfx%_%WinArchAfx%\setup.exe^)
%RamdiskSourceDrive%\%WinDistAfx%_%WinVerAfx%_%WinArchAfx%\setup.exe

:: When closed Windows Setup
color 2e
echo.
echo [%time%] Windows Setup closed
echo WScript.Quit MsgBox("You have closed Windows Setup."+vbCrlf+"Run 'System restore' instead? Or reboot?"+vbCrlf+vbCrlf+"Yes - Run 'System restore'"+vbCrlf+"No - Reboot"+vbCrlf+"Cancel - 'Just give me a Command line!'", vbQuestion+vbYesNoCancel, "Setup cancelled") > msgdlg.vbs
cscript msgdlg.vbs > nul
if %errorLevel% == 6 (
    echo [%time%] Here is Task Manager for you :^)
    start taskmgr
    echo [%time%] Run 'System restore' (%SystemDrive%\Sources\recovery\RecEnv.exe^)
    %SystemDrive%\Sources\recovery\RecEnv.exe
) else if %errorLevel% == 7 (
    echo [%time%] Will reboot now...
    Wpeutil Reboot
)

Зачем такой сложный `runsetup.cmd`?

А за тем, чтобы файлы winpeshl.ini и runsetup.cmd были универсальны для всех дистрибутивов Windows NT 6.0+. Т.е. их не нужно отдельно модифицировать под установку Win7, Win8 и т.п. Путь к папке дистрибутива определяется автоматически.


Также добавлен простой способ запуска Восстановления системы, т.к. из-за прямого запуска \sources\setup.exe вместо X:\setup.exe мы теряем страницу:
image


Разница только в том, что в нашем случае мы язык выбираем уже после запуска установки Windows или Восстановления системы. В оригинальных ISO образах X:\setup.exe сообщает языковые настройки запускаемым через него приложениям.


Внимание! В предоставленном мной runsetup.cmd путь к программе установки определяется по шаблону <буква_флешки>:\\<путь_и_префикс_к_папкам_дистрибутивов>_<версия>_<архитектура>\setup.exe
(строка %RamdiskSourceDrive%\%WinDistAfx%_%WinVerAfx%_%WinArchAfx%\setup.exe). Т.е. в моём случае сценарий будет формировать пути (в зависимости от того, из какого дистрибутива был запущен) наподобие:


  • D:\WinDists\Win_7_ia32\setup.exe
  • D:\WinDists\Win_10_x64\setup.exe

Если вы создавали на флешке другую структуру папок и их названий — сделайте соответствующие изменения.


Осталось отмонтировать образ с сохранением изменений:
 


dism /unmount-wim /mountDir:C:\mnt /commit

Cистема DISM
Версия: 6.3.9600.17031

Файл образа: <буква_флешки>:\WinDists\Win_10_x64\boot.wim
Индекс образа: 2
Сохранение образа
[==========================100.0%==========================]
Отключение образа
[==========================100.0%==========================]
Операция успешно завершена.

Готово! Теперь нужно повторить эти действия для остальных boot.wim. После этого у вас на флешке будут все желаемые дистрибутивы, которые вы сможете просто выбирать из меню и продолжать установку как будто на флешке только одна версия Windows!


 


Чего бы улучшить?


Тут ещё несколько советов по улучшению вашей установочной флешки.


 


Пропуск ввода ключа продукта и выбор любой редакции Windows


Для этого нужно поместить файлик ei.cfg рядом с программой установки


Содержимое `ei.cfg`

[Channel]
Retail


Помещать нужно в папку откуда запускается setup.exe. Постольку у нас он запускается с флешки, а не с ramdisk-а (boot.wim), то и кладём ei.cfg в папки дистрибутивов на флешке. (+1 преимущество от запуска установки прямо с флешки, вместо запуска с ramdisk-а с параметром /installFrom).


 


Запуск приложения реального режима из меню Диспетчера загрузки Windows


На примере `Grub4Dos`
bcdedit /store <буква_флешки>:\boot\bcd /create /d "Grub4Dos Menu" /application BootSector
Запись {b3923807-3ebb-11e6-83a0-d850e607fea0} успешно создана.

bcdedit /store <буква_флешки>:\boot\bcd /set {b3923807-3ebb-11e6-83a0-d850e607fea0} device boot
bcdedit /store <буква_флешки>:\boot\bcd /set {b3923807-3ebb-11e6-83a0-d850e607fea0} path \grldr

bcdedit /store <буква_флешки>:\boot\bcd /DisplayOrder {b3923807-3ebb-11e6-83a0-d850e607fea0} /AddFirst

Таким образом можно сделать возможность циклического перехода из одного меню в другое без перезагрузки компьютера. И уже не важно какой из загрузчиков был запущен первым: BOOTMGR или GRLDR.


 


Прогрессбар при загрузке boot.wim на ramdisk


В новейших BootMgr сделали загрузку образа boot.wim на ramdisk без анимации. Т.е. просто выводится статический логотип Windows и всё, ждите. Можно вернуть прогрессбар, как было раньше. Он хоть будет давать информацию о степени загрузки WinPE в оперативную память.
 


bcdedit /store <буква_флешки>:\boot\bcd /set {<GUID пункта установки Windows>} BootMenuPolicy Legacy

Правда, вместе с этим вы отключите новый стиль меню дополнительных параметров и сообщений об ошибках (на голубом фоне, с управлением функциональными клавишами), но то такое (^̮^)


 


Подробный вывод загружаемых файлов


Это в дополнение к предыдущему украшательству. Работает по Windows 7 включительно. В Windows 8+ майки это выпилили почему-то (не даёт эффекта).
 


bcdedit /store <буква_флешки>:\boot\bcd /set {<GUID пункта установки Windows>} Sos True

Применив предыдущие два украшательства прикольнее всего грузится Windows 7. Но это всё — баловство.


 


Итог


Итак, что мы сделали:


  1. Отформатировали установочный носитель и сделали его загрузочным
  2. Скопировали на него файлы Диспетчера загрузки Windows (взятые из одного из ISO-образов)
  3. Создали структуру папок с файлами дистрибутивов Windows (содержимое [sources] каждого из ISO-образов)
  4. Настроили меню Диспетчера загрузки Windows
  5. Добавили в boot.wim каждого дистрибутива по два своих файла

На этом всё. Вопросы, замечания и пожелания приветствуются (ʘ‿ʘ)

Теги:
Хабы:
Всего голосов 34: ↑33 и ↓1+32
Комментарии108

Публикации

Истории

Ближайшие события

22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань