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

    Введение


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

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

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 17

      0
      Спасибо! Есть ли замена одной из важнейших возможностей wds — автоматической установки драйверов прямо в процессе установки?
        0
        WDS не ставит драйвера в процессе установки. Они либо уже интегрированы в install.wim, либо ставятся автоматически после, например через WSUS.
          0
            0
            Рили, рили. Это работает для boot.wim. Приведу пример: вы добавили драйвера сетевой карты через оснастку WDS, да, теперь винда может быть установлена по сети, но после установки вы убедитесь, что дров на сетевуху в системе нет. Я постоянно с этим сталкиваюсь. Приходится пересобирать install.wim и добавлять в него неизвестный драйвер.

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

              Я так напоролся взяв готовый пакет драйверов для WinPE 5.0 (NDIS 6.4) и разворачивая через него семёрку (NDIS 6.2) на компьютеры с интеловскими сетевушками.
                0
                Так в этом и фишка же. Как начнется установка из сетевой папки, если в установленной винде не будет дров на сетевуху? Она и в домен не влетит со всеми вытекающими. Соответственно надо заранее через DISM интегрировать дрова на сеть. А дальше уже дрова можно и через WSUS получить. Следовательно смысла в установке дров потом по сети как бы и нет.
            +1
            Видимо, на паре десятков различных конфигураций железа за последние несколько лет оно всё ставилось с помощью святого духа :)

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

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

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


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

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

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

            Причем, после небольших доработок, можно сделать автоопределение оборудование в VBScript с помощью WMI-запросов, и ставить все драйверы автоматически.
              0
              Я не понимаю зачем такие ухищрения, если используется WSUS?
                0
                Установка драйверов через MDT работает гораздо быстрее, что важно при массовом развертывании ОС.

                Через WSUS ставятся далеко не все драйверы. Попробуйте ка поставить ASUS ACPI драйвер через WSUS. Гарантированно он ставится, только если зашить его в образ, см. п. 11.
                  0
                  К тому же сетевые драйверы в PE и в устанавливаемую систему все-равно придется добавлять не через WSUS.
                    0
                    Про PE вопросов нет. Если какие-то драйвера не ставятся через WSUS, то естественно их можно зашить в install.wim, как и те же драйвера на сеть. WSUS более универсальный вариант, не надо каждый раз пересобирать образ установки, можно обновлять/отклонять драйвера. Проще контролировать установку прям в оснастке WSUS.
              0
              Если вы ставите образ через MDT, вам тоже не нужно каждый раз пересобирать установочный образ. Драйверы добавляются на лету во время установки аппаратно-независимого образа. Причем только нужные драйверы. Познакомьтесь с технологией.
                0
                Хорошо, спасибо, посмотрю при случае.
                  +1
                  Вот неплохое руководство на эту тему:

                  Установка Windows 7 – часть 24: Управление драйверами – проблемы и подходы к их решению
                  www.oszone.net/12991/Windows-7-install-24

                  Установка Windows 7 — часть 26: Управление драйверами – по марке и модели
                  www.oszone.net/13275/Windows-7-install-26

              Only users with full accounts can post comments. Log in, please.