Как стать автором
Обновить

Как обойтись без WDS сервера, при установке Windows из WIM-образов по сети

Время на прочтение6 мин
Количество просмотров25K

Введение


Образы в 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 (.*)ÿ$ \1
ri (.*)M-\^\?$ \1
ri (pxelinux\.0).*$ \1
Первая строка переопределяет слэши для ОС Windows, последующие предупреждают возможные проблемы с загрузкой на некоторых сетевых адаптерах, когда клиент пытается запросить у tftp-сервера файл «pxelinux.0M-^» или «pxelinux.0ÿ» вместо «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
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 --
, где winpe.ipxe — конфигурационный файл с настройками для ipxe, который мы разберем ниже, в соответствующем разделе.
Не стоит забывать, что 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 — тоже будет работать, но медленно.

Все. Теперь можно загружаться и ставить ОС.

Теги:
Хабы:
+4
Комментарии17

Публикации

Истории

Работа

Ближайшие события