понедельник, 18 июля 2016 г.

Установка Linux PXE сервера для загрузки Windows PE

Продолжая серию статей по развёртыванию Windows, сегодня мы займёмся подготовкой сервера сетевой загрузки на базе ОС Linux и организацией загрузки Windows PE с такого сервера, а так же подготовим установочный дистрибутив Windows 7 или Windows Server 2008 R2 для установки с сетевого ресурса. В этой инструкции я приведу пример для Debian Linux 8.

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

Подготовка загрузочных файлов Windows для PXE

Для загрузки системы Windows с PXE сервера нам понадобятся следующие файлы:
  • winpe/boot/fonts/wgl4_boot.ttf - из поставки Windows
  • winpe/boot/bcd - хранилище конфигурации (необходимо сгенерировать)
  • winpe/boot/boot.sdi - из поставки Windows
  • winpe/boot/winpe.wim - образ Windows PE (инструкция по сборке)
  • winpe/pxeboot.0 - pxeboot.n12 из поставки Windows
  • winpe/bootmgr.exe - из поставки Windows
Создадим папку, в которую будем собирать загружаемую по PXE систему:
mkdir c:\tftpboot\winpe\boot
Скопируем шрифт, который использует bootfix.bin и файл boot.sdi, который необходим для создания виртуального диска в памяти:
xcopy c:\WinPE\x86\ISO\boot\fonts\wgl4_boot.ttf c:\tftpboot\winpe\boot\fonts\wgl4_boot.ttf
xcopy c:\WinPE\x86\ISO\boot\boot.sdi c:\tftpboot\winpe\boot\boot.sdi
Теперь нам понадобится загрузчик, который загрузит менеджер загрузки и хранилище конфигурации. Они есть в загрузочном образе Windows PE. Для этого подключим образ Windows PE:
dism /mount-wim /wimfile:C:\WinPE\x86\winpe.wim /index:1 /mountdir:C:\WinPE\x86\mount
И скопируем от туда файл pxeboot.n12, переименовав его в pxeboot.0 и bootmgr.exe:
xcopy c:\WinPE\x86\mount\Windows\Boot\PXE\pxeboot.n12 c:\tftpboot\winpe\pxeboot.0
xcopy c:\WinPE\x86\mount\Windows\Boot\PXE\bootmgr.exe c:\tftpboot\winpe\bootmgr.exe
Необходимые файлы за исключением конфигурации загрузки и образа системы у нас есть, поэтому образ Windows PE можно отключить без сохранения изменений:
dism /unmount-wim /mountdir:C:\WinPE\x86\mount /discard
Копируем образ системы Windows PE в папку загрузки:
xcopy  C:\WinPE\x86\winpe.wim c:\tftpboot\winpe\boot\
Теперь самое время сгенерировать конфигурацию загрузки, для этого создадим файл makebcd.cmd:
notepad c:\tftpboot\makebcd.cmd
Со следующим содержимым:
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 "Windows PE 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%
move %1\BCD %1\bcd
И запустим его на исполнение, передав ему в качестве аргумента расположение и имя файла хранилища конфигурации:
c:\tftpboot\makebcd.cmd c:\tftpboot\winpe\boot
На этом подготовка необходимых файлов для загрузки с PXE в среде Windows окончена, и мы приступаем к настройке Linux-сервера.

Установка PXE-сервера

Установка TFTP

Установка необходимых пакетов:
# aptitude install tftpd-hpa syslinux pxelinux -y
Настраиваем TFTP-сервер:
# vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -m /etc/default/tftp-remap.conf -v"
RUN_DAEMON="yes"
Т.к. Windows будет искать свои файлы загрузки относительно корня tftp, делаем маппинг и ассоциируем эти файлы с каталогом winpe на сервере.

