Содержание статьи
Предисловие
Уже после того, как была написана вторая часть, возникли некоторые вопросы при работе с разными версиями Windows, а именно разрядностью систем Windows PE и инсталляторами дистрибутивов. На разных машинах не определялись то диски, то сетевая карта. Ставить систему на лету хорошо, а еще лучше базовый пакет ПО засунуть прямо в устанавливаемую ОС, чтобы после инсталляции системы получить ее сразу с готовым ПО. Образов дисков ISO очень много, распаковывать и копировать структуру не очень круто, намного круче автоматизировать этот процесс, да так, чтобы даже после замены самих ISO-образов на другие версии монтировались на лету в каталоги SMB. Эти проблемы сегодня мы и попытаемся решить.
Планы
Итак, планы на сегодня!
- Разрешить проблему разных версий Windows в части разрядности.
- Разобраться с проблемой «неопределения» дисков и сетевых карт.
- Автоматизировать подключение образов дистрибутивов различных систем + мониторинг результата.
Опять-таки начинаем по порядку с Windows
Первым шагом в предыдущей статье полагалось использовать одну версию Windows PE, однако возникла проблема запуска инсталляторов x32-версий Windows. Тогда было решено идти по пути наименьшего сопротивления и собрать WinPE x32 так же, как описывалось в прошлой статье. И все бы ничего, да запустить ее оказалось невозможно. Windows PE панически выпадала в ошибку на этапе загрузки. Проблема оказалась в BCD-файле. Выход был следующий: создавать два каталога с одинаковой структурой внутри, но с разными именами (например, /images/windows/x32 и /images/windows/x64). Напомню, что полный путь к Windows-образам TFTP у нас /var/lib/tftpboot/images/windows. Но тогда не совсем удобно работать с самими winpe.wim-файлами и одинаковыми именами файлов.
Для большего комфорта советую воспользоваться программой BOOTICE (я использовал версию 1.332). В ней можно отредактировать BCD-файл и поправить внутри имя файла WIM-образа. Тогда получим два BCD-файла с одинаковым названием, которые складываем в те самые подкаталоги x32 и x64, а все остальное можно расположить в одном подкаталоге images/windows/. После всех манипуляций все должно грузиться как положено. Понятное дело, теперь необходимо поправить файл startnet.cmd внутри каждого из WinPE-образов. Структуру файла ты можешь посмотреть в предыдущей статье. Если кому-то не нравится консольное меню, то можно сделать простенький exe-лаунчер и запускать его скриптом startned.cmd наподобие autorun. Программ для реализации такого меню полным-полно.
Итак, с этой проблемой справились. На некоторых компьютерах, как я уже писал выше, возникала еще пара проблем.
- При загрузке Windows PE и выборе пункта установки системы в консоль падала ошибка: сетевая папка недоступна. Пингами до сервера с PXE выяснилось, что не было сети, — внутри Windows PE отсутствовали драйверы для сетевой карты.
- После запуска установки Windows на некоторых компьютерах инсталлятор не мог обнаружить диски, проблема та же — отсутствие драйверов, но уже для накопителей.
Решение этих проблем
Первым делом заходим на сайт driverpacks.net и скачиваем интересующие нас драйверы x64- и x86-версий для LAN и Mass Storage. Сразу скажу, что пихать оба пака — и x32, и x64 — в оба WIM не нужно, только напрасно увеличишь его размеры. Распаковываем в удобный для работы каталог (например, C:\lan_driver_x32 и по аналогии). Далее так же, как и в прошлый раз для работы внутри WIM-образа, подключим его. Пример интеграции драйверов приведен для x64-битной версии:
imagex /mountrw winpex64.wim 1 mount
Далее добавляем драйверы:
Dism /image:C:\winpe\mount /Add-Driver /Driver:"C:\!Driver_x86" /Recurse
где
- Dism — грубо говоря, новый imagex;
- image:C:\winpe\mount — указываем, где подключен WIM-образ;
- /Add-Driver — параметр говорит о том, что интегрируем драйверы;
- /Driver:"C:!Driver_x86" — каталог с распакованными драйверами;
- /Recurse — говорит шерстить каталог с драйверами рекурсивно.
После этого отключаем образ:
imagex /unmount /commit mount
Проделываем этот фокус с нужными драйверами для нужных версий Windows. Все бы ничего, но, как говорится, хорошая мысля приходит опосля. Так и в этом случае посетила идея. Раз у нас есть система, которая устанавливается автоматом, не задавая лишних вопросов, неплохо бы иметь после установленной системы сразу необходимый софт в комплекте, медиаплееры, офис, Jabber-клиент, правильные браузеры. Что ж, сделаем и такой дистр.
Ставим с нашего PXE-сервера (можно на виртуальную машину) Windows, у нас это Windows 7 x32 (делал по заказу админа). Далее ставим необходимый софт, у нас это офис и кодеки. После всех манипуляций активируем учетную запись администратора, заходим под ней, удаляем учетную запись, которую создали в процессе установки, далее удаляем каталоги пользователя, которого удалили. После чего запускаем cmd с правами админа. Воспользуемся программой sysprep. Находится она тут: C:\Windows\System32\sysprep\sysprep.exe, в параметрах ставим галку «Подготовка к использованию».
И «Параметры завершения работы -> Завершение работы». После того как машина выключится, грузимся с PXE winpe.wim образа, предварительно так же смонтировав образ и положив программку imagex в корень, например так: C:\winpe\mount\imagex.exe (путь указан в каталог с подключенным образом). Далее, когда выходит меню WinPE, жмем
Захват образа
Для начала подготовим сетевую общую папку с правами на запись, в которую будем захватывать образ WIM. У меня это \192.168.181.4\buf. Далее вернемся к машине, где у нас запущен WinPE с консолью. Подключаем сетевой каталог:
net use D: \\192.168.181.4\buf
Запускаем imagex с такими параметрами:
imagex /capture C: D:\install.wim "Windows 7 Professional x64" /compress maximum
где
- /capture С: — захват раздела C;
- D:\install.wim — куда сохранять D;
- "Windows 7 Professional x64" — имя образа, должно быть заключено в кавычки;
- /compress maximum — тип сжатия файлов в образе.
После всего получаем файл install.wim и заменяем им файл insltall.wim в образе, который находится в каталоге Source. Важно: размер получившегося образа не должен превышать 4 Гбайт.
Автоматизация подключения ISO-образов
Для начала подготовим папки. Итак, у нас настроен общий каталог с именем windows. Внутри создаем подкаталоги, куда будут подключаться ISO-образы:
- win2012;
- win8x32;
- win8x64;
- win7x32;
- win7x64;
- win7cutomx32;
- kubuntu15.10;
- elementaryos64.
Как ты заметил, у меня две Live-версии Ubuntu, именно поэтому я положил их в этот же каталог. Далее складываем ISO-образы в какую-нибудь папку, например в /home/user/iso. Имена файлов ISO должны соответствовать именам каталогов, созданных ранее (например: win7x32 — win7x32.iso). Далее создаем скрипт /opt/isodistr.sh:
#!/bin/bash
found=$(losetup -a | grep win)
foundlinux=$(losetup -a | grep linux)
if [ -n "$found" ]; then
echo 1 >/var/log/isomount.log 2>&1
else
isopath="/home/samba/shares/iso/"
mountiso="win7 win7x32 win8 win8x32"
format=".iso"
distpath="/home/samba/shares/distr"
mountisolinux="elementaryos64 kubuntu15.10"
for name in $mountiso; do
mount -t udf -o loop $isopath$name$format $distpath/$name >/dev/null 2>&1 && echo 0 >/var/log/isomount.log
done
fi
if [ -n "$foundlinux" ]; then
echo 1 >/var/log/isomountlinux.log 2>&1
else
for name2 in $mountisolinux; do
mount -t iso9660 -o loop $isopath$name2$format $distpath/$name2 >/dev/null 2>&1 && echo 0 >/var/log/isomountlinux.log
done
fi
exit
В двух словах о том, что он делает. Скрипт монтирует ISO-образ, сопоставляя имя ISO-образа и имя папки. Результат пишется в лог в виде 1 — если каталоги до этого были примонтированы и 0 — если образы примонтированы не были и примонтировались при последнем запуске.
Далее делаем его исполняемым командой sudo chmod +x, добавляем в cron пользователя, у которого есть доступ во все каталоги и файлы, задание запускать скрипт раз в пять минут.
# crontab -e
*/5 * * * * /opt/isomount.sh
Почему логи в виде 0 и 1
У меня есть Zabbix-сервер, который мониторит и в случае чего шлет эсэмэски. Вот для мониторинга состояния этого хозяйства и сыпем в лог 0 и 1. Чтобы научить Zabbix работать с этими данными, необходимо добавить в файл настроек /etc/zabbix/zabbix_agentd.conf такие строки:
UserParameter=mountisodistr,cat /var/log/isomount.log
UserParameter=mountisodistrlinux,cat /var/log/isomountlinux.log
После чего в веб-интерфейсе Zabbix на узел добавить элемент данных мониторинга mountisodistr и mountisodistrlinux. На выходе получаем симпатичный график.
Под конец немного о наведении красоты
Основной файл меню PXE — это pxelinux.cfg/default. Чтобы не громоздить внутри него лишние настройки, в данном случае стилевые, просто выносим их в отдельный файл и указываем на него в default.
include pxelinux.cfg/themes
FONT pxelinux.cfg/UniCyr-sans-8x16.psf
menu color title 5;10;20 #019ccf #00000000 none
menu color border 0 #757574 #00000000 none
#menu color unsel 0 #8ea206 #00000000 none
#menu color sel 0 #ffffff #00000000 std
menu color unsel 0 #90ffffff #00000000 none
menu color sel 0 #ff60CA00 #00000000 std
menu color tabmsg 0 #ffffff #00000000 none
#menu background pxelinux.cfg/background/back_23.png
menu background pxelinux.cfg/background/back1.png
menu cmdlinerow 18
menu timeoutrow 18
menu tabmsgrow 18
menu tabmsg Press ENTER to boot
Как видно из конфига, задавать можно все, от настроек фона до обводки текста. Для фоновой картинки необходимо использовать небольшое изображение размерами 640 x 480. Для корректного отображения русского языка необходимо сменить кодировку файла меню либо сконвертировать его с помощью скрипта:
#!/bin/bash
echo "Recoding config file to IBM866"
more ishod | iconv -t IBM866 > recod
И подсунуть шрифт формата PSF с поддержкой кириллицы. И твое меню сразу станет веселее. 🙂
Вот, собственно, и всё! Проект подошел к своему логическому завершению. Остается поблагодарить сообщество омских линуксоидов OmskLUG и Рината Рафаиловича Латыпова, он же Sosed213, за оказанную помощь.
P. S.
Хочется отметить, что проект оказался полезным. После написания статьи установка Windows-систем была портирована на загрузочную флешку, где уже лежали Android’ы, Linux’ы и образы серверных решений вроде OpenMediaVault, OSSIM и Zentyal. Правда, пришлось пересобирать WinPE заново и BCD-файл из-за структуры каталогов на самой флешке. По вопросам настройки можешь обращаться на email: plus@omsklug.com. Всем большое спасибо за адекватные комменты и удачи! Дальше будет только интересней. 😉