Введение
Образы в WIM формате, подготовленные в системе MDT, компания Microsoft предлагает развертывать по сети с помощью WDS-сервера, либо интегрировать в SCCM.
SCCM стоит довольно дорого, а вот WDS-сервер бесплатен в случае, если вы являетесь счастливым обладателем лицензии на Windows Server 2008/2012. Но не всех устраивают возможности WDS-сервера.
Предлагаемый мной способ будет полезен тем:
- у кого нет лицензии на Windows Server, или все ресурсы на имеющихся серверах уже задействованы и нет возможности приобрести еще одну лицензию;
- кого не устраивает скорость загрузки Windows PE по протоколу TFTP, используемому WDS-сервером;
- кому необходимо совместить развертывание ОС Windows и Linux по сети на одном сервере.
Хочу предложить читателям решение на базе ОС Ubuntu Linux, с использованием syslinux и iPXE.
В дальнейшем будет подразумеваться использование ОС Ubuntu 14.04 LTS.
Упомянутые ниже службы не обязательно должны работать на одном и том же сервере.
Установка и настройка tftp-сервера
Для организации передачи данных по TFTP-протоколу будет использован сервер tftpd-hpa. Он обладает необходимыми возможностями, а также поддерживает remapping.
Установим соответсвующий пакет:
aptitude install tftpd-hpa
Настройки находятся в конфигурационном файле
/etc/default/tftpd-hpa
RUN_DAEMON="yes"
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --listen --verbose --verbosity 10 --map-file /etc/tftpd.remap --refuse blksize"
Также нам потребуется файл с правилами для remapping
/etc/tftpd.remap
rg \\ /
ri (.*)y$ \1
ri (.*)M-\^\?$ \1
ri (pxelinux\.0).*$ \1
Первая строка переопределяет слэши для ОС Windows, последующие предупреждают возможные проблемы с загрузкой на некоторых сетевых адаптерах, когда клиент пытается запросить у tftp-сервера файл «pxelinux.0M-^» или «pxelinux.0y» вместо «pxelinux.0».Настройка http-сервера
Для чего вообще нам нужен http-сервер, ведь для загрузки WIM-образов по сети достаточно tftp-сервера?
Так получилось, что Trivial FTP хоть и обеспечивает базовые функции для передачи файлов по сети, но не может обеспечить высокую надежность и скорость передачи данных.
Как показывает практика, образы с Windows PE размером около 250МБ, скачиваются по сети 1Гбит с использованием http-протокола в несколько раз быстрее (5-10 секунд, против 30-60 секунд соответственно).
Также по протоколу http можно загружать preseed-файлы для установщика debian-installer.
В качестве http-сервера можно использовать apache, nginx или любой другой сервер который вам нравится. Каких-либо особенных настроек не требуется. Главное, чтоб перечисленные ниже файлы *.ipxe, *.wim и другие файлы, размещенные на http-сервере, были доступны для чтения.
Настройка dhcp-сервера
Согласно RFC1232 необходимо настроить опцию 66 TFTP server name, где указать IP-адрес вашего tftp-сервера, например 192.168.1.1; и опцию 67 Bootfile name, где указать имя файла для загрузки «pxelinux.0»;
Если вы используете, например isc-dhcp-server под управлением Ubuntu, то нужно будет добавить примерно такие настройки в файл
/etc/dhcp/dhcpd.conf
shared-network PXE-Netwotk {
subnet 192.168.1.0 netmask 255.255.255.0 {
# Общие настройки для подсети
range 192.168.1.2 192.168.1.254;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.1.1;
# Настройки опций для сетевой загрузки в подсети
filename "pxelinux.0";
next-server 192.168.1.1;
option root-path "192.168.1.1:/var/lib/tftpboot/"; # необязательный параметр
}
}
Установка и настройка загрузчика syslinux
Установка загрузчика
Нам потребуется syslinux версии 5.03 или выше.
Я бы рекомендовал собрать загрузчик из исходных кодов, ничего страшного и сложного в этом нет
Для сборки из исходников нужно установить make, gcc, nasm, uuid-dev, и выполнить команды:
# Скачаем архив с исходными кодами
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip
# распакуем его
unzip syslinux-6.03.zip -d syslinux-6.03
# Собственно сама сборка с помощью make
cd syslinux-6.03
make
# Скопируем полученные файлы в каталог tftp-сервера:
cd ..
cp syslinux-6.03/bios/memdisk/memdisk /var/lib/tftpboot/
find ./syslinux-6.03/bios/ -name "pxelinux.0"|xargs -I {} cp '{}' /var/lib/tftpboot/
find ./syslinux-6.03/bios/ -name "*.c32"|xargs -I {} cp '{}' /var/lib/tftpboot/
Настройка меню загрузчика
Создадим каталог для файлов меню syslinux:
mkdir -p /var/lib/tftpboot/pxelinux.cfg/
И создадим файл с меню по умолчанию/var/lib/tftpboot/pxelinux.cfg/default
А теперь создадим подменю непосредственно для загрузки ОС:ui vesamenu.c32
PROMPT 0
menu background background.jpg
menu title PXE boot menu
# По умолчанию загружаемся с первого жесткого диска
LABEL bootlocal
menu label Boot from first HDD
kernel chain.c32
append hd0 0
# Таймаут для автоматической загрузки 12 секунд
timeout 120
TEXT HELP
The system will boot after the time is up
ENDTEXT
# Подменю для центрального офиса
LABEL Central Office ->
KERNEL vesamenu.c32
APPEND pxelinux.cfg/CentralOffice
# Подменю для региональных офисов
LABEL Regional Offices ->
# menu PASSWD $1$15opgKTx$dP/IaLNiCbfECiC2KPkDC0 # раскомментировать если требуется вход в подменю по паролю, пароль Qwerty, алгоритм MD5
KERNEL vesamenu.c32
APPEND pxelinux.cfg/RegionalOffices
/var/lib/tftpboot/pxelinux.cfg/CentralOffice
, где winpe.ipxe — конфигурационный файл с настройками для ipxe, который мы разберем ниже, в соответствующем разделе.PROMPT 0
UI vesamenu.c32
MENU BACKGROUND background.jpg
MENU TITLE Central Office
# Возврат в главное меню
LABEL <- Main Menu
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default
# Загрузка через http
LABEL PE via http
KERNEL ipxe.lkrn
APPEND dhcp && chain http://192.168.2.1/winpe.ipxe
# Для сравнения загрузка через tftp
LABEL PE via tftp
KERNEL ipxe.lkrn
APPEND dhcp && chain tftp://192.168.2.1/winpe.ipxe
# Можно также загрузить debian-installer
LABEL Ubuntu
KERNEL ubuntu-installer/i386/linux
APPEND initrd=ubuntu-installer/i386/initrd.gz preseed/url=http://192.168.1.1/preseed/custom.seed debconf/priority=high auto-install/enable=true debian-installer/language=ru debian-installer/locale=ru_RU.UTF-8 debian-installer/country=RU ipv6.disable=1 netcfg/hostname=testname DEBCONF_DEBUG=5 --
Не стоит забывать, что tftp-сервер не умеет работать с символическими ссылками, поэтому нужно будет сделать отдельную копию файла winpe.ipxe в каталоге tftp-сервера, если захочется сравнить скорость загрузки по http и tftp.
Некоторые сетевые карты не успевают поднять link с первого раза, поэтому можно сделать вторую попытку загрузки в случае неудачи, с использованием оператора "||". Если после второй попытки нас снова постигнет неудача, то можно вывести статистику интерфейса и открыть командную строку для диагностики проблемы:
APPEND dhcp && chain http://192.168.2.1/winpe.ipxe || dhcp && chain http://192.168.2.1/winpe.ipxe || ifstat && shell
iPXE
Установка iPXE
iPXE я тоже предлагаю собирать из исходных кодов, к тому же это тоже очень просто:
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src
make
cp bin/ipxe.lkrn /var/lib/tftpboot
Если какая-либо сетевая карта отказывается поднимать link с любой попытки, то скорее всего проблема в драйвере iPXE.
Особенно эта проблема касается новых сетевых карт от Intel. У меня возникли проблемы с картами i218lm и с i218v-2, при принудительно выставленной скорости 1Гбит на свиче.
Перед сборкой нужно поправить ipxe/src/drivers/net/intel.c: для i218lm и i218v-2 выставить флаг INTEL_NO_PHY_RST:
PCI_ROM ( 0x8086, 0x155a, "i218lm", "I218-LM", INTEL_NO_PHY_RST),
PCI_ROM ( 0x8086, 0x15a1, "i218v-2", "I218-V", INTEL_NO_PHY_RST ),
Установка wimboot
Для загрузки WIM-образов через iPXE потребуется утилита wimboot.
Установка этой утилиты также очень проста:
wget http://git.ipxe.org/releases/wimboot/wimboot-latest.zip
unzip wimboot-latest.zip
cp wimboot-2.5.1-signed/wimboot /var/lib/tftpboot/
Создание конфигурационных файлов .ipxe
Конфигурационные файлы .ipxe (расширение может быть любым, но так удобнее) содержат инструкции для ядра ipxe: что именно загружать дальше.
Мы будем загружать утилиту wimboot, и передадим ей в параметрах пути к файлу данных конфигурации загрузки BCD, файлу конфигурации RAM-диска boot.sdi и к образу boot.wim. Структуру каталогов сохранять не обязательно, wimboot сама позаботиться об этом. Все файлы можно сложить в один каталог.
winpe.ipxe
#!ipxe
kernel http://192.168.1.1/boot/wimboot
initrd http://192.168.1.1/boot/DeploymentShare/Boot/x86/Boot/bcd BCD
initrd http://192.168.1.1/boot/DeploymentShare/Boot/x86/Boot/boot.sdi boot.sdi
initrd http://192.168.1.1/boot/DeploymentShare/Boot/LiteTouchPE_x86.wim boot.wim
boot
В данном примере на http-сервере сделана символическая ссылка для 192.168.1.1/boot/DeploymentShare прямо на корень MDT DeploymentShare. Этот способ не подходит в качестве основного рабочего варианта. Т.к. если Вы вдруг соберете «кривой» wim-образ, то сразу же испортите загрузку по сети для тех, кто с этим работает. Но этот способ хорошо подходит для тестирования новых wim-образов.
Желающие могут заменить в .ipxe файле протокол http на tftp — тоже будет работать, но медленно.
Все. Теперь можно загружаться и ставить ОС.
Источники информации
- msdn.microsoft.com/en-us/library/dn781292.aspx
- msdn.microsoft.com/en-us/library/windows/desktop/dd861280.aspx
- msdn.microsoft.com/en-us/library/aa967394.aspx
- technet.microsoft.com/en-us/library/dn744295.aspx
- tools.ietf.org/html/rfc1350
- manpages.ubuntu.com/manpages/natty/man8/tftpd.8.html
- www.faqs.org/rfcs/rfc2132.html
- www.syslinux.org/wiki/index.php/SYSLINUX
- ipxe.org
Комментарии (17)
OyraOyra
18.12.2015 14:16Если вы ставите образ через MDT, вам тоже не нужно каждый раз пересобирать установочный образ. Драйверы добавляются на лету во время установки аппаратно-независимого образа. Причем только нужные драйверы. Познакомьтесь с технологией.
yosemity
18.12.2015 14:25Хорошо, спасибо, посмотрю при случае.
OyraOyra
21.12.2015 13:05+1Вот неплохое руководство на эту тему:
Установка Windows 7 – часть 24: Управление драйверами – проблемы и подходы к их решению
www.oszone.net/12991/Windows-7-install-24
Установка Windows 7 — часть 26: Управление драйверами – по марке и модели
www.oszone.net/13275/Windows-7-install-26
heathen
Спасибо! Есть ли замена одной из важнейших возможностей wds — автоматической установки драйверов прямо в процессе установки?
yosemity
WDS не ставит драйвера в процессе установки. Они либо уже интегрированы в install.wim, либо ставятся автоматически после, например через WSUS.
navion
O RLY?
yosemity
Рили, рили. Это работает для boot.wim. Приведу пример: вы добавили драйвера сетевой карты через оснастку WDS, да, теперь винда может быть установлена по сети, но после установки вы убедитесь, что дров на сетевуху в системе нет. Я постоянно с этим сталкиваюсь. Приходится пересобирать install.wim и добавлять в него неизвестный драйвер.
Повода не доверять технету у меня нет, но тогда это просто не работает.
navion
Дрова для сети и диска надо интегрировать в загрузочный образ даже в MDT, для чего в оснастке WDS сделали специальную кнопку.
Причем сетевые драйвера должны быть совместимы с целевой системой (например, версия NDIS), так как они инжектируются в неё из WinPE, а уже в полноценной винде стартует задача установки остальных драйверов из сетевой папки.
Я так напоролся взяв готовый пакет драйверов для WinPE 5.0 (NDIS 6.4) и разворачивая через него семёрку (NDIS 6.2) на компьютеры с интеловскими сетевушками.
yosemity
Так в этом и фишка же. Как начнется установка из сетевой папки, если в установленной винде не будет дров на сетевуху? Она и в домен не влетит со всеми вытекающими. Соответственно надо заранее через DISM интегрировать дрова на сеть. А дальше уже дрова можно и через WSUS получить. Следовательно смысла в установке дров потом по сети как бы и нет.
heathen
Видимо, на паре десятков различных конфигураций железа за последние несколько лет оно всё ставилось с помощью святого духа :)
Естественно, дрова для сети интегрируются прямо в загрузочный образ (собственно, иначе у вас вообще ничего не заработает, потому что сети не будет), всё остальное через Driver management. Работает прекрасно. Драйвера появляются сразу после развертывания, именно те, пакеты которых добавлены вручную.
Речь о WinServer2008R2 WDS, более свежую не крутил.
yosemity
А можете уточнить, как вы узнаете какой драйвер необходимо установить? Получается, в случае неизвестной конфигурации вы должны поставить ОС, выяснить какой драйвер нужен (или заранее выяснить по модели устройства) и добавить этот драйвер для автоматической установки. В случае WSUS я вижу, что ОС хочет такой-то драйвер и аппрувлю его сразу или добавляю через Каталог WU c сайта. Мне кажется, что это проще.
Не принижаю достоинств MDT, просто хочу понять чем оно лучше.
heathen
Я не очень представляю, откуда может взяться совсем неизвестная конфигурация. В любом случае у вас есть либо модель железа, либо его спецификации, можно скачать нужные драйверы один раз и добавить их.
Кроме того, насколько я помню документацию (никогда не включал в WSUS обновление драйверов, а быстрое гугление не ответило мне однозначно на этот вопрос), дрова там только WHQL, и если производитель не заапрувил их (заплатив деньги за сертификацию) в Microsoft, через WSUS их не поставить? Если я ошибаюсь, дайте, пожалуйста, ссылочку, буду очень благодарен.
Правда, с моей точки зрения, WSUS — не замена установке дров при деплое ОС. Обновление — да, безусловно.
OyraOyra
Драйверы через оснастку WDS добавляются только в Windows PE. В устанавливаемую систему они из WDS не попадают.
При использовании MDT все решается проще.
Можно добавить все нужные драйверы Out-Of-Box Drivers:
В предустановочную среду они попадут в соответствии с настройками:
При этом я бы советовал вместе с сетевыми драйверами добавлять еще драйверы для дисковых подсистем.
В устанавливаемую систему драйверы попадают согласно правилам, которые можно задать в Task Sequence:
Причем, после небольших доработок, можно сделать автоопределение оборудование в VBScript с помощью WMI-запросов, и ставить все драйверы автоматически.
yosemity
Я не понимаю зачем такие ухищрения, если используется WSUS?
OyraOyra
Установка драйверов через MDT работает гораздо быстрее, что важно при массовом развертывании ОС.
Через WSUS ставятся далеко не все драйверы. Попробуйте ка поставить ASUS ACPI драйвер через WSUS. Гарантированно он ставится, только если зашить его в образ, см. п. 11.
OyraOyra
К тому же сетевые драйверы в PE и в устанавливаемую систему все-равно придется добавлять не через WSUS.
yosemity
Про PE вопросов нет. Если какие-то драйвера не ставятся через WSUS, то естественно их можно зашить в install.wim, как и те же драйвера на сеть. WSUS более универсальный вариант, не надо каждый раз пересобирать образ установки, можно обновлять/отклонять драйвера. Проще контролировать установку прям в оснастке WSUS.