Здравствуйте. Сегодня я расскажу как можно создать единый установочный носитель с множеством разных версий Windows не прибегая к использованию стороннего ПО. Таким образом вы будете полностью понимать какие манипуляции мы выполняем.
Также я сделаю упор на то, чтобы как можно меньше энтропии привносить в этот мир изменять структуру оригинальных установочных дистрибутивов.
Кому интересно — прошу под кат.
[boot]
[sources]
bootmgr
[efi]
.[sources]
в [sources_w8x64]
. Потом покопировал с остальных ISO-шников только [sources]
, попутно переименовывая их. И всё. Больше никаких телодвижений кроме записи загрузочного сектора и активации раздела флешки я не делал. В результате у меня была приблизительно такая структура файлов на флешке:[boot]
[sources]
[sources_w7x86]
[sources_w8x64]
[sources_w8x86]
bootmgr
[sources]
.[boot]
[sources]
[sources_w7x64]
[sources_w7x86]
[sources_w8x64]
[sources_w8x86]
[sources_w10x86]
bootmgr
Хватит это терпеть!
sources\install.wim
располагается множество разных версий системы), поскольку такой способ имеет много недостатков, среди которых:DiskPart
list disk
select disk <номер вашей флешки (можно идентифицировать по размеру из предыдущей команды)>
list part
select part <номер раздела, который требуется сделать активным (обычно 1)>
active
exit
[boot]
[efi] - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))
bootmgr
bootmgr.efi - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))
[sources]
. Но нам просто важен факт, что 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-шников. До сих пор на флешке было занято лишь несколько десятков МиБ. А теперь — несколько ГиБ.[boot]
|- bcd
[efi]
|- [microsoft]
|- [boot]
|- bcd - только если нужна загрузка по UEFI (ФС флешки должна быть FAT32! (на некоторых компьютерах работает и с NTFS))
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>}
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
), то мы просто будем его копировать и изменять.bcdedit /store <буква_диска>:\boot\bcd /copy {Default} /d "<название нового пункта>"
Запись успешно скопирована в
{<GUID новосозданного пункта>}
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>}
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}.
bcdedit /store <буква_диска>:\boot\bcd /delete {default}
BootMgr.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
install.
wim
или сжатый install.
esd
в папке sources
на всех доступных томах. Windows 10 в случае неудачи ещё пытается искать в папках x64\sources
или x86\sources
в зависимости от разрядности. В нашем случае — не находит нигде.Microsoft-Windows-Setup | ImageInstall | OSImage | InstallFrom | Path
.setup.exe /unattend:<путь к файлу ответов>
cmd.exe
. А потом запустить установщик, явно указав ему куда смотреть:X:\sources\setup.exe /installFrom:<путь к install.wim или install.esd>
X:
(монтированный образ boot.wim
), а прямо с флешки! Таким образом не придётся явно указывать путь к install.wim
или install.esd
. Программа установки сама найдёт этот файл рядом с собой (в папке запуска)!<буква флешки>:\WinDists\Win_10_x64\setup.exe
X:\sources
, в пользу соответствующей папки на флешке. А это значит, что мы впоследствии можем модифицировать её без внесения изменений в образ boot.wim
. Удобно же! Например, можно положить сюда индивидуальный (для этого конкретного дистрибутива) файл ответов (рядом с setup.exe
) и он будет подхвачен согласно 6-му пункту отсюда.HKLM\SYSTEM\Setup\CmdLine
указано первое приложение, которое выполняется после запуска WinPE. Это winpeshl.exe
. Оно делает всякие полезные вещи, как то:WallpaperHost.exe
)winpeshl.ini
. Если есть — выполняет из него команды.winpeshl.ini
не было — пытается запустить одно из приложений (в порядке приоритета):winpeshl.ini
с командой на запуск cmd.exe
для выполнения нашего сценарияX:\setup.exe
и отредактировать startnet.cmd
boot.wim
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
Операция успешно завершена.
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
).[LaunchApps]
cmd.exe, "/k 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
)
winpeshl.ini
и runsetup.cmd
были универсальны для всех дистрибутивов Windows NT 6.0+. Т.е. их не нужно отдельно модифицировать под установку Win7, Win8 и т.п. Путь к папке дистрибутива определяется автоматически.\sources\setup.exe
вместо X:\setup.exe
мы теряем страницу:X:\setup.exe
сообщает языковые настройки запускаемым через него приложениям.runsetup.cmd
путь к программе установки определяется по шаблону <буква_флешки>:\\<путь_и_префикс_к_папкам_дистрибутивов>_<версия>_<архитектура>\setup.exe
%RamdiskSourceDrive%\%WinDistAfx%_%WinVerAfx%_%WinArchAfx%\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!ei.cfg
рядом с программой установкиsetup.exe
. Постольку у нас он запускается с флешки, а не с ramdisk-а (boot.wim
), то и кладём ei.cfg
в папки дистрибутивов на флешке. (+1 преимущество от запуска установки прямо с флешки, вместо запуска с ramdisk-а с параметром /installFrom
).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
на ramdiskBootMgr
сделали загрузку образа boot.wim
на ramdisk без анимации. Т.е. просто выводится статический логотип Windows и всё, ждите. Можно вернуть прогрессбар, как было раньше. Он хоть будет давать информацию о степени загрузки WinPE в оперативную память.bcdedit /store <буква_флешки>:\boot\bcd /set {<GUID пункта установки Windows>} BootMenuPolicy Legacy
bcdedit /store <буква_флешки>:\boot\bcd /set {<GUID пункта установки Windows>} Sos True
[sources]
каждого из ISO-образов)boot.wim
каждого дистрибутива по два своих файлаК сожалению, не доступен сервер mySQL