Системное администрирование

индекс
199,96

PXE Boot за 15 минут

Здравствуй %username%!

Сегодня я расскажу как за 15 минут можно развернуть сетевую загрузку с удобным меню загрузки и минимумом полезных утилит.




Нам понадобится cервер под управлением Linux в моем случае Ubuntu, немного энтузиазма и свободного времени.

Я надеюсь статья будет вам полезна и я получу инвайт на Хабр :)
Спасибо sky_lord!


TFTP-Сервер


Установим пакеты: tftp tftpd-hpa

sudo apt-get install tftp tftpd-hpa

Следующим шагом будет настройка корневого каталога TFTP сервера и самого сервера:
открываем файл /etc/inetd.conf, и убеждаемся в наличие следующей строки, а так же, что перед ней не стоит #:

tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /tftpboot

/tftpboot — это папка вашего сервера, там и должны лежать файлы. Создаем ее

sudo mkdir /tftpboot


Проверяем. У меня в данный момент в папке /tftpboot есть файл /tftpboot/pxelinux.0

tftp 10.22.22.22
tftp> get pxelinux.0
Received 16300 bytes in 0.0 seconds
tftp>


Как видно из ответа TFTP клиента мы успешно получили файл размером 16300 байт за 0 секунд.


DHCP-Сервер


Установим пакет: dhcp3-server

sudo apt-get install dhcp3-server

Теперь нам нужно его настроить для этого откроем фаил /etc/dhcp3/dhcpd.conf удобным нам способом. В моем случае это:

nano /etc/dhcp3/dhcpd.conf

Мой фаил /etc/dhcp3/dhcpd.conf:

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
server-name "10.22.22.22";

subnet 10.22.22.0 netmask 255.255.255.0 {
pool {

range 10.22.22.1 10.22.22.21;

next-server 10.22.22.22; # Адресе tftp сервера для загрузки фаила с загрузчиком

filename "pxelinux.0"; # Имя фаила с загрузчиком
}
}


Внимание! если на вашем DHCP сервере сконфигурированы Static адреса для клиентов, то DHCP сервер проигнорирует вышеописанную конфигурацию и «отдаст» клиенту только те параметры которые внесены в секцию параметров static клиента.
Подробности: man dhcpd.conf

Перезапускаем dhcp сервер:

sudo /etc/inti.d/dhcp3-server restart

Начинка


Теперь пришло время наполнить каталог tftpboot необходимыми нам инструментами и загрузчиком. Меню будет загружаться при помощи загрузчика syslinux а точнее pxelinux.0
Меню формируется при помощи файла /tftpboot/pxelinux.cfg/default
Сразу оговорюсь — не стоит «копипастить» конфиги так как в них содержатся комментарии и я не знаю как их воспримет syslinux.

Пример файла /tftpboot/pxelinux.cfg/default:

default /boot/vesamenu.c32 #Это путь до файла модуля меню при его указании открываются широкие возможности для оформления меню.

#описание цветов элемнтов
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color disabled 0 #ffffffff #00000000
menu color timeout_msg 0 #ffffffff #00000000
menu color timeout 0 #ffffffff #00000000
menu background #1F45A5

# указание заголовка меню
menu title PXE Network Boot Menu

prompt 0 # Индекс выбранного по умолчанию пункта меню начинается с 0.

timeout 1200 #Таймаут по истечении которого автоматически начинается загрузка пункта по умолчанию.


label Boot from first hard disk #Загружаемся с первого диска в системе.
localboot 0x80


label Thinstation #Запуск тонкого клиента для доступа к терминальным серверам
kernel /pxe/thinstation/vmlinuz #полный путь до ядра на сервере
append ramdisk_blocksize=4096 initrd=/pxe/thinstation/initrd root=/dev/ram0 ramdisk_size=524288 splash=silent
vga=791 console=ttyS3 #Указание дополнительных параметров загрузки (параметры можно подсмотреть в родном isolinux.cfg содержащимся в фале образа iso )


menu begin # Начало Субменю
menu title Acronis Products # название субменю


label .. #Возврат выше на уровень
menu exit


label Acronis True Image Echo Enterprise
kernel /pxe/acronis/echoen/kernel
append initrd=/pxe/acronis/echoen/ramdisk /s ramdisk_size=40000 quiet vga=791

label Acronis Disk Director 10
kernel /pxe/acronis/diskdirector/kernel
append initrd=/pxe/acronis/diskdirector/ramdisk /s ramdisk_size=40000 quiet vga=791

menu end # Конец субменю


Распаковываем архив. Берем тут или тут Внимание в архиве содержится полная и 100% рабочая сборка образов и загрузчик pxe (кроме Acronis)

Что касается Acronis, а именно образов для загрузки, их можно извлечь из папки установленного продукта:

Acronis True Image Echo Enterprise Server:
C:\Program Files\Acronis\TrueImageEchoEnterpriseServer\BartPE\Files

Находим 2 файла: kernel.dat и ramdisk.dat копируем их в папку

\tftpboot\pxe\acronis\echoen

и переименовываем в kernel и ramdisk.

Acronis Disk Director:
C:\Program Files\Acronis\Acronis Disk Director

Аналогично пункту выше находим в папке фалы копируем в

\tftpboot\pxe\acronis\diskdirector и переименовываем.



Готово!



Теперь идем на любую машину с PXE ROM включаем его в БИОСе и устанавливаем его приоритетным устройством загрузки

http://img3.imageshack.us/img3/2897/vpc2k7pxeboot.png

Сохраняем и перезагружаемся.



Спасибо за внимание!

Описание и документация


Syslinux: syslinux.zytor.com/wiki/index.php/PXELINUX
Thinstation: ru.wikipedia.org/wiki/Thinstation

_________
Текст подготовлен в ХабраРедакторе
+90
30 января 2010, 00:56
233

комментарии (48)

+3
Ockonal #
>и минимумом полезных утилит
Интересная фраза :)
0
Hile #
хм) Честно сказать писал давно теперь и не помню почему так назвал)
0
braindamaged #
А можете посоветовать, что делать, если на удаленной машине, куда мы хотим по сети ставить линукс, нету ни клавиатуры, ни монитора?
+1
Hile #
К сожалению посоветовать ничего проверенного не могу. Как вариант купить KVM или IP-KVM.
Еще есть Intel AMT www.intel.com/cd/corporate/techtrends/EMEA/RUS/369661.htm На его счет так же сказать пока ничего не могу.
+2
gribozavr #
Ещё есть brain-damaged способ: Терминал через COM порт, а COM порт подключаем к соседней машине с интернетом. Заходим на эту машину удалённо.
0
Hile #
Нужный способ порой. А где почитать можно?
+2
gribozavr #
Насколько я помню, Debian при установке запускает установщик на последовательном порту автоматически. Но не могу найти ничего по этому поводу в installation manual.

Зато нашёл другой способ: preseed файл и установка по ssh: www.debian.org/releases/stable/i386/apbs04.html.en#preseed-network-console
+1
Hile #
Посмотрел мельком не вникая.
занем мак машины. подсовываем в DHCP ему установщик он грузит ядро установщика и открывает SSH с пред установленным логином и паролем и в эту сессию сливает вывод установщика… об этом речь? я правильно понял?

+1
gribozavr #
Да.
+1
Unatine #
С тем же успехом можно сделать preseed и полностью автоматический.
Установка минимальной конфигурации + sshd, пароли и настройки минимальные в пресиде.
Бутится по dhcp, грузит инсталятор + пресид, устанвливается, ребутится и все. получаем машину с ssh.
0
GreyCat #
Может уж тогда хотя бы Serial-over-LAN и через IPMI, если он есть?
НЛО прилетело и опубликовало эту надпись здесь
0
Hile #
Ну на сколько я помню придется еще шаманить с сетевыми интерфейсами, ведь драйвер то он подгрузит а конфиг в interfaces не пропишет.
0
GreyCat #
Бывает, что ещё как привязывается. Как минимум, если в initrd нет драйверов нужной файловой системы + контроллера / чипсета — то ничего не загрузится. Ну и про разницу архитектур забывать не стоит. x86_64 система при всём желании на x86 не загрузится…
0
litos #
Крупные датацентры для таких случаев (где много серверов без мониторов) используют DSmanager который грузит специально подготовленные темплейты ОС которые по-сути есть tarball поставленной системы.
0
Hile #
В теплейтах в ДЦ скорее всего учтены мои примечания по этому поводу (см.выше). да и железо там скорее всего одинаковое, хотя роли это и не играет.
0
GreyCat #
Некоторое количество датацентров для такой цели использует Inquisitor — там как раз есть вариант загрузки по PXE с последующей инсталляцией заданной ОС в абсолютно автоматическом режиме в соответствии с заданным профилем.

Таким образом, все сводится к двум действиям: 1) машине с таким-то серийным номером в веб-интерфейсе нужно задать профиль «инсталлировать сюда такую-то ОС», 2) перезагрузить её в Inquisitor. После этого через 10-15 минут она готова к работе.
0
Scrill #
Можно использовать SysRescCD. Там в параметрах можно задавать IP и пароль root'а.
0
rgaliull #
воспользуйтесь Chef.
еще почитайте про puppet и cfengine
+2
nini #
И помним, что есть www.netboot.me/.
0
Hile #
Полезный Ресурс. Не знал. Спасибо!
0
non7top #
можно использовать dnsmasq, там встроен tftp сервер
0
AdOLF_04 #
Перезалейте пожалуйста файлик с рапиды куда-нибудь в более другое место.
+1
Hile #
dl.dropbox.com/u/3478682/tftpboot.zip Держи ссылку. Добавил в топик. Файл скоро станет доступен.
0
ayurganov #
Не удаляйте его если что — я сегодня его благополучно скачал
НЛО прилетело и опубликовало эту надпись здесь
+1
whiplash #
круто. а как сделать то же самое, но на фрихе или на винде?
0
Hile #
На винде Нужно поднять TFTP сервер (входит в комплект RIS ) И настроить в DHCP параметры для загрузки. Тут все подробно описано на примере WTWARE.
+5
mvgolubev #
Использовать для этого RIS (Remote Installation Services) в Windows считается устаревшим способом. Начиная с Win2k3 SP2, рекомендуется вместо RIS для этих целей использовать WDS (Windows Deployment Services). WDS в качестве TFTP-сервера ставит под винду сервис tftpd.

Что касается DHCP-опций, используемых при PXE-загрузке с образа на TFTP-сервере, то тут тоже хотелось бы кое-что уточнить. По приведённой ссылке предлагается в DHCP-опции 066 указывать IP-адрес TFTP-сервера, а в опции 067 указывать имя загрузочного образа на этом TFTP-сервере.
В принципе это работает. Однако, согласно RFC 2132, в DHCP-опции 066 правильно будет указать не IP-адрес TFTP-сервера, а его имя. Имя в 66-й опции можно указать полное (FQDN) или короткое, но в случае короткого имени нужно обязательно передавать клиентам DNS-суффикс в DHCP-опции 015.
При этом клиент самостоятельно будет разрешать имя сервера в IP-адрес через DNS-сервер. Но в этом случае IP-адрес DNS-сервера нужно также передать клиенту через DHCP в стандартной опции 006. Ну и на этом DNS-сервере должна быть соответствующая DNS-зона с соответствующей A-записью для TFTP-сервера.

Кроме имени TFTP-сервера (DHCP-опция 066) рекомендуется через DHCP передавать клиентам и IP-адрес TFTP-сервера в опции 150 (на тот случай, если они его не смогут разрешить по имени через DNS).

Ну а в опции 067, действительно, согласно RFC 2132, указывается имя загрузочного образа (например, pxelinux.0). Причём если образ лежит не в корне TFTP-сервера, то в этой опции указывается относительный путь к файлу-образу относительно корня TFTP (например, path/images/pxelinux.0).

Имейте в виду, что если на DHCP задать опцию 060 = PXEClient, тогда опции 066 и 067 клиентом игнорируются, и PXE-клиент будет брать TFTP-сервер и имя образа из опции 043, где они записываются как-то хитро в бинарном виде.
Если опця 060 определена как PXEClient, а опция 043 не задана (или если одновременно не заданы опции 060, 066, 067), тогда PXE-клиент по умолчанию считает TFTP-сервером для загрузки сам DHCP-сервер и пытается подключиться по TFTP к нему.

WDS, насколько я помню, как раз при установке прописывает в DHCP опции 060 = PXEClient и опцию 043 с параметрами TFTP. По мне так лучше прибить эти опции и сделать через интуитивно понятные RFC-стандартизованные опции 6 (DNS server IP), 15 (DNS-suffix), 66 (TFTP-server name), 67 (boot image path/name), 150 (TFTP-server IP).

Полный список DHCP-опций можно найти здесь.
Если DHCP-сервер тоже виндовый, то его можно конфигурировать (в частности задавать и удалять опции) с помощью netsh. Примерно так:
netsh dhcp server 10.10.10.5 set optionvalue 150 IPADDRESS 10.10.10.10
(за синтаксис не ручаюсь, проверить сейчас негде, см. справку по netsh).
0
whiplash #
вот за это спасибо. я просто сам ни разу не поднимал, везде уже готовое было. а сейчас из возможных хостов только DC win + dhcp и freebsd. до весны надо настроить всё.
0
rengel_system #
Как в wds засунуть iso c linux, он же только wim-образа понимает? :)

P.S. Вот как раз тут с wds и deployment борюсь может знаете в чем трабл. (http://clck.ru/ubf)
+1
mvgolubev #
Как в wds засунуть iso c linux, он же только wim-образа понимает? :)
А кто тут вообще говорил о запихивании в WDS ISO с Linux? Возможность загрузки ОС с некоторого Live-образа через TFTP и возможность удалённой заливки HDD с дискового образа (того же виндового wim) через WDS — это не одно и то же. И одно другому не мешает.
Я лично наблюдал Win2k3 с поднятым WDS и виндовым tftpd, где по умолчанию грузился некий образ pxelinux.0 на базе PXELINUX, который давал меню с выбором варианта дальнейшей загрузки, среди которых:
* загрузка с HDD
* несколько вариантов для загрузки по сети с LiveCD-образов (типа Acronis DiskDirector, ERD Commander и всяких многофункциональных Live-образов с кучей дисковых утилит, антивирусов, hardware-тестов и т.п.)
* и, собственно, загрузка Windows Deployment для заливки на HDD клиента Windows с одного из wim-образов, размещенных на WDS.
И в зависимости от выбора, сделанного в этом меню, далее уже шла загрузка соответствующего загрузочного Live-образа или WDS для разливки виндовсов.
0
stolen #
ISC DHCPD, ATFTPD, NFS, Nginx должны работать и под фрей. Это на счет хоста.
А про клиент — Google
–5
SantaClaus16 #
Linux это просто)
0
TheMengzor #
Мало того, это еще и интересно :)
0
zvirusz #
0
phasma #
hpa умеет работать демоном, лучше поправить конфиг и использовать его отдельно от inetd
0
rengel_system #
В чем причина не приязни к inetd? Только с аргументами. Интересно. Когда-то давно слышал про его проблемы с безопасностью.
0
phasma #
Он практически не защищен от (D)DoS, сложность ограничения использования порта, ну и для тех, кто просто поставил и забыл есть вероятность поставить лишних демонов, через которые может быть взломан сервер.
0
rengel_system #
Интересно, можно как-нибудь подружить два tftp-сервера для одной subnet при условии что один из них это wds, который требует такого для global:
option option-66 code 66 = text;
option option-67 code 67 = text;

а такое для subnet:
option option-66 «192.168.1.126»;
option option-67 «boot\\x86\\wdsnbp.com\000»;
next-server 192.168.1.126;
0
mvgolubev #
Интересно, можно как-нибудь подружить два tftp-сервера для одной subnet при условии что один из них это wds
Можно рассмотреть вариант одного TFTP-сервера с дальнейшим ветвлением вариантов загрузки: WDS и что-то линуксовое. Но тогда поднимать это только на базе Windows, т.к. я не знаю способов поднять WDS на чём-то кроме Windows.

Либо, если поднимать два TFTP-сервера, то делать всё же деление на области (DHCP scope) и в параметрах каждого скоупа прописывать свои опции для указания TFTP-сервера и образа. Но тут у клиентов не будет варианта выбора: в какой scope попал, с соответствующего TFTP-сервера и грузишься.
0
rengel_system #
То есть нельзя сделать в меню tftp-сервера (который будет на linux) что-то в духе теперь нужно пойти к другому tftp-серверу?

У меня с dhcp3 такая проблема что он ругается на опцию tftp указанyю для разных subnet:
/etc/dhcp3/dhcpd.conf line 115: unknown option dhcp.tftp-server-name
option tftp-server-name «192.168.1.3»
^

0
mvgolubev #
То есть нельзя сделать в меню tftp-сервера (который будет на linux) что-то в духе теперь нужно пойти к другому tftp-серверу?
Затрудняюсь ответить. Никогда не реализовывал и даже не видел подобного.
0
Hile #
можно бы, а ....? распределение нагрузки?
0
rengel_system #
Все проще. Чтобы деплоимить на машины wim-образы c помощью wds
0
agl666 #
tftp 10.22.22.22
tftp> get pxelinux.0

Как видно из ответа TFTP клиента мы успешно получили файл размером 16300 байт за 0 секунд.

у меня как раз-таки не может скачать, просто висит, а потом выдает Timeout. Не может же быть, что я за два предыдущих шага напортачил где-то?

Ubuntu Server, 8.04. Два eth, если это поможет
0
DrVirus #
А как туда <<корректно>> развернуть образ WinXP для установки по сети?
0
DrVirus #
Начиная с версии Syslinux 3.84, можно использовать неразвернутые iso-образы для загрузки. WinXP пока невозможно.

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