Если ничего не делать, детали установки по умолчанию скрыты:
Чтобы лог установки сразу был виден пользователю, необходимо применить один из следующих методов:
1. В коде скрипта, до секций прописываем команду:
ShowInstDetails show
Окошко с логом (деталями установки) будет открыто
2. Прописать внутри секции команду:
SetDetailsView show
Это может быть полезно, например, если вы хотите, чтобы детали показывались и при удалении. В таком случае, вышеуказанная команда добавляется в начало секции, описывающей анинсталлер:
Section Uninstall
SetDetailsView show
[..]
[..]
SectionEnd
Делал, чтоб клиенту меньше ручками работать. Теперь не надо самому определять версию винды, и вытаскивать нужный devcon из архива соответственно.
Предыдущий я сделал на Inno Setup, но Inno Setup оказался той еще заразой, нихрена он версию Винды толком определить не мог, и тихой сапой подкладывал во все винды один и тот же devcon, который подходит для Windows 7 и выше. От чего у клиента с виндой XP x64 произошел адский баттхерт, так, что забрызгало пол-Петербурга, аж до моей деревни брызги долетели. Видимо, клиент меня проклял, потому что мне на ногу упал топор (слава Ктулху обухом), у меня упали форточки, точнее форточка, но стеклянная и на пол, ко мне какого-то черта приперлась лесная охрана и стала [РОСКОМНАДЗОР], и я после этого [РОСКОМНАДЗОР] в результате, теперь страдаю [МИНЗДРАВ].
Новый сделал на NSIS, но как оказалось — NSIS тоже [РОСКОМНАДЗОР], точнее, не сам NSIS, он мне как раз понравился, за исключением одного странного недокументированного глюка, о котором как-нибудь расскажу, и скрипт-язык, вполне себе такая помесь Бейсика с Башем. А вот документация, это, товарищи, лютый [РОСКОМНАДЗОР] в последней стадии.
Русский мануал к популярному инсталл-мэйкеру писали сто лет назад какие-то [ДАННЫЕ УДАЛЕНЫ] с OSZone.net, еще и назвали свое творение «справочником», хотя что-что а справочники так не делают. Просто плохо структурированные статьи, которые на [РОСКОМНАДЗОР] запихнули в chm-файл. [РОСКОМНАДЗОРКА], поучитесь у того же Исзелиона с wasm.ru, как нужно делать справочники и мануалы. На туториале Исзелиона сотня-другая студентов если не аспирантами стали, так свой зачет по ассемблеру точно получили. Аффтар еще и жалуется на форуме, типа, «ну на[РОСКОМНАДЗОР] обновлять мануал, если его никто не читает, и очевидные вопросы задает». Так [РОСКОМНАДЗОРКА], [РОСКОМНАДЗОРКА], ты так написал этот мануал, что кошка [РОСКОМНАДЗОРОМ] по клавиатуре лучше напишет. Но ладно, я много захотел, русского мануала. Да, согласен. Но теперь «поговорим о влажности в номере», точнее об оригинальной вики от разработчиков.
Оригинальная вики тоже [РОСКОМНАДЗОРНЫЙ], [РОСКОМНАДЗОР] твою мать, [РОСКОМНАДЗОР]. Причем, я вполне себе уверен, что там есть все описания функций языка NSIS, вот только отдельной категории для списка функций нет. Функции потом ищутся гуглем, который выводит на страницу-сироту с вполне нормальным описанием, но [РОСКОМНАДЗОР] знает, почему на эту страницу нельзя попасть из самой вики. В навигации [РОСКОМНАДЗОР] не валялся, в общем без стакана не разобраться. А еще пишут, что «хорошо документированный продукт». Документирован он может и хорошо, но найти в документации что-то конкретное, это как в ГОРФ пойти к чиновнику: «вы мне справку ЕПРСТ-1488 принесли, а надо было ЖПЧШЦ-666», и [РОСКОМНАДЗОР] знает где это написано.
Даже есть мысль как-нибудь выкачать эту вики себе на комп, сделать нормально, попытаться перевести и выпустить в виде справочника.
При установке Windows 7 на компьютер с USB 3.0 можно столкнуться с ошибкой «Не найден необходимый драйвер для дисковода оптических дисков.«, на самом деле, дисковод оптических дисков тут не при чем, особенно, если установка производится с загрузочной флэшки с дистрибутивом «семерки». В Windows 7 и его установочном окружении просто нет драйверов для контроллеров USB 3.0.
Самый простой вариант, когда в BIOS/UEFI удается переключить USB-контроллер в legacy-режим. Но на многих системах это самое legacy реализовано весьма коряво. Например, live-дистрибутивы Linux могут в таком режиме видеть и контроллер, и подключенные накопители, а вот установщик Windows 7 (и сама винда) нет.
На днях попался такой ноутбук, в котором примерно так и получалось, и вот, хочу рассказать об интересном способе это побороть.
Конечно, можно поступить стандартно — создать отдельный дистрибутив для такого компьютера, внедрив нужные драйвера, или же скачать какую-нибудь «колхозную» сборку. Но есть и другой способ — воспользоваться установочным окружением от Windows 8/8.1 в котором драйвера для USB 3.0 есть.
Минус способа — в установленной Windows 7 драйвера для USB 3.0 будут отсутствовать, как, наверняка, и драйвера от сетевой карты, и возникнет проблема, как их туда затолкать.
В источнике есть способ сделать это с помощью консоли восстановления с получившейся флэшки, у меня же получилось еще проще. Кривое ноутбучное legacy поддерживалось Linux’ом с System Rescue CD, так что на этом моменте я останавливаться не буду.
Что понадобится
1. Образ установщика Windows 7
2. Образ установщика Windows 8/8.1
3. Флэшка 🙂
Как сделать
1. Закатываем на флэшку дистрибутив Windows 8/8.1, например, с помощью программы Rufus, особых подробностей я рассказывать не буду, но я сначала переключил UEFI ноута в режим Legacy BIOS (хоть он работал нормально и, главное, был), снес б-гмерзкое GPT, а потом установил в Rufus «Схема раздела и тип системного интерфейса» в значение «MBR для компьютеров с BIOS или UEFI«.
2. Итак, у нас получилась флэшка с Windows 8/8.1, переходим на нее, заходим в каталог sources и удаляем оттуда файлы install.wim и/или install.esd.
3. Теперь из образа Windows 7 вытаскиваем файл install.wim (он тоже лежит в подкаталоге sources образа). Если у вас образ AIO, т.е. «все в одном», образ, из которого можно установить сразу несколько версий Windows, например, Starter, Home и Professional, то необходимо из образа Windows 7 вытащить файлы sources/*.clg, например, install_Windows 7 Home Basic x64.clg, install_Windows 7 Home Premium x64.clg и т.д. Также можно попробовать скопировать папку $OEM$, но не везде срабатывает, т.е. иногда конкретный дистрибутив может ее проигнорировать.
4. Теперь копируем все, что вытащили из дистрибутива Windows 7 в каталог sources на флэшке.
5. ФАНФАРЫ!
Примерное объяснение, как все это работает.
Загрузчик установщика Windows современных версий сначала загружает файл boot.wim, который представляет из себя хитрый архив (виртуальный диск, наподобие initrd в Linux), содержащий необходимые для процесса установки драйвера, основные файлы и саму программу-установщик. Далее окружение предустановки ищет дополнительные компоненты на диске с boot.wim, в частности install.wim, виртуальный диск с файлами операционной системы, которая должна быть установлена. Тут мы просто оставили предустановочное окружение, подсунув ему ОС другой версии.
Когда-то давно в этом блоге упоминалось про замечательную консольную утилиту devcon от Microsoft, это консольный аналог «Диспетчера устройств», причем бесплатный и с открытым исходным кодом. В прошлый размы находили и включали/отключали конкретную сетевую карту. В этот раз будем искать все сетевые устройства, а также массово включать и отключать всю сетевую активность на локальной машине.
Получение списка всех сетевых устройств
devcon.exe findall =net
Команда найдет и выведет на экран все сетевые устройства, включая виртуальные адаптеры, например, TUN/TAP от Openvpn или виртуальные адаптеры VMWare, а также те устройства, которые в данный момент не активны (отключены, или у них нет драйверов).
devcon.exe find =net
Выводятся только активные устройства.
Пример вывода devcon.exe findall =net:
Отключение всей сетевой активности
devcon.exe disable =net
Включение сетевой активности
devcon.exe enable =net
Внимание!devcon необходимо запускать с админскими правами!
Скачать набор devcon’ов
devcon’ы входят в разные пакеты SDK, отличающиеся гигантским размером. Я тут подобрал разные версии devcon’ов для разных ОС в одном архиве, ну и плюс батники для включения/отключения сети.
Содержимое архива:
batchfiles — пакетные файлы для включения и отключения сетевой активности
с помощью devcon, а также для получения списка сетевых устройств.
x64 — devcon для Windows7-10 для 64-разрядных версий Windows.
x86 — devcon для Windows7-10 для 32-разрядных версий Windows.
XP\x64 — devcon для Windows XP 64-разрядной, работает только в WinXP x64.
XP\x86 — devcon для Windows XP 32-разрядной, работает в WinXP x32 и,
возможно, в Win Vista x32.
Вот уж не думал, что данная задача будет достойна заметки, но оказалось, что нормально определить версию (а главное, удобоваримое название и архитектуру) просто так не получится.
А так же ISO-образ Acronis True Image и Puppy Slacko.
Преамбула
Попросили превратить мою заметку про то, как можно пользоваться Acronis True Image без его акронисовского «восстановления при загрузке», превратить в интерактивный скрипт, который делает все то, что описано в заметке, но сам, задавая пользователю наводящие вопросы.
Сделал, чо. Правда, скрипт, наверняка, дичайший быдлокод, но работает без ошибок. Единственное что, предварительно надо создать основной раздел ext2/ext3 на жестком диске, и он должен идти первым. Потом установить винды, сделать линуксовый раздел активным, а потом уже запускать скрипт со всеми потрохами.
Скрипт дико большой, и отдельно его описывать мне откровенно влом, впрочем, в виде отдельных заметок, все самое основное я в этом блоге уже обсуждал.
Позвали тут в дружественную конторку, где после очередных обновлений перестал работать какой-то очередной русский инновационный криптопровайдер (не Крипто Про, с ним вроде такой беды не случалось). Оказалось, программулина конфликтовала с кривым активатором ODIN, да-да, винда почему-то тоже оказалась нелицензионной, несмотря на государственный статус этой самой конторки. Пришлось удалять.
А активатор кривой тому ще подсовывает в винду патченное ядро, дабы установить драйвер без цифровой подписи, нужный для эмуляции таблицы SLIC.
Простой способ (который не сработал)
На рутрекере, кстати, в хорошей и обстоятельной теме про активацию семерки, предлагали просто создать BAT-файл со следующим содержимым, и запустить его с правами администратора, после чего перезагрузиться:
del "%windir%\system32\drivers\oem-drv64.sys"
del "%windir%\system32\xNtKrnl.exe"
del "%windir%\system32\xOsLoad.exe"
del "%windir%\System32\ru-RU\xOsLoad.exe.mui"
del "%windir%\System32\en-US\xOsLoad.exe.mui"
%windir%\system32\bcdedit.exe /set {current} path \Windows\system32\winload.exe
%windir%\system32\bcdedit.exe /deletevalue {current} kernel
%windir%\system32\bcdedit.exe /deletevalue {current} nointegritychecks
%windir%\system32\bcdedit.exe /deletevalue {current} custom:26000027
reg delete HKLM\SYSTEM\CurrentControlSet\services\oem-drv64 /va /f
Кому-то может и поможет, но мне не повезло, файлы активатора не удалились, reg delete не сработал, потому я просто нашел в дистрибутиве их виды «автоматический установщик» активатора, и просто провернул последовательность действий в обратном порядке.
Удаление параметров Реестра и конфигурации загрузчика
Получился такой вот CMD-файл
В каталоге с этим батником должен быть подкаталог data, со следующим содержимым:
1. Утилита SetACL.exe, которая будет менять права доступа к ключам Реестра, и восстанавливать их после редактирования. Утилиту взял из того же дистрибутива.
2. Утилитка sleep, но это так, для красоты, моя прихоть.
3. Файлы Реестра (*.reg) для x86 и x64 ОС, в которых прописано, какие ключи удалять anti-oem-drv64.reganti-oem-drv86.reg
Далее я сделал RAR-SFX с таким сценарием: ;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Deactivator.cmd
TempMode="Удалить активатор?","Деактиватор"
Silent=1
Overwrite=1
И поставил галочку в дополнительных параметрах SFX, на запрос административного доступа.
Удаление файлов активатора
После перезагрузки можно удалить файлы активатора, таким вот CMD-файлом.
@ rem echo Этот файл должен быть запущен с правами администратора и после выполнения Deactivator'а
@ rem echo Чтобы окончательно удалить следы активатора нажмите любую клавишу, иначе CTRL+C!
@ rem pause
DEL "%windir%\system32\drivers\oem-drv64.sys"
DEL "%windir%\system32\xNtKrnl.exe"
DEL "%windir%\system32\xOsLoad.exe"
DEL "%windir%\System32\ru-RU\xOsLoad.exe.mui"
DEL "%windir%\System32\en-US\xOsLoad.exe.mui"
DEL "%windir%\system32\drivers\oem-drv86.sys"
@echo "Clean complete."
@pause
И SFX-сценарий к нему:
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Cleaner.cmd
TempMode="Выполняйте только после исполнения Deactivator'а, если хотите окончательно удалить следы активации","Окончательная очистка"
Silent=1
Overwrite=1
Принесли мне тут в починку компьютер с наглухо залитыми эпоксидкой USB портами (безопасность же) и поставили задачу переустановить винды, в связи с заменой сгоревшего HDD на новый. По счастью сетевой порт был, так что единственным доступным способом доставить туда винды, был PXE. Но, в данном случае, речь пойдет не о PXE.
Зная клиента, который, несмотря на солидность, периодически «придет, и молча уронит все», я подумал, что так дело не пойдет. Надо предусмотреть возможность восстановить если что, ОС прямо с компьютера. Чтоб клиент не бегал вокруг меня, если уронит винду из-за кривого ПО/рук.
Всем хорош образ загрузочного диска Acronis True Image, и копию ОС сделать может, и восстановить может, и Зону Безопасности (скрытый раздел для хранения бэкапов) создать может. Не может лишь одного — установить свой загрузчик, чтобы можно было сделать «Восстановление при загрузке».
В десктопной платной версии такая функция есть, а в Recovery CD буржуи ее вырезали. Но мы не дворяне, справимся. Внимание! Все нижеследующее работает для компьютеров с BIOS (или в Legacy-режиме) с MBR-дисками.
Необходимые инструменты
— Загрузчик syslinux. Можно взять здесь. Я пользовался версией 4.02, которая мне уже была знакома по настройке PXE-сервера. Из архива нам понадобятся только некоторые файлы, но я уже собрал готовый пакет, ссылка на который будет в конце заметки. Вместо syslinux можно использовать какой-нибудь другой загрузчик, который умеет грузить ISO-образы (например grub2 или grub4dos), но далее все будет про syslinux.
Примечание: Вообще syslinux, это набор загрузчиков на разные случаи жизни. Он включает в себя pxelinux (для загрузки из сети), isolinux (для создания загрузочных ISO) и extlinux, для установки загрузчика на жесткий диск. Но, с 4 версии постановили extlinux и syslinux считать одним и тем же [1], так чтоб никого не путать, далее буду называть все syslinux‘ом
— Какой-нибудь маленький live-дистрибьютив Linux. Я использовал уже довольно пожилой Puppy Slacko 5.5 Rus, немного модифицированный когда-то давно под работу с tcplay
— Собственно сам образ Acronis True Image Recovery CD. Использовал старый, от Acronis True Image 2011, потому что он довольно небольшой (122 Мб против 522 от Acronis True Image 2015, например). Поскольку это софтина проприетарная, пользуйтесь гуглем и торрентами.
Делим диск и ставим Windows
Я все делал на чистом диске, так что мне было просто.
В начале диска создаем основной раздел EXT2 или EXT3, в котором будет установлен загрузчик, лежать образ Acronis True Image, а у меня еще и дистрибьютив Puppy Slacko, чтоб чуть что можно было загрузиться в обход основной ОС. Делаем с помощью любимого менеджера дисков (я пользовался Acronis Disk Director).
Структура разделов должна выглядеть как-то так:
Желательно сделать раздел для нашего будущего загрузчика в начале диска, чтоб потом не было эксцессов. Когда экспериментировал с этим делом первый раз, Acronis, при создании Зоны безопасности, нагло передвинул раздел, и все пошло прахом.
Syslinux, на самом деле, можно ставить и в логические разделы, только это сопряжено с большими телодвижениями (см. в источниках в конце заметки).
Установим Windows на свободное место. Установщик Windows 7 и выше сам создаст необходимые разделы под свой загрузчик (bootmgr и настройки) и основной раздел с ОС. После установки Windows структура диска должна выглядеть так:
Сборка пакета для установки загрузчика
Просьба линуксоидам камнями не кидаться, «пакет», в данном случае, не совсем то, что подразумевается под пакетом в терминах Linux-систем. В данном случае, это набор файлов, который необходим для установки syslinux на целевой машине. Я делал это на «большом» Линуксе, но можно делать это и на том же самом Puppy (и даже в Windows, хотя на практике я не проверял). Ленивые могут пропустить этот шаг, готовый пакет будет в конце заметки.
1. Создаем в удобном месте подкаталог, например slinstall, там будет готовый набор файлов для целевой машины.
2. В другой подкаталог распаковываем архив с syslinux (например, syslinux-4.02.tar.gz), в нашем примере подкаталог будет называться sysl-distr
3. Копируем в каталог slinstall файл extlinux из каталога sysl-distr/extlinux — это установщик загрузчика.
4. Создаем в каталоге slinstall подкаталог mbr и копируем туда файлы sysl-distr/mbr/mbr.bin и distr/mbr/altmbr.bin
5. Создаем в каталоге slinstall подкаталог modules и копируем туда модули загрузчика.
Syslinux, на самом деле, не просто загрузчик, а, можно сказать, целая маленькая операционная система. Функции загрузчика расширяются модулями — файлами специального формата, которые загрузчик может выполнять, примерно как ОС исполняемые файлы. Файлы эти имеют расширение c32 (*.c32). Минимальный набор модулей для нашей задачи — модуль отображения меню menu.c32 и модуль chain.c32 — он передает загрузку другим (не-Linux) операционным системам, загрузчикам, или просто в нужный раздел диска. Но можно скопировать и другие модули, если захочется расширить функционал начальной загрузки. Необходимо найти нужные файлы (через поиск mc в Linux или любым удобным способом) в каталоге sysl-distr и скопировать их в slinstall/modules
В Линукс это можно сделать из командной строки так (находясь в каталоге sysl-distr):
где /home/user/slinstall/modules — полный путь к подкаталогу slinstall/modules
6. В slinstall/modules необходимо также скопировать специальный модуль memdisk, предназначенный для загрузки ISO-образов. Обычно расположен по пути memdisk/memdisk в каталоге с распакованным syslinux (тут sysl-distr).
7. Пакет готов, теперь можно запаковать его в архив, и приступать к установке загрузчика.
В Linux можно выполнить (выйдя из каталога slinstall на уровень выше)
tar -czvf syslinux-install.tar.gz ./slinstall
Копирование необходимых файлов на раздел EXT2/EXT3 целевого компьютера.
Предположим, у нас есть загрузочная флешка с Puppy Linux (или другим Linux на ваш вкус), копируем на нее образ Acronis True Image, выше созданный пакет с загрузчиком, и архив с дистрибутивом самого Puppy (см. ниже, в разделе «Скачать»).
В графическом интерфейсе все можно делать мышью, я приведу ниже консольные команды. В данном примере флешка — sdb1, а созданный ранее раздел — sda1
Внимание! Не ошибитесь в том, как именованы разделов на конкретной машине!
1. Создаем точки монтирования (пропустить шаг, если запущен графический интерфейс Puppy. Просто щелкнуть мышью по нужной иконке диска на desktop’е)
mkdir /mnt/sda1
mkdir /mnt/sdb1
2. Монтируем диски (пропускается из графического интерфейса):
mount -t ext3 /dev/sda1 /mnt/sda1
mount -t vfat /dev/sdb1 /mnt/sdb1
Может быть нужным заменить ext3 на ext2 и/или vfat на ntfs в зависимости от используемых файловых систем.
3. Создаем директорию для образа Acronis True Image Recovery CD на разделе sda1 и копируем образ.
4. Копируем и распаковываем дистрибутив Puppy (если он нужен)
cp /mnt/sdb1/puppy-slacko-rus-5.5-hexmod.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf puppy-slacko-rus-5.5-hexmod.tar.gz
rm puppy-slacko-rus-5.5-hexmod.tar.gz
5. Копируем и распаковываем пакет установки syslinux:
cp /mnt/sdb1/ syslinux-install.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf syslinux-install.tar.gz
rm syslinux-install.tar.gz
Устанавливаем загрузчик syslinux
Внимание! Установка syslinux производится не на устройство, а на заранее смонтированный раздел. Загрузчик нельзя устанавливать в корень диска, необходимо создать для него каталог, например /boot/syslinux. Не перепутайте разделы диска, куда устанавливаете загрузчик! Раздел с загрузчиком должен иметь файловую систему FAT, ext2, ext3, ext4 или Btrfs
1. В любимом менеджере дисков делаем раздел EXT2/EXT3 активным.
2. Загружаемся, если еще не, в live-дистрибьютив Linux.
3. Создаем точку монтирования и монтируем раздел (если еще не сделано)
mkdir /mnt/sda1
mount -t ext3 /dev/sda1 /mnt/sda1
4. Создаем каталог для загрузчика:
mkdir -p /mnt/sda1/boot/syslinux
ключ -p указывает команде mkdir, что нужно создавать путь со всеми подкаталогами.
6. Переходим в каталог slinstall и устанавливаем загрузчик:
cd /mnt/sda1/slinstall
./extlinux --install /mnt/sda1/boot/syslinux
Если все сделано верно, последняя команда выдаст сообщение:
/mnt/sda1/boot/syslinux is device /dev/sda1
В каталоге /mnt/sda1/boot/syslinux должен находиться файл ldlinux.sys, кстати, неудаляемый. В [1] написано, как его, если что, удалить.
Настройка MBR
Syslinux, внезапно, сам не умеет прописываться в MBR диска, да и в загрузочный сектор раздела. Так что если перезагрузиться сейчас, то получим при загрузке сообщение Boot error и глухое зависание. MBR, к сожалению, придется править вручную, с помощью команды dd.
Внимание! Команду dd не зря называют Disk Destroyer, будьте с ней очень осторожны! При ошибке легко можно похерить не только MBR, но и таблицу разделов, и данные на диске!
MBR находится в первых 440 байтах на диске.
1. Переходим в каталог slinstall:
cd /mnt/sda1/slinstall
(естественно, точка монтирования должна быть создана, а раздел примонтирован).
1. Создаем копию текущей MBR:
dd if=/dev/sda of=old.mbr bs=440 count=1
В текущем каталоге должен появиться файл old.mbr размером 440 байт. Можно, и даже желательно, указать и какой-нибудь другой путь к файлу old.mbr, сохранив его, например, на флешке:
Краткое пояснение по команде dd: bs=<число> — сколько байт необходимо прочитать. count=<число> — число уазывает на то, сколько раз будет прочитано количество байт, указанное в параметре bs= if=<путь к устройству или файлу> — откуда будут прочитаны данные of=<путь к устройству или файлу> — куда будут записаны данные
Осталось сделать загрузочное меню.
Загрузочное меню
Вот пример загрузочного меню, главное, правильно установить раздел с загрузчиком винды — в syslinux отсчет разделов ведется с единицы (0 — MBR жесткого диска), отсчет дисков с ноля, и надо помнить, что единица таймера загрузки syslinux равна 0.1 секунде.
ui modules/menu.c32
PROMPT 0
menu title Local boot
LABEL windows
menu label Microsoft Windows 7
kernel modules/chain.c32
append hd0 2
timeout 1000
TEXT HELP
Loading Windows 7
ENDTEXT
LABEL recovery
menu label System recovery
kernel modules/memdisk
initrd ../../acronis/loader.iso
append iso raw
LABEL slacko
menu label Puppy Linux Slacko 5.5
kernel ../../slacko/vmlinuz
initrd ../../slacko/initrd.gz
Найти загрузчик Windows на разделе жесткого диска, дело не очень сложное:
1. Надо проверить файловую систему раздела, она должна быть FAT32 или NTFS
2. Проверить наличие файла ntldr (Windows XP и ранее) или bootmgr (Windows Vista и позднее) в корне раздела. Windows XP и старше, при установке по умолчанию, записывают файл ntldr в корень системного раздела, а более новые — создают отдельный загрузочный раздел, в корне которого лежит bootmgr.
Для чего? Например, для создания своего скрипта автоматической настройки загрузчика Grub или Syslinux
Обработать вывод команды blkid (вывод данных о блочных устройствах) можно в цикле for:
echo "Find Windows loaders..."
IFS=$'\n'
for DEVDATA in $(blkid); do
...
done
Перед циклом необходимо установить значение переменной IFS, как \n (перенос строки) IFS — переменная, задающая разделители полей при работе со строками в shell, по умолчанию разделители это табуляция, перенос строки и пробел, если не установить ее значение, как «только перенос строки», то строка с описанием каждого раздела (например, /dev/sda1: UUID="68DF-FF87" TYPE="vfat" PARTUUID="00003214-01") распадется на части, что поломает алгоритм.
В цикле for:
1. Вытаскиваем в переменную VOL нужные данные — путь к устройству и файловую систему:
Параметр -F ":" устанавливает двоеточие в качестве разделителя полей awk.
3. Далее, проверяем, не пуста ли строка в переменной VOLFS, и проверяем ее значение. Если VOLFS равна ntfs или vfat, то запускаем функцию find_loader(), проверяющую наличие загрузчика в корне соответствующего раздела. Если файловая система раздела другая — выводится сообщение, что это не Windows-раздел.
if [ -n "$VOLFS" ]; then
if [[ "$VOLFS" == "ntfs" || "$VOLFS" == "vfat" ]];then
find_loader $VOLNAME $VOLFS
else
echo "$VOLNAME not windows volume"
fi
fi
Можно было бы еще исключать разделы FAT16, но решил не загромождать скрипт лишней проверкой.
Поиск загрузчика Windows
В функцию find_loader() передаются два параметра: путь к устройству (разделу) и его файловая система.
1. Заведем переменную-флаг, указывающую, был ли раздел временно смонтирован TMPMOUNT=0
2. Получаем выхлоп команды mount. grep‘ом фильтруем вывод по соответствующему разделу, с помощью awk вытаскиваем точку монтирования.
MOUNTPOINT=`mount|grep -w "$1"|awk '{print $3}'`
3. Если переменная MOUNTPOINT пустая, раздел не смонтирован. Создаем временную точку монтирования, пытаемся смонитровать раздел, если получилось — устанавливаем TMPMOUNT=1, в переменную MOUNTPOINT записываем временную точку монтирования и приступаем к поиску загрузчика, если не получилось — выходим из функции:
if [ -z "$MOUNTPOINT" ]; then
mkdir -p "/tmp/tmpmount"
mount -t "$2" "$1" "/tmp/tmpmount"
if [ $? -ne 0 ]; then
echo "$1 not mounted"
return
fi
MOUNTPOINT="/tmp/tmpmount"
TMPMOUNT=1
fi
Примечание: ключ -p команды mkdir позволяет создать путь вместе со всеми подкаталогами, а если путь уже создан, то команда mkdir не выдаст ошибки, что путь уже существует.
Надо обратить внимание на то, что Windows нечувствительна к регистру имен файлов, так что загрузчик может быть и bootmgr и BOOTMGR, и даже BoOtMgR (аналогично и ntldr). Поэтому придется воспользоваться командой find.
find <path> -maxdepth 1 -iname <filename>
где: <path> — путь к каталогу, с которого начинать поиск -maxdepth — глубина поиска в подкаталогах (начиная с указанного в <path>, 1 — только каталог <path> без подкаталогов). -iname — игнорировать регистр имени файла <filename> — имя файла (или маска), который будем искать.
В данном случае надо обязательно установить -maxdepth 1, иначе будут большие тормоза, а при отмонтировании возможны глюки.
4. Ищем загрузчик Vista и выше и сохраняем выхлоп в переменную FOUND:
5. Если нашли (переменная FOUND не пустая), выводим соответствующее сообщение, если нет — ищем загрузчик Windows XP, и выводим сообщение в зависимости от того, нашли или нет:
if [ -n "$FOUND" ];then
echo "$1: found bootmgr (Windows Vista and newer)"
else
#ntldr - Win XP and older
FOUND=`find "$MOUNTPOINT" -maxdepth 1 -iname "ntldr"`
if [ -n "$FOUND" ];then
echo "$1: found ntldr (Windows XP and older)"
else
echo "$1: Windows loader not found"
fi
fi
6. Проверяем флаг TMPMOUNT, если он был установлен в 1, отмонтируем временно смонтированный раздел:
if [ $TMPMOUNT -eq 1 ]; then
sleep 1
umount "/tmp/tmpmount"
fi
Результат работы скрипта
Запуск на тестовой машине с разделами FAT32/NTFS, но без установленной Windows:
Это техническая страничка со списком дистрибутивов нашего PXE-сервера и ссылками на описание конкретных дистрибутивов. Страничка пополняется в зависимости от производственной необходимости, наличия оборудования, для которого понадобился тот или иной дистрибутив и времени.
Примечание: Альтернативный способ установки Windows 7/Vista/8/10.
Если не загрузилась Windows 7 PE или в ней что-то не работает.
1. Грузимся в какой-нибудь Linux, который видит сеть и умеет в Samba или FTP (FTP, естественно, надо поднять предварительно на сервере и скопировать в каталог, доступный через FTP, дистрибутив винды).
2. Делим диск и копируем винду на целевую машину, как это описано здесь (копия). Понятно, что вместо флешек с виндами используем FTP, Samba и возможности PXE-сервера.
3. Пользуемся Boot Windows from HDD или Boot Windows from HDD (DOS method) чтобы запустить установщик винды на целевой машине.
И ТЕЛЕМАРКЕТ!
— Компьютер, с установленной Windows 7 🙂
— Достаточное место на HDD, со всеми потрохами этот процесс сожрал ~50Гб на диске.
— Образ Windows Automated Installation Kit (WAIK)
— WinBuilder — небольшая утилита, позволяющая автоматизировать процесс создания образа. О ней ниже.
— Чистый (!) образ установщика какой-нибудь одной версии Windows 7, сборки разной степени колхозности, а так же образы дисков все-в-одном (AIO) не подойдут. Скорее всего WinBuilder прекратит работу с какими-нибудь неудобоваримыми глюками. Поскольку я собрался делать образ x86 (32-разрядный), то и скачал Windows 7 Ultimate x86 с рутрекера.
— Универсальные наборы драйверов для сети, чипсетов и устройств хранения данных. О них ниже.
— Какая-нибудь виртуальная машина для тестирования полученного образа. У WinBuilder в комплекте есть QEMU, но желательно поставить VMWare, в нужный момент WinBuilder ее «подхватит», создаст свою виртуалку и запустит на ней образ
-cdrkit в Linux, для создания ISO-образа.
HBCD, как я уже говорил — «очень полезный горшочек», набор утилит для всяческого восстановления, форматирования, установки винды, и т.д.
Последняя версия, несмотря на то, что из нее убрали весь пиратский софт, стала только больше, и весит 700 Мб, хотя я помню версии по 250 Мб. Но можно распотрошить CD и грузить его по частям. Распакуем образ и приступим.
Это Linux-окружение для всяких работ с диском (делением на разделы, форматированием и т.д.). Но надо сказать, слегка капризное в отношении загрузки по сети.
Поскольку, программе мало ядра и initrd, лучше создать отдельный ISO-образ с ней. В каталог iso_root надо скопировать каталог pmagic из \Boot образа HBCD. Также нужно добавить загрузчик и составить соответствующие конфиги.
Вот переписанный с конфига HBCD конфиг для isolinux:
isolinux.cfgPasteBin (Mega.nz) — основное меню диска other.cfgPasteBin (Mega.nz) — дополнительные варианты загрузки, есть утилиты недоступные из основной конфигурации.
Главное, не забыть в каждую конфигурацию загрузки добавить опцию livemedia noeject, без нее не видит файлов из своей ФС.
1. Из \Boot HBCD копируются два файла SeagatDW и SeagatDW.gz в отдельный каталог.
2. Переименовываем строчными буквами (т.е. в sgdw и sgdw.gz)
3. Грузим, как обычный Linux-дистрибутив.
LABEL sd
menu label Seagate Disk Wizard
kernel distrib/hbcd/seagate/sgdw
initrd distrib/hbcd/seagate/sgdw.gz
append rw ramdisk_size=32768 acpi=off quiet noapic mbrcrcs on vga=788
В Linux создать файл нужного размера не просто, а чрезвычайно просто. Есть утилита dd и устройство /dev/zero, которое отгрузит вам нужное количество символов с кодом 0.
Например, создадим файл размером 20 Мб:
dd if=/dev/zero of=file.zero bs=20M count=1
В винде (7 и выше) появилась утилита fsutil, способная сделать аналогичную операцию:
fsutil file createnew <filepath> <size>
где: <filepath> — путь к файлу <size> — размер файла в байтах
Правда, у этой утилиты есть 2 неудобных момента:
1. Она хочет права администратора, и с этим ничего не поделать штатными средствами, но можно, например поделать моей утилитой wsudo (копия)
2. Надо указывать размер файла в байтах, что не очень удобно. А вот с этим вполне можно бороться, написав батник-обертку, который будет обрабатывать еще один параметр — модификатор единиц измерения (килобайты или мегабайты), вычислять нужное значение в байтах и вызывать fsutil.
1. Проверяем параметры CMD-файла:
@echo off
if "%~1" EQU "" (
echo No arguments. Use "%~n0%~x0 <filename> <size> [K|M]"
exit /b 1
)
символ ~ удаляет кавычки из переменной %1 (первый аргумент командной строки CMD/BAT файла), if сравнивает значение переменной в кавычках с пустыми кавычками. Если первого аргумента нет, выводится соответствующее сообщение и скрипт завершает работу с кодом возврата 1 (exit /b 1)
2. Выводим справку по использованию CMD-файла:
if "%~1" EQU "/?" (
echo Use "%~n0%~x0 <filename> <size> [K|M]"
exit /b 1
)
В переменной %0 хранится путь к самому CMD-файлу, конструкция %~n0 обрезает полный путь до имени файла (без расширения), а %~x0 — оставляет одно расширение (с начальной точкой). Конструкции %~n<номер> и %~x<номер> можно использовать только с аргументами командной строки.
Запуск CMD-файла без параметров: zerofile.cmd
No arguments. Use "zerofile.cmd <filename> <size> [K|M]"
и с параметром вывода справки: zerofile.cmd /?
Use "zerofile.cmd <filename> <size> [K|M]"
3. Теперь проверим, указан ли в имени файла путь к нему, если не указан — добавим к имени файла текущий каталог:
if "%~1" EQU "%~n1%~x1" (
set FILENAME=%CD%\%~1
) else (
set FILENAME=%~1
)
Если имя файла (первый параметр) равно этому же имени и расширению, значит, путь не указан, в качестве пути добавляем текущий каталог, и записываем его в переменную FILENAME.
4. Установим удобные имена переменных для остальных параметров — размера файла и единицы измерения:
set FILESIZE=%~2
set ED=%~3
5. Теперь надо проверить, является ли размер файла целым положительным числом.
Штатных проверок в языке CMD/BAT файлов не предусмотрено, но можно пойти на хитрость. Известно, что команда set способна делать арифметические действия над числами и переменными (надо установить ключ /a и написать выражение в кавычках). Если в переменной встретится не число, то set автоматически будет считать значение переменной равным 0. Соответственно, в результате получится значение с учетом этого. Значит достаточно сделать с переменной какое-то действие, которое не приведет к изменению значения (например, отнять и прибавить единицу), а потом проверить, получился ли положительный результат.
set /a "RES=FILESIZE+1-1"
if %RES% LEQ 0 (
echo Can't create file with size %RES%
exit /b 2
)
6. Проверяем, какая единица измерения установлена в 3 параметре CMD-файла. Если в качестве параметра установлена K(k) — килобайты, M(m) — мегабайты. Что-то еще или ничего — размер файла задается в байтах.
if "%ED%" EQU "K" goto :kb
if "%ED%" EQU "M" goto :mb
if "%ED%" EQU "k" goto :kb
if "%ED%" EQU "m" goto :mb
goto :create
7. Вычисляем размер файла в байтах:
:kb
set /a "RES=FILESIZE*1024"
set ST=%FILESIZE% Kb
goto :create
:mb
set /a "RES=FILESIZE*1024*1024"
set ST=%FILESIZE% Mb
8. Выводим summary и создаем файл нужного размера:
Способ довольно странный, а само Linux-окружение для установки несколько кривовато, потому пишу больше чтоб тему закрыть и к установке XP более не возвращаться.
Принцип действия программы основан на возможности установки Windows XP из под DOS. Сначала по сети грузится специальный дистрибутив Linux (ядро и initrd), он настраивает сеть, подключает нужные сетевые шары, запускает предварительное конфигурирование, генерирует файл unattend.txt и разные послеустановочные скрипты, теоретически запускающие установку необходимых программ. На практике вся автоматизация работает криво (возможно, надо править скрипты и конфиги), но доступ к установщику винды, который думает, что запущен из-под DOS, мы в результате получаем.
Установка Linux-окружения
Вот где, кто и когда и откуда эту штуковину взял, я не ведаю. Поэтому вот вам архив прямо с сервера (естественно, без дистрибутива винды внутри).
Распаковываем содержимое каталога unatxp (внутри архива) куда-нибудь в отдельный подкаталог в каталоге с дистрибутивами на PXE-сервере.
Пусть будет для примера такой вот путь: /home/pxe/tftp/distrib/windows/unatwinxp
Настройка шары
Для работы установочному Linux-окружению необходимо расшарить каталог distrxp
Добавляем в smb.conf:
Дистрибутив XP надо скопировать с установочного диска или распаковать из ISO-образа и поместить в подкаталог distrxp/os/winxp, а также установить права на все файлы в подкаталогах в 755.
cd /home/pxe/tftp/distrib/windows/unatwinxp/distrxp/os/winxp
chmod -R 755 *
LABEL winxpunatted
menu label Windows XP Unattended install
kernel distrib/windows/unatwinxp/bzimage
initrd distrib/windows/unatwinxp/initrd.gz
append z_user=guest z_password=guest z_path=\\10.10.1.5\unatdistr
Как видно из кода выше, необходимо передать ядру Linux-окружения имя пользователя и пароль для доступа к шаре, а также ее адрес на сервере. Все данные передаются в соответствующих параметрах ядра.
Подготовка целевой машины
Теперь надо подготовить машину, на которую будем устанавливать XP. На самом деле, Linux-окружение само предложит переделить диск и сделать активный раздел при помощи своих инструментов, но я ему не особо доверяю, потому сделал это с помощью Acronis. Главное, чтоб перед установкой на машине уже был активный раздел, отформатированный в FAT32, иначе Linux-окружение перевет работу где-то на середине, и выбросит в линуксовую консоль, так и не запустив эмулятор DOS.
— Довольно кривое Linux-окружение
— Много мелких суетливых движений, как говорил классик. Необходимость отвечать на кучу вопросов.
— Требует раздел FAT32, потом придется переделывать командой convert.
+ Отсутствует возня с сетевыми драйверами и BINL
+ Идет даже на очень слабых машинах, тестировалось на PIII 700
Оказывается, на некоторых машинах такая конфигурация может неожиданно сглючить. Загрузчику 7 и 10 Windows почему-то периодически не нравится образ виртуального HDD с DOS. Переделал так, чтобы было без DOS-окружения совсем, а GRUB4DOS стартовал из загрузочного ISO-образа.
Загрузочное меню
Составляем загрузочное меню GRUB4DOS, в принципе, все делается по инструкции, нужен лишь редактор, поддерживающий переносы строк Windows/DOS (CR+LF). И стоит обратить внимание на то, что этот загрузчик GRUB4DOS чувствителен к регистру имен файлов, поэтому файл menu.lst необходимо назвать строчными буквами.
Загрузочный ISO я сделал в Linux, с помощью утилиты mkisofs.
1. Создаем где-нибудь в удобном месте каталог iso_root
2. Копируем в каталог файлы menu.lst, alt.lst и загрузчик GRUB4DOS grldr
3. В каталоге уровнем выше iso_root делаем скрипт для создания ISO-образа
В прошлой заметкеКопия мы делали так, чтобы можно было грузить по сети Mini Windows XP из Hiren’s Boot CD 15.2.
Такой способ запуска Mini Windows XP заодно избавляет от необходимости подгружать с помощью BINL необходимые драйвера сетевых карт и ебли с загрузчиками. А значит, можно поставить и «большую» XP. По сети.
Организуем шару
Сделаем на нашем сервере отдельную шару под дистрибутив XP, у меня она уже была, т.к. раньше я тоже использовал немного другой способ установки XP с помощью специального Linux-окружения, но там надо было нажимать больше кнопок и вводить серийный номер. Поэтому в примере будет длинный и странный путь к шаре.
1. Проверить, есть ли по необходимому пути файл winnt32.exe
2. Если нет, подключить шару.
3. Подождать
4. Выполнить winnt32.exe с необходимыми параметрами.
Пример файла xpinstall.bat:
SET NETADDR=\\192.168.0.20\unatdistr
SET NETDRIVE=Z
SET INSTALLPATH=\os\winxp\
SET UNATTEND=W:\scripts\unattend.txt
SET SYSDRIVE=D
if exist %NETDRIVE%:%INSTALLPATH%i386\winnt32.exe goto INSTALL
net use %NETDRIVE%: %NETADDR%
sleep 5
:INSTALL
%NETDRIVE%:
cd %INSTALLPATH%
i386\winnt32.exe /s:%NETDRIVE%:%INSTALLPATH%i386 /syspart:%SYSDRIVE% /tempdrive:%SYSDRIVE% /unattend:%UNATTEND%
pause
В принципе, в самом файле нет ничего интересного, но есть момент, на котором стоит остановиться. Это параметры запуска winnt32.exe:
/s:<путь> — путь к файлам дистрибутива, обязательно в конце указывайте каталог <code >i386, иначе не сработает. /syspart:<буква_диска>— раздел, на который будет установлена ОС. /tempdrive:<буква_диска> — раздел для временных файлов, он обязательно и под той же буквой должен быть доступен, как из WinPE, так и после перезагрузки. Вообще лучше всего поставить тот же раздел, что и системный. Установщик потом сам потрет все лишнее. /unattend:<путь> — путь к файлу автоматизации установки (unattend.txt)
После двоеточий пробелы НЕ НУЖНЫ!
Полученный BAT-файл нужно положить в шару hbcdshare, созданную в прошлой статье, например в отдельный каталог scripts вместе с утилитой sleep и файлом unattend.txt, права исполняемым файлам надо установить в 755.
chmod 755 xpinstall.bat
chmod 755 sleep.exe
Минус данного способа. Перед установкой ОС, соответствующий раздел, указанный в параметрах /syspart и /tempdrive должен быть отформатирован и доступен из WinPE, а также этот раздел должен быть активным.
После запуска данного BAT-файла запустится программа установки, которая скопирует содержимое дистрибутива XP на жесткий диск, установит загрузчик, после чего необходимо будет перезагрузиться уже с жесткого диска, и продолжить установку.
Утилита InstallGenerator
Минус в использовании шары и скрипта запуска установщика с нее, в том, что если нужно поменять букву диска для установки, или адрес самой шары, то придется лопатить батник из Linux (шара для безопасности доступна в режиме Read Only).
Чтобы это можно было как-то побороть, наскриптил небольшую утилиту InstallGenerator. При необходимости что-то поменять вживую, можно запустить ее, указать другие пути для сохранения конфигов, адреса шары и других параметров.
Поступить также, положить в отдельный каталог в шаре для WinPE и поставить в каталоге права 755 (или 777).
chmod 755 *
При зппуске InstallGenerator из WinPE появится следующее окно:
Здесь можно будет выбрать нужные опции. Программа сгенерирует BAT-файл, скопирует файлы в указанное расположение, и, при необходимости, запустит скрипт.
Для генерации скрипта, программа берет данные из файла script.txt, так что его можно всегда подправить. Программа лишь заменяет строки между ! и # на соответствующие значения внутренних переменных.
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
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
Примечание: паузы нужны, иначе монтирование может случиться раньше, чем блочное устройство (раздел), появится в /dev/mapper и ничего не примонтируется.
Для создания минимально работающего 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
Внимание! Править 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 и были вытащены все нужные имена файлов.
Итак, что же все-таки делать с остальным софтом? Ну у нас же PXE, а значит есть сервер с Samba. В следующем выпуске я таки начну сначала, и расскажу, как настроить PXE на Linux-машине, и Samba в т.ч. Пока ограничусь секцией конфига smb.conf для этой конкретной шары:
В каталог /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...
Если все сделано правильно, то после загрузки 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 или перезагрузить компьютер):
Измененный 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