Установка Windows Server 2008 по сети с Linux PXE сервера. Кастомизация образа WinPE

    Друзья! Всем доброго дня!

    Мы хотим не только пиарить себя и свои услуги здесь, но и поделиться опытом и знаниями, полученными в ходе администрирования огромного количества проектов, и в конечном итоге сделать достойный и полезный блог. Для этого мы попросили наших инженеров поучаствовать в этом. А на будущее хотим понять: будет это интересно хабровчанам? И если да — то в какой форме?

    Под катом в этот раз пойдет речь об установке Windows Server 2008 по сети с Linux PXE сервера.

    Меню загруженного WinPE.




    Каждый ленивый хороший системный администратор стремится автоматизировать как можно больше неинтересной ручной работы, дабы больше времени посвещать медитации и дзен.
    Пишутся скрипты, файлы ответов для различных визардов, настраиваются системы мониторинга и оповещения, системы управления конфигурациям…
    Ничто не должно отвлекать на пути к просветлению.

    В этой статье я опишу как подготовить образ среды предустановки Windows WinPE для загрузки с Linux PXE сервера.
    У нас он призван решать следующие задачи:
    • Выполнение каких-либо административных действий(обновление прошивки RAID контроллера например)
    • Установка Windows Server 2008 в «ручном» режиме.
    • Полностью автоматическая установка Windows Server 2008

    Настройку серверной части PXE я опущу, т.к. тема достаточна хорошо описана в Internet(например здесь).
    По ходу повествования остановлюсь лишь на тех моментах, которые неообходимы в рамках данной статьи.

    Этап № 1. Windows

    Для подготовки образа WinPE потребуется компьютер с Windows 7 либо Windows Server 2008, а так же установленный пакет Windows AIK

    Когда нужная ОС установлена и пакет инсталирован.
    запускаем Windows PE Tools Command Prompt от имени Администратора


    Монтируем образ winpe.wim для внесения изменений, а так же подготовим загрузчик.
    В открывшейся консоли последовательно вводим команды:
    mkdir c:\winpe
    mkdir c:\winpe\mount
    cd c:\winpe
    copype.cmd amd64 c:\winpe
    mkdir c:\netboot\win\boot
    imagex /mountrw winpe.wim 1 mount
    xcopy c:\winpe\mount\windows\boot\pxe\pxeboot.n12 c:\netboot\win
    xcopy c:\winpe\mount\windows\boot\pxe\bootmgr.exe c:\netboot\win
    xcopy c:\winpe\iso\boot\boot.sdi c:\netboot\win\boot

    Запуск оболочки WinPE осуществляет файл startnet.cmd
    Так как меню у нас на русском языке, нужен редактор позволяющий менять кодировку текста(CP866 в нашем случае).
    Я использую Notepad++
    Путь к файлу: C:\winpe\mount\Windows\System32\startnet.cmd
    Отредактируем его для добавления меню, как на скриншоте выше.
    код скрипта startnet.cmd
    @echo off
    echo.
    echo Запускаю wpeinit.
    echo Подожди немного...
    echo.
    wpeinit
    
    echo  На выбор доступно три режима работы WinPE:
    echo     1) Просто монтируется шара
    echo        и командная строка ждет дальнейших действий.
    echo.
    echo     2) Монтируется smb шара и запускается установщик 
    echo        Windows 2008 R2.
    echo.
    echo     3) Монтируется smb шара и запускается автоматическая
    echo        установка Windows 2008 R2 Standart Full 
    echo.
    echo  Для выбора пункта меню введи соответсвующую ему цифру, 
    echo  а затем нажми клавишу Enter(ошибочный ввод = 1 пункт). 
    set /p ID=
    echo.
    
    if %ID%==1 goto :first
    if %ID%==2 goto :second
    if %ID%==3 goto :third
    if %ID% GTR 3 goto :failure
    if %ID% LSS 3 goto :failure
    exit /b
    
    :second
    echo Ты выбрал пункт меню под номером 2
    echo.
    echo Монтирую smb шару.
    net use j: \\1.2.3.4\public
    echo Запускаю j:\win2008s_x64\setup.exe
    j:\win2008s_x64\setup.exe
    exit /b
    
    :third
    echo Ты выбрал пункт меню под номером 3
    echo.
    echo Монтирую smb шару.
    net use j: \\1.2.3.4\public
    echo Запускаю автоматическую установку: j:\win2008s_x64\setup.exe /unattend:j:\autounattend.xml
    j:\win2008s_x64\setup.exe /unattend:j:\autounattend.xml
    exit /b
    
    :first
    echo Ты выбрал пункт меню под номером 1
    echo.
    :failure
    echo.
    echo Монтирую smb шару.
    net use j: \\1.2.3.4\public
    exit /b
    


    Сохраняем изменения в startnet.cmd.
    Отмонтируем winpe.wim закомитив изменения и скопируем полученный образ к остальным файлам.
    imagex.exe /unmount /commit mount
    xcopy c:\winpe\winpe.wim c:\netboot\win\boot
    

    Теперь займемся настройкой Данных Конфигурации Загрузки (BCD)
    Что такое хранилище данных конфигурации загрузки?
    Хранилище данных конфигурации загрузки содержит параметры конфигурации загрузки и контролирует запуск операционных систем Microsoft Windows Vista и Microsoft Windows Server 2008. Эти параметры ранее хранились в файле Boot.ini (для операционных систем на базе BIOS) либо в памяти NVRAM (для операционных систем на базе EFI (Extensible Firmware Interface)). Для изменения кода Windows, который запускается перед загрузкой операционной системы, можно воспользоваться программой командной строки Bcdedit.exe, с помощью которой можно добавлять, удалять, изменять и дополнять записи в хранилище данных конфигурации загрузки.

    Создадим новый скрипт createbcd.cmd. Он обеспечит генерацию нужной BCD.
    Вновь открываем текстовый редактор и вставляем туда следующий код:
    bcdedit -createstore %1\BCD
    bcdedit -store %1\BCD -create {ramdiskoptions} /d "Ramdisk options"
    bcdedit -store %1\BCD -set {ramdiskoptions} ramdisksdidevice boot
    bcdedit -store %1\BCD -set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
    for /F "tokens=2 delims={}" %%i in ('bcdedit -store %1\BCD -create /d "MyWinPE Boot Image" /application osloader') do set guid={%%i}
    bcdedit -store %1\BCD -set %guid% systemroot \Windows
    bcdedit -store %1\BCD -set %guid% detecthal Yes
    bcdedit -store %1\BCD -set %guid% winpe Yes
    bcdedit -store %1\BCD -set %guid% osdevice ramdisk=[boot]\Boot\winpe.wim,{ramdiskoptions}
    bcdedit -store %1\BCD -set %guid% device ramdisk=[boot]\Boot\winpe.wim,{ramdiskoptions}
    bcdedit -store %1\BCD -create {bootmgr} /d "Windows BootManager"
    bcdedit -store %1\BCD -set {bootmgr} timeout 30
    bcdedit -store %1\BCD -set {bootmgr} displayorder %guid%
    

    Запускаем скрипт.
    createbcd.cmd c:\netboot\win\boot
    

    Приготовим файл ответов autounattend.xml для автоматической установки Windows Server 2008.
    На первом диске сервера создается один раздел, занимающий все пространство диска. ОС ставится в этот раздел, устанавливается пароль для учетной записи Administrator, вводится ключ, но Windows не активируется.
    autounattend.xml
    <?xml version="1.0" encoding="utf-8"?>
    <unattend xmlns="urn:schemas-microsoft-com:unattend">
            <settings pass="windowsPE">
            <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <ComplianceCheck>
                    <DisplayReport>Never</DisplayReport>
                </ComplianceCheck>
    <DiskConfiguration>
       <WillShowUI>OnError</WillShowUI>
       <Disk>
          <DiskID>0</DiskID>
          <WillWipeDisk>true</WillWipeDisk>
          <CreatePartitions>
             <CreatePartition>
                <Order>1</Order>
                <Type>Primary</Type>
                <Extend>true</Extend>
             </CreatePartition>
          </CreatePartitions>
          <ModifyPartitions>
    <!-- Modify the system partition-->
             <ModifyPartition>
                <Order>1</Order>
                <PartitionID>1</PartitionID>
                <Format>NTFS</Format>
                <Label>System</Label>
             </ModifyPartition>
          </ModifyPartitions>
       </Disk>
    </DiskConfiguration>
                <ImageInstall>
                    <OSImage>
                        <InstallFrom>
                            <MetaData wcm:action="add">
                                <Key>/IMAGE/NAME</Key>
                                <Value>Windows Server 2008 R2 SERVERSTANDARD</Value>
                            </MetaData>
                        </InstallFrom>
                        <InstallToAvailablePartition>false</InstallToAvailablePartition>
                        <WillShowUI>OnError</WillShowUI>
                        <InstallTo>
                            <DiskID>0</DiskID>
                            <PartitionID>1</PartitionID>
                        </InstallTo>
                    </OSImage>
                </ImageInstall>
                <UpgradeData>
                    <WillShowUI>OnError</WillShowUI>
                    <Upgrade>false</Upgrade>
                </UpgradeData>
                <UserData>
                    <ProductKey>
                        <Key></Key>
                        <WillShowUI>OnError</WillShowUI>
                    </ProductKey>
                    <AcceptEula>true</AcceptEula>
                    <FullName>serverclub</FullName>
                    <Organization>serverclub</Organization>
                </UserData>
            </component>
            <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <SetupUILanguage>
                    <UILanguage>en-US</UILanguage>
                    <WillShowUI>OnError</WillShowUI>
                </SetupUILanguage>
                <UserLocale>en-US</UserLocale>
                <SystemLocale>en-US</SystemLocale>
                <UILanguage>en-US</UILanguage>
                <UILanguageFallback>en-US</UILanguageFallback>
                <InputLocale>en-US</InputLocale>
            </component>
        </settings>
        <settings pass="specialize">
            <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <InputLocale>en-US</InputLocale>
                <UILanguage>en-US</UILanguage>
                <UILanguageFallback>en-US</UILanguageFallback>
            </component>
            <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <ComputerName>CHANGE-ME</ComputerName>
                    <ProductKey>XXX-ZZZ-YYY-RRR-QQQ</ProductKey>
                    <RegisteredOrganization>serverclub</RegisteredOrganization>
                    <RegisteredOwner>serverclub</RegisteredOwner>
                    <DoNotCleanTaskBar>true</DoNotCleanTaskBar>
                    <TimeZone>UTC</TimeZone>
                <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
        </component>
        </settings>
    <settings pass="oobeSystem">
            <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <UserAccounts>
                    <AdministratorPassword>
                        <Value>ServerMegaSecurePassword111</Value>
                        <PlainText>true</PlainText>
                    </AdministratorPassword>
                </UserAccounts>
            </component>
        </settings>
      <settings pass="offlineServicing">
        <component name="Microsoft-Windows-PnpCustomizationsNonWinPE" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <DriverPaths>
            <PathAndCredentials wcm:keyValue="1" wcm:action="add">
              <Path>j:\</Path>
            </PathAndCredentials>
          </DriverPaths>
        </component>
      </settings>
        <cpi:offlineImage cpi:source="wim:j:/win2008s_x64/sources/install.wim#Windows Server 2008 R2 SERVERSTANDARD" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
    </unattend>
    


    Файл нужно скопировать в корень smb шары, которая монтируется скриптом startnet.cmd.
    Подготовительный этап в Windows близится к завершению, остается скопировать папку c:\netboot\win в корень tftp сервера, а так же разместить в папке доступной для монтирования по протоколу sbm файлы с установочного диска/образа Windows Server 2008.

    Этап № 2. Linux

    Структура нашего меню.



    Конфигурационные файлы tftp.
    /tftpboot/pxelinux.cfg/default
    PROMPT 0
    UI vesamenu.c32
    MENU BACKGROUND pxelinux.cfg/logo.jpg
    MENU TITLE ServerClub PXE Boot Menu
    MENU TIMEOUT 50
    MENU COLOR TITLE 0 #ffffffff #00000000
    MENU COLOR SEL 7 #ffffffff #ff000000

    LABEL CentOS ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/centos

    LABEL Debian ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/debian

    LABEL Ubuntu ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/ubuntu

    LABEL BSD ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/bsd

    LABEL ArchLinux ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/arch

    LABEL Windows ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/windows

    LABEL VmWare ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/vmware

    LABEL LiveCD`s ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/live

    LABEL Utilities ->
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/utils

    /tftpboot/pxelinux.cfg/windows
    PROMPT 0
    UI vesavesamenu.c32
    MENU BACKGROUND pxelinux.cfg/logo.jpg
    MENU TITLE Windows
    MENU TIMEOUT 50
    MENU COLOR TITLE 0 #ffffffff #00000000
    MENU COLOR SEL 7 #ffffffff #ff000000

    LABEL < — Main Menu
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/default

    LABEL Windows2003_x64
    kernel w2k3.0

    LABEL Windows2008_x64_R2(menu inside)
    kernel Boot/pxeboot.n12

    LABEL < — Main Menu
    KERNEL vesamenu.c32
    APPEND pxelinux.cfg/default


    Небольшая демонстрация =)

    Фрагмент начала установки


    На этом все.
    Благодарю за внимание!

    При подготовке статьи использовались следующие источники:

    1. http://gnu.su/news.php?extend.1683
    2. http://dice.neko-san.net/2011/02/automated-windows-server-2008r2-installation-from-a-linux-server-without-machine-imaging
    3. http://technet.microsoft.com/ru-ru/library/cc749415(v=ws.10).aspx

    Автор статьи и по совместительству инженер ServerClubFessAectan
    В какой форме Вам было бы интересно увидеть развитие нашего блога?

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    ServerClub 27,53
    Компания
    Поделиться публикацией
    Комментарии 20
    • 0
      Если будут вопросы, то автор статьи постарается ответить на них в течение дня.
      • +1
        Занятно.
        Закономерный вопрос:
        1. Чем это лучше образа Acronis или Clonezilla?
        2. Сколько по времени занимает подготовить инфраструктуру и образ?
        • 0
          Образ получился мультизадачным.
          Позволяет ставить ОС и откинувшись
          в кресле, по сценарию из файла ответов,
          и производить какие-то специфические
          настройки по запросу клиента(разбивка дисков к примеру)

          По времени, подготовки инфраструктуры, при условии
          уже установленных Linux сервера и Windows машины
          для кастомизации образа, может занять 2-3 часа.
          Но здесь есть масса факторов способных повлиять
          на продолжительность подготовительных работ, будь то
          скорость канала в Интернет, квалификация специалиста и пр.
          • +1
            Очень интересует изложенная тема. Сам полностью перевел развертывание инфраструктуры толстых клиентов на установку по PXE, с подготовленными образами boot.wim + install.win + дрова на сеть (собственная говносборка, все остальные дрова по сети) и автоматическую установку в домене + WSUS+LUP. Однажды дошло до того, что загрузившись с PXE оставил юзеру камп на разметке диска, благо юзер продвинутый. По окончанию установки юзер заходит под доменной учеткой и долбит Центр обновления винды до «зеленого». Все. дальше отсутствие админских прав и SRP решает. Установку 10-30 толстых станций можно провести в сверх-короткие сроки.

            А акронис не рулит потому как дрова разные. В моем случае все приходит нативное, включая дрова и последний софт.
            • +1
              вы можете интегрировать в install.win обновления и драйвера. Можно подготовить install.win в режиме аудита и потом устанавливать.
              На текущий момент у меня лично в планах будет разделение жестого диска на несколько разделов и перенос на стадии установки папки users и program files на другой раздел. Создания скрытого recovery.
          • 0
            *Промахнулся немного в предыдущем комменте

            По времени.
            Подготовка инфраструктуры, при условии
            уже установленных Linux сервера и Windows машины
            для кастомизации образа, может занять 2-3 часа.
            Но здесь есть масса факторов способных повлиять
            на продолжительность подготовительных работ, будь то
            скорость канала в Интернет, квалификация специалиста и пр.
            • 0
              Тут надо заменить некоторые вещи.
              В Windows есть своя система развертования. В 2012 я уже забыл как она называется. (бывшая RIS)
              Там можно дополнительно сделать меню и указать альтернативный загрузчик для загрузки всего другого.
              Помимо AIK есть DART (только для подписчиков MSDN, или что там сейчас вместо нее.) ну и платный syscem conrol center.
              Они сильно упрощают подготовку и развертывания windows среды. Так же следует погуглить на тему аудит системы, который в простой форме может упростить развертывание.
              Я это написал для того, что наверняка будут использовать это how-to линуксоиды, что бы люди могли погуглить некоторые фичи microsoft.

              P.S. Пока это писал — вспомнил, что на хабре пролетала статья по интеграции в RIS установки linux система.
              P.P.S. Ну и я советовал бы использовать minipe от win2012r2, там появилось как минимум утилита для снятие и записи образов итд.
          • 0
            Acronis как минимум платный для фирмы. Причем ценник на текущий момент не очень адекватен.
            Clonezilla можно использовать, но это кастыль для windows.
            На текущий момент снимать образы машины можно сразу в winpe от 2012 в формат например vhd или win.
            Потом произвести его установку.
          • 0
            По поводу интересных тем, которые бы хотелось раскрыть в следующих постах можно оставлять пожелания прямо здесь.
            • +1
              вообще странная просьба, я могу сейчас такого тут пожелать :)

              Например жутко интересует samba4 как ad с общим хранилищем через ceph :)

              В общем огласите весь список!
              • 0
                Один из наших инженеров как раз заниается ceph.
                Тема интересная, но лично мое мнение — AD должна быть на Windows =)
                Касаемо списка — нам интересно писать об IT в принципе, весьма импонирует данный посыл:
                • 0
                  Тогда просто про ceph. Сейчас там много изменений, в частности по настройки.
                  К сожелению на самостоятельное изучение нет времени. Хотя тема для меня очень интересно, но там много тонких моментов.

                  Только хотелось бы не просто тупа статью, сделай так получишь это.
                  Хотелось бы затронуть и настройку, почему именно так. (например там рекомендуется держать отдельно методанные, интуитивно понятно зачем, но не многие могут представить себе последствия если сделать не так)
                  Сделать бенчмарки.

                  Ну а samba4 мы уже там прикрутим сами :)

                  P.S. У меня тут свой шкурный интерес избавится от СХД, хотя я их очень и нежно люблю :)
                  • 0
                    Тут вспомнил, что хотел написать статью про кластер percona server, который работает хорошо — но опять нет время. Буду ждать пенсии и там писать новые мемуары :)
                    • 0
                      Как только выкурим ceph в должной степени, сразу поделимся.
              • НЛО прилетело и опубликовало эту надпись здесь
                • +1
                  Если мне не изменяет память, то надо использовать tftpd-hpa. он умеет делать remap для windows.
                  Я помнится пытался обойти это проблему, но потом уволился из компании и проект не закончил :)
                  • 0
                    Спасибо за статью, мы используем wimboot из iPXE.
                    Гляньте wimaging — достаточно удобный toolset, может работать без foreman.
                    • 0
                      Рад, что статья оказалось полезной.
                      Обязательно глянем, спасибо.
                      • 0
                        Кстати, вместо кастомизированного образа я предпочитаю минимальный, развертываю puppet. А непосредственно конфигурация происходит через foreman, который отдает все конфиги которые подхватиываются unattended установкой.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое