Запуск Mini Windows XP (WinPE) из Hiren’s Boot CD 15.2 по сети (PXE).

Преамбула

Mini Windows XP, «очень полезный горшочек», однако с запуском по сети возникают определенные сложности. Если просто загрузить образ Hiren’s Boot CD с помощью memdisk и запустить Mini Windows XP она свалится.

XP, что PE-версии, что инсталлятор, подружить с PXE проблематично. Мало того, что надо поднимать сервер BINL, который выдаст винде нужные драйвера для сетевых карт, так еще и задолбаешься настраивать загрузчик. Чего только не было — и штатный ntdetect.com не подходил, и патченные в упор не видели файлов ответа (winnt.sif), в общем геморроя было масса.
Но интересно, что Mini Windows XP вообще-то драйвера для сети при загрузке не нужны, все файлы на момент запуска уже переданы на целевую машину, и проблема в чем-то другом. Насколько я понял, в том, как memdisk маппит в память ISO-образ, а винда потом с этим делом конфликтует, скорее всего у нее не получается создать виртуальный диск в памяти. А если попробовать грузить не образ ISO, а образ HDD с виндой? Да! Таким макаром все вышло. Об этом и расскажу.

Необходимые инструменты

— Собственно, ISO-образ Hiren’s Boot CD 15.2
Minimal DOS Image
— Какой-нибудь дистрибутив Linux, в который можно установить виртуальную машину QEMU. Мой пакет для Slackware здесь
— Утилита kpartx, из комплекта multipath-tools. Можно собрать/скачать самостоятельно. На всякий случай, пакет для Slackware
— Windows 7, если захочется провести более глубокую модификацию Mini Windows XP
— Текстовый редактор, поддерживающий переносы строк DOS/Windows (CR+LF), для редактирования конфигов и BAT-файлов DOS, Mini Windows XP и конфига загрузчика Grub4Dos (я делал это в винде).

Создание образа HDD с DOS

1. Складываем все инструменты в отдельный каталог в Linux, и создаем в нем «болванку», для образа HDD:
dd if=/dev/zero of=winpe-test.img bs=90M count=1

Если создавать только минимально работающий Mini Windows XP, то хватит и 60 мегабайт (bs=60M), впрочем, можете попробовать поэкспериментировать и еще уменьшить его.

2. Грузимся в QEMU, указывая в качестве загрузочного устройства образ Hiren’s Boot CD, и приаттачиваем «болванку» образа HDD, как первый жесткий диск:
qemu-system-i386 -cdrom hbcd.iso -hda winpe-test.img -boot d

3. Выбираем в меню загрузки Start Hiren’s Boot CD, потом File Managers и Volkov Commander
Загрузившись в VC вводим команду fdisk3. Эта команда запустит родной Fdisk от Microsoft’а.
У нас один жесткий диск, пока не форматированный и не размеченный, так что в появившемся меню нажимаем 1 и ENTER (Create DOS Partition or DOS logical drive), в следующем меню тоже выбираем 1 пункт (Create Primary DOS Partition), далее отвечаем Y (да). Если все сделано верно, Fdisk предложит перезагрузиться, дабы новый раздел стал доступен в DOS. Выходим из Fdisk и закрываем QEMU.

4. Грузимся в QEMU, но на этот раз указываем в качестве CD Minimal DOS Image:

qemu-system-i386 -cdrom dos.iso -hda winpe-test.img -boot d

Наш новый диск имеет букву D:, но недоступен, поскольку не отформатирован.

5. Форматируем его и делаем системным:

format D: /U /S

Подтверждаем операцию, по окончании вводим метку, например, WINPE.

6. Переходим на диск D (в меню Left—>Drive или Right—>Drive, QEMU перехватывает Alt+F1/Alt+F2), копируем с диска C: файлы autoexec.bat, config.sys, himem.sys и каталоги DOS и VC.

7. В оригинальном образе была опечатка в autoexec.bat, ее можно подправить, заменив строчку DOS;VC на C:\DOS;C:\VC

Содержимое AUTOEXEC.BAT и CONFIG.SYS

8. Можно проверить образ, загрузившись с него в том же QEMU:
qemu-system-i386 -hda winpe-test.img -boot c

Должны появиться окошки Volkov Commander.

Монтирование (и размонтирование) образа диска

Для того, чтобы добавить на диск файлы WinPE, необходимо получить к нему доступ из Linux:

0. Создаем точку монтирования
mkdir /mnt/dos

1. Вешаем образ на Loop-устройство:
losetup /dev/loop0 winpe-test.img
Обычно устройство loop0 свободно, но можно посмотреть свободное командой
losetup -f

2. Маппим разделы:
kpartx -av /dev/loop0

Утилита выдаст сообщение, содержащее название обнаруженного раздела (выделено жирным):
add map loop0p1 (251:6): 0 183393 linear /dev/loop0 63

3. Монтируем раздел:
mount -t vfat /dev/mapper/loop0p1 /mnt/dos

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

1. Размонтируем раздел:
umount /mnt/dos

2. Удаляем информацию о разделе:
kpartx -dv /dev/loop0

3. Освобождаем loop-устройство:
losetup -d /dev/loop0

Чтобы было проще, можно написать два маленьких скрипта:

Подключение образа:

#!/bin/bash

IMAGE="winpe-test.img"

echo "Open WinPE"
losetup /dev/loop0 $IMAGE
MSG=`kpartx -av /dev/loop0`
DEV=`echo $MSG | awk '{print $3}'`
echo $DEV
sleep 5
mount -t vfat /dev/mapper/$DEV /mnt/dos
echo "Complete"
sleep 2

На PasteBin

Примечание: паузы нужны, иначе монтирование может случиться раньше, чем блочное устройство (раздел), появится в /dev/mapper и ничего не примонтируется.

Отключение образа:
#!/bin/bash

echo "Close WinPE..."

umount /mnt/dos
kpartx -dv /dev/loop0
losetup -d /dev/loop0

echo "Complete!"

На PasteBin

Минимально работающий Mini Windows XP

Для создания минимально работающего Mini Windows XP, потребуется взять из образа Hiren’s Boot CD все файлы из \HBCD\XP, и положить их в каталог /HBCD/XP в образе жесткого диска.
Также необходимо настроить загрузчик Grub4Dos:
1. В образе Hiren’s Boot CD находим файл GRUB.EXE и копируем его в корень нашего диска.
2. Создаем конфиг MENU.LST также в корне диска. Я просто подправил оригинальный конфиг из Hiren’s Boot CD, удалив оттуда все лишнее. Содержимое конфига на PasteBin

Скачать GRUB.EXE, MENU.LST, AUTOEXEC.BAT, CONFIG.SYS с Mega.Nz

Внимание! Править MENU.LST, AUTOEXEC.BAT, CONFIG.SYS надо редактором, который умеет в DOS/Windows переносы строк (например, Notepad++)

Проверяем.
1. Грузимся из полученного образа (здесь я делал это уже по сети, о настройке конфига для PXE будет ниже):

2. Запускаем GRUB.EXE:

3. Выбираем соответствующий пункт меню, ждем…

ФАНФАРЫ!

На самом деле, Mini Windows XP получился сильно урезанным, без программ из Hiren’s Boot CD, без толковой поддержки сети и прочих полезностей, что ж, будем улучшать

Добавляем важный софт.

Ну он не так, чтоб уж прямо критически важный, но Mini Windows XP подгружает некоторые программы, например, программу настройки сети, автомонтирования дисков, архиватор из \HBCD\Programs, \HBCD\Programs\Files \HBCD\Dos, я посмотрел в код файлов автозагрузки, и все самое важное выделил.

1. В /HBCD/Programs/Files нашего образа, добавим следующие файлы из \HBCD\Programs\Files ISO-образа:
7Zip.7z
AutoMountDrives.7z
DLL.7z
IrfanView.7z
Notepad.7z
TeraCopy.7z
XpFiles.7z

2. В /HBCD/Dos (из \HBCD\Dos):
BiosBoot.7z
MBRUtil.7z
PCI32.7z
SavePart.7z

3. В /HBCD файл HBCDMenu.exe

4. В /HBCD/Programs пока можно скопировать все файлы, которые не *.cmd (из \HBCD\Programs ISO-образа), CMD-файлы, кроме одного (AutoMountDrives.cmd), придется подправлять, так что AutoMountDrives.cmd можно скопировать.

Лирическое отступление, или про то, как залезть во внутренности Mini Windows XP

Все потроха сего дистрибутива лежат в архиве формата WIM, в Windows 7 имеется стандартная утилита для работы с ним.
Копируем из образа HBCD файл XP.wim куда-нибудь в удобный каталог, и смотрим его содержимое (команды выполнять от администратора):

dism /Get-WimInfo /WimFile:XP.wim

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

Сведения об образе : XP.wim

Индекс: 1
Имя : XP
Описание : <не определено>
Размер (байт): 113 236 979

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

Образ можно подмонтировать в какой-нибудь каталог:
mkdir %TMP%\wim
dism /Mount-Wim /WimFile:XP.wim /name:XP /MountDir:%TMP%\wim

Теперь в каталоге %TMP%\wim — содержимое образа, меня оттуда интересуют два файла:
Startup.cmd, который Mini Windows XP запускает при старте, и prep, который в процессе загрузки переименовывается в Startup2.cmd и выполняется. Оттуда и из XpCustomize.cmd и были вытащены все нужные имена файлов.

Закрыть образ без сохранения изменений:

dism /Unmount-Wim /MountDir:%TMP%\wim /discard

С сохранением:

dism /Unmount-Wim /MountDir:%TMP%\wim /commit

openwim.bat closewim.bat savewim.bat

Источник Копия

Настройка шары на сервере

Итак, что же все-таки делать с остальным софтом? Ну у нас же PXE, а значит есть сервер с Samba. В следующем выпуске я таки начну сначала, и расскажу, как настроить PXE на Linux-машине, и Samba в т.ч. Пока ограничусь секцией конфига smb.conf для этой конкретной шары:

[hbcdshare]
        path=/home/pxe/tftp/distrib/windows/winpe
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

В каталог /home/pxe/tftp/distrib/windows/winpe копируем каталог Files из ISO-образа HBCD, вместе со всем содержимым. Естественно, для шары вы можете указать любой удобный вам путь.

Подключение шары в Mini Windows XP

1. Правим файл /HBCD/XP/XpCustomize.cmd в нашем образе диска, меняем строку
REM start PENetwork на start PENetwork
Эта команда запустит утилиту настройки сети (нужные драйвера уже есть в комплекте в архиве XpDrvLAN.7z и Mini Windows XP их подгружает, если вы не забыли положить в /HBCD/Programs файлы 7z.exe и 7z.dll)

2. Шара не поднимется, пока не будет настроена сеть, поэтому надо «притормозить» выполнение командного файла (обычно хватает полминуты). Для этого добавим в каталог /HBCD/XP утилиту sleep.exe (приложу ее в архиве ниже)

3. Пропишем следующие команды для паузы и поднятия шары. Шара будет подключена, как сетевой диск, например, с буквой W:

REM Add network share with programms
CD \HBCD\XP
sleep 30
Echo Add Files Share...

NET USE W: \\10.10.0.120\hbcdshare

sleep 10

Файл XpCustomize.cmd целиком
Исходник утилиты sleep

Если все сделано правильно, то после загрузки Mini Windows XP мы увидим сетевой диск в «Моем компьютере»:

А если зайдем внутрь, то файлы:

Исправляем CMD-файлы для запуска софта

1. Извлекаем из ISO-образа все CMD-файлы из \HBCD\Programs в отдельный каталог.
Во всех них, где есть (кроме файла AutoMountDrives.cmd) нужно заменить строчку Files\имя_файла на W:\Files\имя_файла (W: — сетевой диск, куда подключена шара)
2. Специально для этого дела я написал за 15 минут на коленке утилиту на C# — HBCDCmdFix

Пользоваться просто — выбираете каталог с *.cmd файлами и нажимаете Fix. Программа делает резервные копии в *.bak файлы перед изменением.

3. Кладем измененные файлы в /HBCD/Programs, отмонтируем образ нашего HDD, загружаемся с него и пробуем запустить какую-нибудь программу (из меню в системном трее). Если все сделано правильно, то программа запустится

Наводим красивости

Все готово, осталось только навести красоту в загрузочных меню.

Делаем в CONFIG.SYS загрузочное меню DOS (оставим возможность выйти в DOS или перезагрузить компьютер):

Измененный CONFIG.SYS и AUTOEXEC.BAT

Почитать про создание загрузочного меню в MS DOS Копия

Измененный MENU.LST Grub4Dos (добавлена возможность перезагрузиться или выключить компьютер).

А симпатичную надпись в DOS’овом меню, я сделал, подправив в HEX-редакторе IO.SYS. Но как — догадайся мол сама 🙂

Готово!

Осталось только сжать готовые образы gzip‘ом и прописать в меню PXE-сервера:

gzip winpecut.img
gzip winpe.img

LABEL winxppe
    menu label Windows XP PE
    kernel modules/memdisk
    initrd distrib/windows/winpe/winpe.img.gz
    append harddisk

LABEL winxppecut
    menu label Windows XP PE Very Small
    kernel modules/memdisk
    initrd distrib/windows/winpecut/winpecut.img.gz
    append harddisk

Видео загрузки Mini XP по сети

Скачать

Minimal DOS Image
Пакеты:
QEMU
muktipath-tools
Скрипты, утилиты, примеры конфигов из статьи

Образы

Тестовый (минимальный) образ Mini Windows XP
Полный образ Mini Windows XP

8 Responses to Запуск Mini Windows XP (WinPE) из Hiren’s Boot CD 15.2 по сети (PXE).

  1. Pingback: Установка Windows XP из Mini Windows XP по сети (PXE). Без геморроя с загрузчиками и драйверами. | Персональный блог Толика Панкова

  2. Pingback: Hiren’s Boot CD 15.2 и загрузка его по сети (PXE) | Персональный блог Толика Панкова

  3. Pingback: Заодно нашел кучу утилит для подбора паролей в Windows. | Персональный блог Толика Панкова

  4. Pingback: Делаем аварийный загрузочный образ WinPE на базе Windows 7. (с возможностью установки Win7/8/10) | Персональный блог Толика Панкова

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

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