Грузим ВСЁ по сети в DualBoot. Часть 6: Загружаем Windows Installer и ставим ОС

Грузим ВСЁ по сети в DualBoot. Часть 6: Загружаем Windows Installer и ставим ОС

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

Часть 1: Теория и анализ предложений
Часть 2: Первые грабли в процессе загрузки MemTest86+
Часть 3: Добавляем поддержку UEFI
Часть 4: Загружаем Strelec WinPE
Часть 5: Загружаем полноценный дистрибутив Linux Ubuntu
Часть 6: Загружаем Windows Installer и ставим ОС
Часть 7: Устанавливаем Windows на iSCSI диск по сети
Часть 8: Жонглируем пунктами iPXE меню
Часть 9: Обслуживание сервера и обновление образов

Неудачные попытки

Казалось бы, ничего сложного. Сначала я пробовал загрузить образ через memdisk — не вышло из-за требований по ОЗУ. Потом я нашел проект FiraDisk. Суть в том, что он подгружает драйвер в установочную WinPE (boot.wim), который монтирует виртуальный привод напрямую из файла. Сначала выглядит неплохо, но у него есть пару фатальных недостатков:

  • Предварительно драйвер необходимо интегрировать в установочный образ Windows, то есть если образов несколько, то в каждый. Долго и неудобно.
  • Даже с интегрированным драйвером у меня не получилось с помощью FiraDisk установить Win7 или Win10 (уже не помню)

Также я пробовал загружать установщик по iSCSI, таким же образом, как Strelec WinPE, однако установщик отказывался ставить ОС на локальный диск, так как «Данный компьютер не поддерживает загрузку с этого диска».

В общем эту идею решено было забросить и придумать что-то получше. Тут появляется wimboot, часть проекта iPXE.

Алгоритм работы

Итак, wimboot — legacy/uefi загрузчик образов winpe с поддержкой http. В результате алгоритм загрузки следующий:

  1. Из-под iPXE запускаем wimboot. Как аргументы кормим: сам boot.wim, bcd и скрипт, который нужно сделать после загрузки WinPE
  2. После того, как WinPE загружается, скриптом монтируем по SMB в роли сетевой папки установщик Windows и запускаем setup.exe.
  3. setup.exe видит образ, локальные диски и успешно дает установить ОС.

Настройка Samba

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

apt install samba -y
systemctl enable smbd
systemctl enable nmbd
mkdir /pxe/win_installer
cat > /etc/samba/smb.conf << EOF
workgroup = WORKGROUP
server string = PXEServer
netbios name = PXEServer
security = user
map to guest = bad user
level2 oplocks = no
oplocks = no
socket options = TCP_NODELAY
read raw = Yes
write raw = Yes
use sendfile = true

[pxe]
path = /pxe
read only = no
guest ok = yes
public = yes
writable = yes
force user = root
force group = root

[win_installer]
path = /pxe/win_installer
read only = yes
guest ok = yes
public = yes
writable = no
force user = root
force group = root
EOF
service smbd restart

Распаковывать ISO образы напрямую неудобно и долго, поэтому будем монтировать. Находим где-нибудь установочный образ Windows и копируем его в /pxe/images. Я скачал последний образ Windows 10 и скопировал в папку с именем Windows.10.x64.20H2.oct20.iso. Теперь монтируем.

mkdir /pxe/win_installer/10x64
mount -o loop /pxe/images/Windows.10.x64.20H2.oct20.iso  /pxe/win_installer/10x64

Команда mount в данном случае случится c WARNING: source write-protected, mounted read-only: это нормально, ведь в смонтированный ISO мы записывать ничего не собирались.

Далее нужно создать папку с файлами конфигурации монтирования установщика Windows и создаем файл, монтирующий папку после запуска WinPE.

mkdir /pxe/win_installer/configs
cat > /pxe/win_installer/configs/winpeshl.ini << EOF
[LaunchApps]
"install.bat"
EOF

mkdir /pxe/win_installer/configs/10x64
cat > /pxe/win_installer/configs/10x64/install.bat << EOF
@echo off
echo Initializing WinPE...
wpeinit
echo.
echo Mounting setup share...
net use \\\\192.168.9.1\\win_installer\\10x64

echo Run setup.exe...
\\\\192.168.9.1\\win_installer\\10x64\\setup.exe
EOF

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

Настраиваем iPXE

Скачиваем wimboot с официального репозитория или отсюда.

Закидываем в /pxe/win_installer/.

Теперь дополняем наше меню iPXE.

# вставляем четвертым пунктом меню
item win10installer Install Windows 10

.....

# в конце файла дописываем
:win10installer

# устанавливаем http путь до корня
set srvaddr http://${srvip}

# устанавливаем переменные с устанавливаемой системой
set osimage 10x64
set bootimage 10x64/sources/boot.wim
set installerdir ${srvaddr}/win_installer

# смотрим параметры для отладки
echo Boot Image:    ${installerdir}/${bootimage}
echo OS Image:      ${installerdir}/${osimage}
echo WinConfig:     ${installerdir}/configs/${osimage}/install.bat
echo Wimboot image: ${installerdir}/wimboot
echo 
sleep 3

# устанавливаем настройки для загрузки и стартуем
kernel ${installerdir}/wimboot

initrd ${installerdir}/configs/${osimage}/install.bat install.bat
initrd ${installerdir}/configs/winpeshl.ini       winpeshl.ini

initrd ${installerdir}/${osimage}/boot/bcd        BCD
initrd ${installerdir}/${osimage}/boot/boot.sdi   boot.sdi
initrd ${installerdir}/${bootimage}               boot.wim

boot

Готово. Осталось проверить.

Проверка

Для проверки потребуется к виртуальной машине добавить диск, я создам и добавлю vhdx на 20Гб. Этого хватит для установки ОС, а больше и не надо. После добавления пробую загрузить.

Как и требовалось, установка успешно проходит как в Legacy, так и в UEFI режимах.

Что может пойти не так:

  • Особенно при тестировании, как я предполагаю с одного IP адреса, samba бывает не дает за какой-то промежуток времени несколько раз монтировать директорию, поэтому стартовый скрипт может подвисать на Mounting share. Можно либо подождать, либо перезапустить samba: service smbd restart.
    Несмертельно, но неприятно.
  • Успешность установки сильно зависит от настроения boot.wim, личной его неприязни к железу и к wimboot.
    В некоторых конфигурациях внутри boot.wim нет драйверов на сетевую карту => он не может смонтировать папку и ваши полномочия заканчиваются. Решается пересбором boot.wim с добавлением драйверов.
    В некоторых конфигурациях boot.wim вообще отказывается загружаться: перезагружается сразу после монтирования папки или до, выпадает в BSOD на этапе копирования и прочее. Из вариантов пробовать только другие boot.wim, благо подсунуть его можно отдельно от устанавливаемой ОС.

Грузим ВСЁ по сети в DualBoot. Часть 6: Загружаем Windows Installer и ставим ОС: 2 комментария

  1. Сделал все как в примере, но меню не появляется. При этом файл меню загрузчик находит, а дальше тишина

    1. Перед
      set srvaddr http://${srvip}
      допишите
      set srvip ${net0/next-server}

      Может в примере косяк, сейчас нет возможности проверить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *