2018-08-13

Установка Windows из *.WIM или *.ESD образа

Пройдемся еще немножко по теме установки ОС Windows. На этот раз, речь пойдет о использовании стандартного установщика для организации мультиустановки. И напоследок рассмотрим ручную установку из *.wim или *.esd архива.



Содержание




Как Происходит Установка ОС Windows


Разберем процесс установки детально. Сначала происходит подготовка установочного диска. Под диском я подразумеваю любой накопитель, с которого возможна установка Windows, будь то флешка, CD-диск и т.д. Выглядит данный процесс следующим образом.

Скачивается ISO-образ, с необходимой редакцией ОС. С помощью данного образа подготавливается установочная флешка, или установочный CD-диск. Либо скачивается официальная программа от Microsoft, для создания установочного диска. И уже с ее помощью происходит подготовка установочного диска.

Следующий этап, загрузка с подготовленного установочного диска. На этом этапе происходит запуск среды предустановки (WinPE), и выполнение установочной программы Windows.

Установочная программа, в свою очередь, выполняет следующие действия. Выбор диска, на который будет происходить установка. Создание разделов. Копирование файлов ОС Windows на созданный или указанный раздел. Установка загрузчика.

Работа с установочным диском на этом завершается. Поэтому, формально сам процесс установки на этом завершается. Все последующее, это просто инициализация скопированной копии ОС Windows.


Стандартный Установщик Windows


Представлен исполняемым файлом \sources\setup.exe установочного диска Windows.


И ссылающийся на него файл \setup.exe в корне диска.


Стандартный установщик, так же присутствует в образе среды предустановки boot.wim. Пути расположения идентичны.

\sources\setup.exe


\setup.exe


Как говорилось ранее, задача у данной программы выполнить установку ОС Windows. Теперь немного фактов о стандартном установщике Windows.

Windows-установщик является обычной программой. То есть при желании, его можно сохранить как отдельную программу вне установочного диска, например на флешке, и запускать по мере необходимости. Все файлы стандартного установщика расположены в папке \sources.

Файл \setup.exe в корне установочного диска, или среды предустановки, на самом деле не является самостоятельным установщиком. Все что он делает, это запускает файл \sources\setup.exe.

Для Windows-установщика не важна разрядность устанавливаемой ОС. К примеру, 32-битный установщик, без проблем выполнит установку 64-битной версии ОС Windows из указанного *.wim/*.esd архива.

Установочный *.wim/*.esd архив, не обязательно должен находиться в папке \sources для выполнения установки. Установщику можно указывать путь до архива, который он в последствии будет извлекать.

Установщик Windows расположенный в boot.wim образе содержит в себе функционал восстановления системы. Исполняемый файл, запускающий утилиту восстановления системы, расположен по пути \sources\recovery\RecEnv.exe.



Мультиустановка с Помощью Установщика Windows


Теперь, когда нам известно о возможностях стандартного установщика, попробуем организовать с его помощью установку различных версий ОС Windows. Для теста, я взял четыре установочных *.wim/*.esd (располагаются в папке \sources установочного ISO-образа, и обычно имеют имя install.wim или install.esd) архива операционных систем Windows 7 64-bit, Windows 8.1 64-bit, Windows 10 64-bit и Windows 10 32-bit.


Установочные файлы были размещены в директории WinSetup\WinImage. Пути не обязательно должны быть такими же, меняйте их по своему усмотрению, просто учитывайте ваши изменения с дальнейшим описанием.

Скопируем стандартный установщик Windows с boot.wim образа, 32-x битной версии установочного диска, в папку WinSetup. Весь установщик, с необходимыми ему файлами, расположен в папке \sources, в корне самого объемного по размеру индекса, файла boot.wim.


Почему копировать папку sources лучше из файла boot.wim, а не из корня установочного ISO-образа? Ответ банален - из-за размера. Папка sources из файла образа boot.wim имеет вдвое меньший объем, чем аналогичная в корне установочного диска. Учитывая, что обе версии одинаково справляются со своей задачей, выбор пал на меньшую по размерам.

Перейдем в скопированную папку sources, и запустим установщик setup.exe.


В результате, получаем ошибку о том, что системе Windows не удалось найти файл boot.wim, очень необходимый, по мнению установщика.

"Windows не может найти требуемый файл установки [boot.wim]. Убедитесь, что источник установки действителен и запустите установку заново. Код ошибки: 0x80070002"


Дело в том, что установщик понимает, что он выполняется в полноценной версии Windows, а не в среде предустановки. И ожидает увидеть файлы boot.wim и install.wim (esd), в папке sources. Если он их не находит, то считает, что установка не может быть выполнена, так как установочный диск является не полноценным. К сведению, аналогичные действия в загруженной WinPE, не вызвали бы таких ошибок.

Придется дать установщику то, что он просит. Сама мысль о том, что папка sources будет увеличена в размере на на 350 МБ, приводит в ужас. Ведь немного ранее мы уже экономили на папке sources.


Попробуем обмануть установщик. Самое первое, что может прийти в голову, это создать пустой файл с именем boot.wim, и подложить в папку sources.


Но, установщик не так прост как кажется. Получаем ошибку - "Системе Windows не удается создать требуемую папку установки. Код ошибки: 0x8007000B".


То есть, он не просто проверяет наличие файла boot.wim, но проверяет его содержимое на валидность. Тогда остается последний вариант. Скопировать корректный файл boot.wim с установочного диска, и опустошить его, то есть максимально уменьшить его размер.

Если нет желания возиться с командной строкой, то можете скачать уже максимально опустошенный мною файл boot.wim (2.44 KB). Информацию о том, как уменьшить размер файла boot.wim, и в принципе любого другого *.wim архива, можно прочесть в этом разделе.

После того, как у нас на руках есть уменьшенный в размере файл boot.wim, копируем его в папку sources.


Запускаем setup.exe и получаем сообщение - "Windows не удалось собрать данные для [OSImage], так как указанный файл образа [install.wim] не существует.".


Из текста сообщения понятно, что теперь все хорошо, не хватает лишь файла install.wim для осуществления установки.

На этом этапе никаких хитростей не понадобится. Ранее уже говорилось, что установщику можно указать с какого файла производить установку. Делается это с помощью запуска файла sources\setup.exe с параметром /installfrom:"путь_до_wim_или_esd_архива". Остальные параметры установщика можно посмотреть по адресу https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-setup-command-line-options.

Так как у нас четыре установочных архива, создадим рядом с папкой sources четыре *.cmd скрипта, для запуска установки каждого из них. Перечислим их с описанием их содержимого, и примером запуска:


Win7x64.cmd - Запуск установки Windows 7 64-bit.

@echo off
@pushd %~dp0
cd sources
setup.exe /installfrom:..\WinImage\Win7Ult64.esd



Win8x64.cmd - Запуск установки Windows 8 64-bit.

@echo off
@pushd %~dp0
cd sources
setup.exe /installfrom:..\WinImage\Win81Pro64.wim



Win10x64.cmd - Запуск установки Windows 10 64-bit.

@echo off
@pushd %~dp0
cd sources
setup.exe /installfrom:..\WinImage\Win10Pro64.esd




Win10x86.cmd - Запуск установки Windows 10 32-bit.

@echo off
@pushd %~dp0
cd sources
setup.exe /installfrom:..\WinImage\Win10Pro86.esd


Все работает! Последнее, что можно сделать, это создать либо единый *.cmd скрипт, либо приложение с графическим интерфейсом, с возможностью выбора устанавливаемой версии Windows.

Пример графического меню созданного с помощью AutoIt.


Исходный код следующий:

#NoTrayIcon
#RequireAdmin

#include <buttonconstants.au3>
#include <guiconstantsex.au3>
#include <staticconstants.au3>
#include <windowsconstants.au3>

$MainWin = GUICreate("Install Menu", 297, 322,- 1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

$b1 = GUICtrlCreateButton("Windows 7 64-bit", 8, 8, 281, 65)
$b2 = GUICtrlCreateButton("Windows 8.1 64-bit", 8, 80, 281, 65)
$b3 = GUICtrlCreateButton("Windows 10 64-bit", 8, 152, 281, 65)
$b4 = GUICtrlCreateButton("Windows 10 32-bit", 8, 224, 281, 65)

$link = GUICtrlCreateLabel("http://www.BootDev.ru/", 88, 296, 121, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")

GUICtrlSetBkColor(-1, 0xFFFFFF)

GUISetIcon("icon.ico")

GUISetState(@SW_SHOW)

FileChangeDir(@ScriptDir)

Global $setup = "sources\setup.exe /installfrom:"

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

  Case $b1 ; Windows 7 64-bit
   Run($setup & "WinImage\Win7Ult64.esd")

  Case $b2 ; Windows 8.1 64-bit
   Run($setup & "WinImage\Win81Pro64.wim")

  Case $b3 ; Windows 10 64-bit
   Run($setup & "WinImage\Win10Pro64.esd")

  Case $b4 ; Windows 10 32-bit
   Run($setup & "WinImage\Win10Pro86.esd")

  Case $link
   ShellExecute("http://www.bootdev.ru")
 EndSwitch
WEnd

Скрипт скомпилирован в исполняемый файл WinSetup.exe. Располагаться он должен рядом с папкой sources.


Созданное меню более удобно для использования, и заменяет по функционалу все написанные ранее *.cmd скрипты. Особенно, данное удобство будет заметно при интеграцию его в среду предустановки, немного доработав поиск установочных архивов на поиск их на внешнем носителе. В общем, какой вариант запуска использовать, это дело конкретной потребности.


Уменьшение Размера WIM-архива


Единственный способ уменьшить размер wim-архива, это избавиться от ненужного содержимого в нем. Но здесь есть один подвох. При удалении данных, они физически не удаляются, а как бы перемещаются в раздел удаленных. Размер wim-файла при этом даже немного увеличивается. Разберем все более подробно на примере файла boot.wim. Текущая цель создать пустой wim-файл.

Создадим папку (это скорее для удобства), в моем случае это папка E:\WIM, и поместим в нее оригинальный файл boot.wim.


Размер его на данный момент составляет 336 MB. Запустим командную, строку от имени администратора, и перейдем в ней в каталог с нашим файлом boot.wim.


Посмотрим информацию о файле boot.wim, выполнив команду dism /get-wiminfo /wimfile:boot.wim.


Видим, что архив содержит две версии Windows - первая Microsoft Windows PE размером ~1395 MB (среда предустановки), вторая Microsoft Windows Setup размером ~1580 MB (среда предуставновки + установщик).

Через 7-Zip, boot.wim на данный момент выглядит так:


Удалим второй индекс, вместе со всем его содержимым. Выполним для этого команду dism /delete-image /imagefile:boot.wim /index:2.


Снова выведем информацию о boot.wim, и проверим содержимое через 7-Zip.


Командная строка показывает то что индекса 2 больше нет. Размер boot.wim при этом вырос на 1 MB. И только 7-Zip показывает, что удаленные данные, размером в ~100 MB, находятся в секции [DELETED].

Индекс 1 удалить невозможно (наша цель, напомню, уменьшить максимально файл boot.wim), потому что он обязательно должен присутствовать в wim-архиве. Поэтому остается только смонтировать 1-й индекс, и удалить файлы вручную с сохранением проделанных изменений.

Для монтирования нам потребуется какая-нибудь папка. Содержимое смонтированного архива, будет отображено в ней. Создадим папку с именем mnt рядом с файлом boot.wim.


Смонтируем первый индекс в папку mnt, выполнив команду dism /mount-image /imagefile:boot.wim /index:1 /mountdir:mnt.


В папке mnt появится содержимое архива boot.wim.


Открываем Far Manager от имени администратор, переходим в папку mnt и удаляем ее содержимое. Именно он позволяет полностью, без проблем, удалить все файлы.




Закрываем Far Manager. Закрываем все окна, в которых открыта папка mnt. Возвращаемся в командную строку, выполняем размонтирование файла boot.wim с сохранением проделанных изменений. Вводим для этого команду dism /unmount-image /mountdir:mnt /commit.


Снова проверим информацию о boot.wim.


Размер первого индекса 0. Сам архив увеличился еще на 1 MB.

Последнее что нужно сделать, это экспортировать первый индекс в новый архив. Данное действие позволит избавится от так называемого раздела [DELETED], который хранит в себе удаленные данные.

Выполняем команду dism /export-image /sourceimagefile:boot.wim /sourceindex:1 /destinationimagefile:new_boot.wim.


Появится новый архив new_boot.wim размером 2.44 KB. Операция уменьшения boot.wim архива на этом, успешно выполнена.



Ручная Установка



Все рассказанное до этого момента, предполагало наличие установщика. То есть программы, которая за вас выполнит разметку диска, копирование файлов и установку загрузчика. В этой главе, и ее подглавах, мы рассмотрим как выполнить установку с *.wim или *.esd архива вручную.

Сразу напрашивается вопрос - А зачем нужна установка вручную, ведь много программ которые могут автоматизировать данный процесс, WinNTSetup или тот же стандартный установщик? Данный вариант можно рассматривать как "аварийный". Например, у вас нет под рукой необходимого ПО, или используемый вами WinPE не содержит его. Или вы находитесь в ситуации когда нет времени, а установку уже надо делать. Я это все к тому, что знать о ручной установке все же будет полезно.

Все дальнейшие действия будут проводиться на виртуальном жестком диске VHD. Так же, будет производиться загрузка данного VHD в виртуальной машине VirtualBox, для проверки корректности работы, после проделанных действий.


Разметка Диска


Возможные таблицы разделов на данный для дисков, это MBR или GPT. С MBR-диска можно загружаться как в BIOS, так и в UEFI системах (legacy mode). С GPT-диска, только в UEFI. Рассмотрим создание обоих типов таблиц разделов.


Diskpart


Рассмотрим создание таблицы разделов с помощью консольной утилиты diskpart. Предназначена она для выполнения различных манипуляций с дисками и разделами. Присутствует в Windows с 2000-й версии.

Все дальнейшие действия в данной программе, будут проводиться для диска под номером 2 (виртуальный жесткий диск, о котором говорилось выше).


Узнать номер целевого диска можно командой list disk, а командой select disk X, где X номер диска, можно выбрать указанный диск для выполнения дальнейших манипуляций над ним.


MBR


Для диска в формате MBR потребуется 2 раздела. Первый системный, размером в 100 MB, на котором будут располагаться файлы загрузчика. И второй основной, для операционной системы. Хотя можно обойтись и одним разделом для всего.

Запускаем diskpart  (Win+R, вводим diskpart и нажимаем ENTER) и выполняем следующую последовательность команд:

rem Выбираем целевой диск
select disk 2

rem Очищаем выбранный диск от таблицы разделов
clean

rem Создаем первый раздел размером в 100 MB
create partition primary size=100

rem Помечаем раздел как активный
active

rem Форматируем раздел в файловую систему NTFS и выставляем метку System
format quick fs=ntfs label="System"

rem Присваиваем разделу букву S
assign letter="S"

rem Создаем второй раздел занимающий все оставшееся пространство диска
create partition primary

rem Форматируем раздел в файловую систему NTFS и выставляем метку Windows
format quick fs=ntfs label="Windows"

rem Присваиваем разделу букву W
assign letter="W"




GPT


Для диска в GPT формате потребуется 3 раздела. Первый EFI раздел, с файловой системой FAT32, размером 100 MB. В нем будет располагаться загрузчик. Второй MSR раздел, размером в 128 MB. Служебный раздел для ОС Windows, не предназначен для хранения данных. И последний основной раздел, для операционной системы.

Запускаем diskpart  (Win+R, вводим diskpart и нажимаем ENTER) и выполняем следующую последовательность команд:

rem Выбираем целевой диск
select disk 2

rem Очищаем выбранный диск от таблицы разделов
clean

rem Конвертируем таблицу разделов в GPT формат
convert gpt

rem Создаем EFI раздел размером в 100 MB
create partition efi size=100

rem Форматируем раздел в файловую систему FAT32 и выставляем метку System
format quick fs=fat32 label="System"

rem Присваиваем разделу букву S
assign letter="S"

rem Создаем служебный раздел MSR размером в 128 MB
create partition msr size=128

rem Создаем третий раздел занимающий все оставшееся пространство диска
create partition primary

rem Форматируем раздел в файловую систему NTFS и выставляем метку Windows
format quick fs=ntfs label="Windows"

rem Присваиваем разделу букву W
assign letter="W"



Пару слов по поводу MSR раздела, команда create partition msr size=128. При выполнении команды convert gpt, MSR раздел создается автоматически.


Как можно заметить, до выполнения команды convert gpt, разделы на жестком диске отсутствовали. А после выполнения, появился раздел размером в 128 MB.


Вывод детальной информации о созданном разделе, только подтверждает, что это MSR раздел.
Возможно, я не уверен, старые версии diskpart не обладали таким поведением. Хотя в Windows 7 поведение полностью аналогичное, но ОС при этом была обновленная. Поэтому команду в списке я все же оставил.


Извлечение Файлов


Данный шаг, является следующим после разметки диска. Выполнять извлечение установочного архива будем выполнять с помощью консольной утилиты DISM.

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

Сам процесс извлечения состоит из двух этапов. Определение извлекаемой версии архива. Как известно *.wim/*.esd архивы могут содержать несколько версий содержимого, разбитого по индексам. И последний этап, извлечение выбранного индекса в указанный раздел.


DISM


Для работы dism нужны права администратора, поэтому все дальнейшие действия необходимо выполнять в командной строке запущенной с соответствующими правами.

В командной строке, переходим в директорию, в которой расположен установочный архив. В моем случае это директория WinSetup\WinImage.


Выполнив команду dir, выводим список файлов, чтобы посмотреть имя архива с которым будем работать далее.


Выводим информацию о выбранном архиве введя команду dism /get-wiminfo /wimfile:Win10Pro64.esd, чтобы определить индекс извлекаемого содержимого.


Выполняем извлечение выбранного индекса командой dism /apply-image /imagefile:Win10Pro64.esd /index:4 /applydir:W:\. W:\ в данном случае, это раздел, который создавался в предыдущей главе, и предназначался для размещения ОС Windows.


Извлечение файлов на этом завершено. Содержимое диска W:\ представлено на скриншоте ниже.



Установка Загрузчика


Перед установкой загрузчика, в системе должны быть подключены, оба созданных ранее раздела S:\ и W:\. Подключить разделы можно с помощью программы diskpart, либо в оснастке Управление дисками.

Для diskpart, делается с помощью следующих команд:

rem Узнаем номер необходимого диска
list disk

rem Выбираем необходимый диск
select disk 2

rem Выводим список разделов выбранного диска
list partition

rem Выбираем первый раздел диска
select partition 1

rem Монтируем первый раздел под буквой S
assign letter=S

rem Выыбираем второй раздел диска
select partition 2

rem Монтируем второй раздел под буквой W
assign letter=W

rem Выходим из diskpart
exit



В оснастке Управление дисками, все делается через контекстное меню нужного раздела.


Процесс довольно простой и понятный, поэтому не нуждается в подробном описании.

Теперь, когда подключены оба раздела, можно приступать к установке загрузчика. Возможны два варианта, в зависимости от используемой таблицы разделов - установка BIOS версии (MBR), или установка EFI версии (GPT).


BIOS


Для дисков размеченных в стиле MBR, потребуется установить MBR-запись, и выполнить копирование файлов загрузчика на раздел S:\. Делается это довольно просто, с помощью консольных программ bootsect и bcdboot. Сами команды будут иметь следующий вид, выполнять их нужно в командной строке, запущенной от имени администратора:

:: Устанавливаем загрузочный код Windows Boot Manager в MBR область диска
bootsect /nt60 S: /mbr

:: Переходим в раздел W:\ с распакованными файлами Windows
W:

:: Переходим в директорию System32 распакованной системы
cd W:\Windows\System32

:: Устанавливаем BIOS версию загрузчка Windows Boot Manager в раздел S:\
bcdboot W:\Windows /s S: /f BIOS


Загрузчик установлен. На диске S:\ появятся файлы загрузчика.



UEFI


Для дисков с таблице разделов GPT, для установки загрузчика достаточно выполнить только копирование файлов загрузчика на раздел S:\. Выполняется эта операция с помощью консольной утилиты bcdboot. Выполнять ее запуск нужно в командной строке запущенной от имени администратора. Полный пример команд будет выглядеть так:

:: Переходим в раздел W:\ с распакованными файлами Windows
W:

:: Переходим в директорию System32 распакованной системы
cd W:\Windows\System32

:: Устанавливаем BIOS версию загрузчка Windows Boot Manager в раздел S:
bcdboot W:\Windows /s S: /f UEFI


Загрузчик установлен. На диске S:\ появится папка с UEFI загрузчиком.



Тестовый Запуск


Проверим ручную установку, подключив подготовленный VHD-образ в виртуальную машину VirtualBox.


Результат загрузки.


Операционная система успешно установилась и загрузилась.


Итог


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

Комментариев нет :

Отправить комментарий