Введение


Образы в 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
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 — тоже будет работать, но медленно.

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

Комментарии (17)


  1. heathen
    17.12.2015 18:48

    Спасибо! Есть ли замена одной из важнейших возможностей wds — автоматической установки драйверов прямо в процессе установки?


    1. yosemity
      17.12.2015 20:55

      WDS не ставит драйвера в процессе установки. Они либо уже интегрированы в install.wim, либо ставятся автоматически после, например через WSUS.


      1. navion
        17.12.2015 21:35

        1. yosemity
          17.12.2015 23:52

          Рили, рили. Это работает для boot.wim. Приведу пример: вы добавили драйвера сетевой карты через оснастку WDS, да, теперь винда может быть установлена по сети, но после установки вы убедитесь, что дров на сетевуху в системе нет. Я постоянно с этим сталкиваюсь. Приходится пересобирать install.wim и добавлять в него неизвестный драйвер.

          Повода не доверять технету у меня нет, но тогда это просто не работает.


          1. navion
            18.12.2015 00:38

            Дрова для сети и диска надо интегрировать в загрузочный образ даже в MDT, для чего в оснастке WDS сделали специальную кнопку.
            Причем сетевые драйвера должны быть совместимы с целевой системой (например, версия NDIS), так как они инжектируются в неё из WinPE, а уже в полноценной винде стартует задача установки остальных драйверов из сетевой папки.

            Я так напоролся взяв готовый пакет драйверов для WinPE 5.0 (NDIS 6.4) и разворачивая через него семёрку (NDIS 6.2) на компьютеры с интеловскими сетевушками.


            1. yosemity
              18.12.2015 01:23

              Так в этом и фишка же. Как начнется установка из сетевой папки, если в установленной винде не будет дров на сетевуху? Она и в домен не влетит со всеми вытекающими. Соответственно надо заранее через DISM интегрировать дрова на сеть. А дальше уже дрова можно и через WSUS получить. Следовательно смысла в установке дров потом по сети как бы и нет.


      1. heathen
        21.12.2015 20:13
        +1

        Видимо, на паре десятков различных конфигураций железа за последние несколько лет оно всё ставилось с помощью святого духа :)

        Естественно, дрова для сети интегрируются прямо в загрузочный образ (собственно, иначе у вас вообще ничего не заработает, потому что сети не будет), всё остальное через Driver management. Работает прекрасно. Драйвера появляются сразу после развертывания, именно те, пакеты которых добавлены вручную.
        Речь о WinServer2008R2 WDS, более свежую не крутил.


        1. yosemity
          22.12.2015 02:14

          А можете уточнить, как вы узнаете какой драйвер необходимо установить? Получается, в случае неизвестной конфигурации вы должны поставить ОС, выяснить какой драйвер нужен (или заранее выяснить по модели устройства) и добавить этот драйвер для автоматической установки. В случае WSUS я вижу, что ОС хочет такой-то драйвер и аппрувлю его сразу или добавляю через Каталог WU c сайта. Мне кажется, что это проще.
          Не принижаю достоинств MDT, просто хочу понять чем оно лучше.


          1. heathen
            22.12.2015 10:04

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

            Кроме того, насколько я помню документацию (никогда не включал в WSUS обновление драйверов, а быстрое гугление не ответило мне однозначно на этот вопрос), дрова там только WHQL, и если производитель не заапрувил их (заплатив деньги за сертификацию) в Microsoft, через WSUS их не поставить? Если я ошибаюсь, дайте, пожалуйста, ссылочку, буду очень благодарен.
            Правда, с моей точки зрения, WSUS — не замена установке дров при деплое ОС. Обновление — да, безусловно.


    1. OyraOyra
      18.12.2015 08:31

      Драйверы через оснастку WDS добавляются только в Windows PE. В устанавливаемую систему они из WDS не попадают.

      При использовании MDT все решается проще.
      Можно добавить все нужные драйверы Out-Of-Box Drivers:


      В предустановочную среду они попадут в соответствии с настройками:

      При этом я бы советовал вместе с сетевыми драйверами добавлять еще драйверы для дисковых подсистем.

      В устанавливаемую систему драйверы попадают согласно правилам, которые можно задать в Task Sequence:

      Причем, после небольших доработок, можно сделать автоопределение оборудование в VBScript с помощью WMI-запросов, и ставить все драйверы автоматически.


      1. yosemity
        18.12.2015 12:38

        Я не понимаю зачем такие ухищрения, если используется WSUS?


        1. OyraOyra
          18.12.2015 12:50

          Установка драйверов через MDT работает гораздо быстрее, что важно при массовом развертывании ОС.

          Через WSUS ставятся далеко не все драйверы. Попробуйте ка поставить ASUS ACPI драйвер через WSUS. Гарантированно он ставится, только если зашить его в образ, см. п. 11.


        1. OyraOyra
          18.12.2015 13:11

          К тому же сетевые драйверы в PE и в устанавливаемую систему все-равно придется добавлять не через WSUS.


          1. yosemity
            18.12.2015 13:56

            Про PE вопросов нет. Если какие-то драйвера не ставятся через WSUS, то естественно их можно зашить в install.wim, как и те же драйвера на сеть. WSUS более универсальный вариант, не надо каждый раз пересобирать образ установки, можно обновлять/отклонять драйвера. Проще контролировать установку прям в оснастке WSUS.


  1. OyraOyra
    18.12.2015 14:16

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


    1. yosemity
      18.12.2015 14:25

      Хорошо, спасибо, посмотрю при случае.


      1. 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