Создаём файл маппинга:
# vim /etc/default/tftp-remap.conf
Со слеюующим содержимым:
r pxeboot.0 /pxeboot.0
r bootmgr.exe /winpe/bootmgr.exe
r \\Boot\\BCD /winpe/boot/bcd
r \\boot\\boot.sdi /winpe/boot/boot.sdi
r \\Boot\\winpe.wim /winpe/boot/winpe.wim
r \\Boot\\Fonts\\wgl4_boot.ttf /winpe/boot/fonts/wgl4_boot.ttf
gr \\ /
Последняя строка "gr \\ /" говорит tftp, если в путях указывются обратные слэши, менять их на прямые.
Внимание! Важно, чтобы регистре букв в именах файлов был точно таким же, как вы указывайтей в файлах. Если вы в на этапе создания конфигурации указали /boot/bcd, а файл назвали /Boot/BCD, загрузчик не сможет загрузить систему, т.к. не найдёт нужного файла.

Создаём наш каталог загрузки:
mkdir -p /srv/tftpboot/winpe
Теперь необходим скопировать в него файлы, из каталога c:\tftpboot\:
c:\tftpboot\winpe\> pscp -r * root@pxeboot.home.local:/srv/tftpboot/winpe

Создаём меню загрузки

Для того, чтобы меню загрузки работало, нам понадобятся следующие файлы, копируем их в корневой каталог нашего tftp-сервера:
# cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftpboot
# cp /usr/lib/syslinux/modules/bios/chain.c32 /srv/tftpboot
# cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftpboot
# cp /usr/lib/syslinux/modules/bios/libcom32.c32 /srv/tftpboot
# cp /usr/lib/syslinux/modules/bios/libutil.c32 /srv/tftpboot
# cp /usr/lib/syslinux/modules/bios/vesamenu.c32 /srv/tftpboot
И создаём каталог, где будет хранится само меню загрузки:
# mkdir -p /srv/tftpboot/pxelinux.cfg
Ещё нам понадобится красивая загрузочная картинка для нашего меню. Она должна быть в формате jpg и разрешением 640x480. Копируем её с нашей машины:
C:\Users\golovlevmv\> pscp Pictures\menu.jpg root@pxeboot.home.local:/srv/tftpboot/pxelinux.cfg/menu.jpg
Теперь самое время создать меню загрузки:
# vim /srv/tftpboot/pxelinux.cfg/default
Со следущим содержимым:
PROMPT 0
UI vesamenu.c32
MENU TITLE PXE Server Boot Menu
MENU BACKGROUND pxelinux.cfg/menu.jpg
TIMEOUT 600

LABEL ^0) Boot from hard disk
TEXT HELP
    Boot from first (hdd 0)
ENDTEXT
    COM32 chain.c32
    APPEND hd0 1

MENU SEPARATOR

LABEL ^1) Load Windows PE 3.1 x86
TEXT HELP
    Boot Windows PE x86 from pxeboot
ENDTEXT
    kernel winpe/pxeboot.0
Перезапускаем tftpd:
# /etc/init.d/tftpd-hpa restart

Альтернативный вариант загрузки с PXE

Так же можно организовать ещё один вариант загрузки системы с PXE, используя memdisk, но он потребует уже значительно большего объёма памяти и у вас могут возникнуть проблемы с компьютерами с объёмом памяти менее 1Гб.

Tftp сервер должен быть уже подготовлен, по инструкции выше.

Нам понадобится memdisk, копируем его из состава пакета syslinux:
# cp /usr/lib/syslinux/memdisk /srv/tftpboot
Копируем ISO-образ Windows PE:
C:\WinPE\x86\> pscp WinPE_x86.iso root@pxeboot.home.local:/srv/tftpboot/winpe/winpe_x86.iso
Добавляем в наше загрузочное меню ещё один пункт:
# vim /srv/tftpboot/pxelinux.cfg/default
LABEL ^2) Load Windows PE 3.1 x86 (iso)
TEXT HELP
    Boot Windows PE x86 from iso image
    need more 512MB RAM to correct work
ENDTEXT
    KERNEL memdisk
    APPEND iso raw
    INITRD winpe/winpe_x86.iso

Настройка DHCP

Для того, чтобы наши клиенты могли загружаться по сети, необходимо наличие DHCP-сервера, а он в свою очередь должен выдавать клиентам адрес свервеа сетевой загрузки и имя файла, которое необходимо загружать.
Вы можете использовать любой уже имеющийся DHCP-сервер, ему необходимо передать следующие параметры:
  • filename = "pxelinux.0";
  • next-server <ip-адрес сервера>;
В случае отсутствия у вас DHCP-сервера, я так же приведу пример его установки и настройки на нашем PXE-серере.

Устанавливаем DHCP сервер:
# aptitude install isc-dhcp-server -y
Включаем DHCP на нужном нам сетевом интерфейсе:
# vim /etc/default/isc-dhcp-server
INTERFACES="eth1"
Приводим dhcpd.conf к нужному нам виду:
# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
option domain-name "home.local";
option domain-name-servers 192.168.140.10;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
subnet 192.168.140.0 netmask 255.255.255.0 {
    range 192.168.140.51 192.168.140.254;
    option routers 192.168.140.10;
    option domain-name "home.local";
    filename = "pxelinux.0";
    next-server 192.168.140.10;
}
Запускаем isc-dhcp-server:
# /etc/init.d/isc-dhcp-server start
Теперь у нас должно загружаться окружение Windows PE. Через него мы можем скопировать данные из аварийной системы и установить чистую систему на машину.

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

Сетевая установка Windows

Далее для сетевой установки можно использовать уже существующий файловый сервер на базе Windows или SAMBA. Но, посколько я решил организовать хранение установочных дистрибутивов системы на этом же сервер, то кратко покажу, как организовать такой SAMBA-сервер на нашем серере PXE.

Устанавливаем SAMBA
# aptitude install samba -y
Тут всё достаточно просто. Я приведу минимальный конфиг smb.conf, без подключения сервера к домену и задания пользовательских учётных записей. Это будет просто сервер с гостевым доступом на чтение.

Правим конфигурацию samba:
# vim /etc/samba/smb.conf
[global]
   workgroup = WORKGROUP
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   acl allow execute always = true

[win7x86]
   comment = Windows 7
   path = /srv/dist/win7x86
   guest ok = yes
   browseable = yes
   create mask = 0644
   directory mask = 0755
   acl allow execute always = true
Не забудьте указать "acl allow execute always = true". Этот параметр необходимо указать для того, чтобы можно было запускать на исполнение exe-файлы, иначе запустить setup.exe у вас не получится.

Возьмём установочный дистрибутив Windows 7 SP1 x86 необходимой редакции, и скопируем все файлы на наш сервер в папку с дистрибутивами:
C:\Users\golovlevmv\> pscp -r E:\ root@pxeboot.home.local:/srv/dist/win7x86/
Перезапустим samba
# /etc/init.d/samba restart
Попробуем обратиться к нашему сетевому ресурсу по имени или ip адресу "\\pxeboot\" или "\\192.168.140.10\".

Теперь для того, чтобы у нас с нашего сервера устанавливалась наша система, то берём файл install.wim, который мы создавали при сборке собственного дистрибутива Windows, и заменяем им дистрибутивный файл.
C:\Users\golovlevmv\> pscp C:\Win7\x86\dist\sources\install.wim root@pxeboot.home.local:/srv/dist/win7x86/sources/
А вот файл /srv/dist/win7x86/sources/boot.wim можно удалить, т.к. загрузку мы уже к тому времени уже произвели с помощью Windows PE.

Запуск установки системы Windows 7 x86

Для того, чтобы запустить установку, необходимо подключить сетевой ресурс:
net use * \\192.168.140.10\win7x86
Подключится сетевой диск "Z:", и выполнить команду:
Z:\setup.exe
Далее, для того, чтобы автоматизировать установку системы, можно с помощью "диспетчера образов системы Windows" подготовить файл ответов autounattend.xml, и запускать установку с файлом ответов:
Z:\setup.exe /unattend:autounattend.xml
В такойм случае, для того, чтобы разворачивать системы Windows на большом количестве ПК, вам будет нужно лишь загрузиться с PXE, подключить сетевой ресурс, и запустить установку с указанием файла ответов.


2 комментария:

  1. c:\tftpboot\winpe\> pscp -r * root@pxeboot.home.local:/srv/tftpboot/winpe
    Это может не работать из-за отсутствия прав. Можно через домашний каталог пользователя

    ОтветитьУдалить