Site Mascot
 

Не удивляйтесь, сайт переехал: был http://smacker.fatal.ru, стал http://smacker.heliohost.org.

Загрузка по сети: PXE

01.05.2012 12:27

Загружать машины по сети удобнее и быстрее, чем пользоваться внешними носителями, а настроить всё это - дело минутное.

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

 

По большому счёту, загрузка по сети — дело нехитрое, не сложнее загрузочной флешки. Сначала надо настроить dhсp-сервер и поднять tftp-сервер. Прежде всего, надо сделать так, чтобы dhcp сервер сообщал подключающимся машинам адрес сервера, с которого можно загрузиться, и имя файла с первичным загрузчиком (NBP). У меня в сети обязанности dhcp-сервера выполняет отдельный маршрутизатор с dd-wrt, поэтому мне в настройке сервисов нужно было указать дополнительные опции для dhcp
 siaddr 192.168.93.55
 boot_file pxelinux.0
 
Первый параметр сообщает адрес сервера (подставьте свой), второй — имя первичного загрузчика, который с этого сервера будет скачиваться сетевой картой загружающейся машины.
Есть альтернативное решение, когда в качестве dhcp используется DNSMasq, оно разобрано тут: http://www.dd-wrt.com/wiki/index.php/PXE
Может быть также, что у вас используется полноценный DHCPd на нормальном сервере (в частности, на том же, что и tftp-сервер). В таком случае, в конфиг /etc/dhcpd.conf нужно добавить строки
 next-server 192.168.93.55;
 filename "pxelinux.0";
 
и перезапустить демон dhcpd. Смысл опций полностью аналогичен предыдущему примеру.

 

Затем нужно перейти к серверу, который будет осуществлять загрузку машин по сети. Главным сервисом в данном случае будет выступать tftp, иногда дополнительно используется nfs — например, при загрузке knoppix, об этом далее. Для моих целей я остановился на реализации tftpd-hpa, который пришёл из BSD и который удобнее использовать, чем обычный tftpd.

 

Я использую Debian, поэтому пакет ставится просто (здесь и далее я по умолчанию предполагаю, что команды запускаются через sudo или напрямую от root-a):
 apt-get install tftpd-hpd
 
Конфигурационный файл /etc/default/tftpd-hpa меня вполне устраивает как есть:
 TFTP_USERNAME="tftp"
 TFTP_DIRECTORY="/srv/tftp"
 TFTP_ADDRESS="0.0.0.0:69"
 TFTP_OPTIONS="--secure"
 

 

Теперь настала пора ответить на вопрос, который должен был возникнуть ранее — откуда же берётся файл pxelinux.0? Это часть уже известного нам проекта syslinux. Для дальнейшей настройки сетевой загрузки нам понадобится пакет syslinux-common (который, насколько я помню, потянет за собой и сам syslinux):
 apt-get install syslinux-common
 

 

Syslinux — проект модульный и универсальный, поэтому нет ничего удивительного, что нам понадобятся только несколько кусочков. Из тех файлов, что лежат в /usr/lib/syslinux скопируем в каталог tftp-сервера три: pxelinux.0, menu.c32, vesamenu.c32:
 cd /srv/tftp
 cp /usr/lib/syslinux/{pxelinux.0,menu.c32,vesamenu.c32} .
 
Конечно, если вам захочется сделать что-то более сложное, чем то, что сделал я, вам могут понадобиться и другие файлы.

 

Теперь нужно написать конфигурационный файл, который опишет настройки и содержимое меню загрузчика. Разумеется, можно обойтись и более простыми вещами. Например, если повторить метод для Кноппикса, описанный в вики PXE ( http://pxe.dev.aboveaverageurl.com/index.php/PXE_Booting/Knoppix ), то получится просто загрузка напрямую, без вариантов и прочего. Может быть, вам только это и нужно, но я исхожу из того, что мы мастерим что-то вроде мультизагрузочной флешки.

 

Итак, в каталоге /srv/tftp создадим каталог pxelinux.cfg. Однако не будем торопиться и сразу писать конфигурационный файл default. Поскольку мы, скорее всего, захотим использовать кириллицу в нашем меню, то нужно помнить, что итоговый файл должен быть в кодировке cp866 (в конфиге же должны быть подключены подходящие шрифты), а у нас, скорее всего, UTF8. Настраивая свою конфигурацию я понял, что оптимальнее всего будет сделать так:

 

Создать скрипт recode.sh в каталоге pxelinux.cfg:
 #!/bin/bash
 echo "Recoding config file to IBM866"
 more default.src | iconv -t IBM866 > default
 
Сделать его исполняемым:
 chmod 750 recode.sh
 
После чего редактировать файл default.src (который, очевидно, остаётся в системной кодировке), а для применения изменений запускать ./recode.sh — так в итоге оказалось (для меня) проще и быстрее всего.

 

Итак, начнём составлять файл default.src. Во-первых, нам потребуется подходящий по случаю фон. Я завел каталог /srv/tftp/backgrounds и попробовал несколько разных, подойдут jpg и png размерами 640х480 точек. В качестве загрузчика по умолчанию в соответствии с конфигом грузится vesamenu.c32, который как раз и умеет рисовать меню с графикой. Если использовать menu.c32, который работает только с текстом, меню выйдет спартанским; моё, к примеру, выглядело бы как-то так:
Меню загрузки
Есть масса параметров, которые можно указать для изменения внешнего вида. Часть из них отвечает за, например, цвета и шрифты, а часть позволяет переводить (заменяя) разные служебные сообщения. Я использовал лишь малую толику возможностей. Подробнее можно почитать тут: http://www.syslinux.org/wiki/index.php/Comboot/menu.c32
Ещё для того, чтобы использовать кириллицу, потребуются соответствующие шрифты. Я взял на пробу несколько из пакета console-cyrillic и остановился на довольно строгом варианте. Поставим пакет и посмотрим, какие есть варианты:
 apt-get install console-cyrillic
 ls /usr/share/console-cyrillic/*.psf
 
Выбранный шрифт надо скопировать в /srv/tftp/pxelinux.cfg/; лично я сделал в этом каталоге симлинк «fonts» на /usr/share/console-cyrillic и легко копировал, пока не выбрал тот, что понравился больше прочих.

 

В остальном, конфигурационный файл идентичен обычному конфигу для syslinux. Итак, начало моего конфига такое:
 PROMPT 0
 DEFAULT vesamenu.c32
 MENU BACKGROUND backgrounds/creation_of_knoppix_v2.jpg
 TIMEOUT 300
 ONTIMEOUT knoppix
 FONT pxelinux.cfg/UniCyr-sans-8x16.psf
 
 MENU TITLE Доступные варианты для загрузки по сети:
 MENU TABMSG Нажмите [TAB], чтобы изменить параметры загрузки
 MENU AUTOBOOT Автоматическая загрузка начнётся через # секунд{у,ы,}
 MENU COLOR BORDER 30;44 #40000000 #00000000 none
 MENU ROWS 7
 MENU TABMSGROW 30
 

 

Забегая вперёд, покажу, как выглядит в итоге моё меню:
Меню загрузки
Для сравнения: вот так оно выглядит со шрифтом sarge-16, а вот так со шрифтом thin-16.
И, напоследок, вот обои: http://smacker.fatal.ru/files/creation_of_knoppix_v2.jpg

 

Теперь надо населить наше меню полезными пунктами. Я для себя выбрал свежий кноппикс, gparted-live, clonezilla и установку Debian по сети.

 

Сначала добавим Knoppix. Надо сказать, что я изначально именно с него и начал, как раз следуюя инструкциям из http://pxe.dev.aboveaverageurl.com/index.php/PXE_Booting/Knoppix . Это потом я понял, что нужно сделать больше и лучше.
Из исходной инструкции нам действительно понадобятся файлы linux, linux64 и miniroot.gz из каталога /tftpboot; pxelinux.0 у нас уже есть, и он скорее всего даже более свежий.
Далее, начнём раздавать образ кноппикса с помощью nfs. Не вдаваясь в детальный рассказ, как поднимать nfs-сервер, скажу вкратце, что у меня это сделано так — в /etc/exports добавлена строка
 /srv/nfs/knoppix-6.7.1 192.168.93.0/255.255.255.0(async,ro,no_subtree_check)
 
и, разумеется, содержимое образа диска с кноппиксом скопировано в каталог /srv/nfs/knoppix-6.7.1; не забудьте, что он должен быть доступен всем для чтения.
Что же касается файлов, которые следует взять из самого knoppix-а (я это делал в виртуальной машине, конечно, чтобы не нарушать работу своей сети и не возиться с физическими устройствами), то я их положил в каталог /srv/tftp/knoppix-6.7.1/netboot/. Дополнительные опции загрузки я вынес в подменю, что хорошо видно далее:
 LABEL knoppix
 MENU LABEL Knoppix 6.7.1 32 bit
 KERNEL knoppix-6.7.1/netboot/linux
 APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce loglevel=1 initrd=knoppix-6.7.1/netboot/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix
 
 	MENU BEGIN Другие варианты загрузки Knoppix
 	MENU TITLE Другие варианты загрузки Knoppix
 
 	LABEL < Вернуться обратно
 	MENU GOTO .top
 
 	LABEL knoppix64
 	MENU LABEL Knoppix 6.7.1 64 bit
 	KERNEL knoppix-6.7.1/netboot/linux64
 	APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce loglevel=1 initrd=knoppix-6.7.1/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix
 
 	LABEL knoppix-txt
 	MENU LABEL Knoppix 6.7.1 text mode
 	KERNEL knoppix-6.7.1/netboot/linux
 	APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce loglevel=1 initrd=knoppix-6.7.1/netboot/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1  BOOT_IMAGE=knoppix
 
 	LABEL knoppix-expert
 	MENU LABEL Knoppix 6.7.1 expert mode
 	KERNEL knoppix-6.7.1/netboot/linux
 	APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce loglevel=1 initrd=knoppix-6.7.1/netboot/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=expert
 
 	LABEL knoppix-fb1024x768
 	MENU LABEL Knoppix 6.7.1 framebuffer 1024x768
 	KERNEL knoppix-6.7.1/netboot/linux
 	APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce vga=791 video=1024x768 loglevel=1 xmodule=fbdev initrd=knoppix-6.7.1/netboot/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix
 
 	LABEL knoppix-fb800x600
 	MENU LABEL Knoppix 6.7.1 framebuffer 800x600
 	KERNEL knoppix-6.7.1/netboot/linux
 	APPEND nfsdir=192.168.93.55:/srv/nfs/knoppix-6.7.1 nodhcp init=/etc/init apm=power-off nomce vga=788 video=800x600 loglevel=1 xmodule=fbdev initrd=knoppix-6.7.1/netboot/miniroot.gz libata.force=noncq tz=localtime ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix
 
 	MENU END
 

 

Clonezilla и gparted добавлять гораздо проще. Нужно скачать zip архив с нужными файлами, скопировать в соответствующий каталог и добавить пункты в файл конфигурации.
Инструкция для clonezilla: http://clonezilla.org/livepxe.php
Инструкция для gparted: http://gparted.sourceforge.net/livepxe.php
Хочу только обратить внимание, что в адресе образа файловой системы я поменял протокол на tftp, чтобы быть последовательным и не мучать лишний раз апач.
 LABEL clz-live
 MENU LABEL Clonezilla 1.2.12-37 Live (RAM) 
 KERNEL clonezilla/vmlinuz
 APPEND initrd=clonezilla/initrd.img boot=live config noswap nolocales edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=788 nosplash noprompt fetch=tftp://192.168.93.55/clonezilla/filesystem.squashfs
 
 LABEL gparted-live
 MENU LABEL GParted 0.12.0-5 Live
 KERNEL gparted-0.12.0-5/vmlinuz
 APPEND initrd=gparted-0.12.0-5/initrd.img boot=live config union=aufs noswap noprompt vga=788 fetch=tftp://192.168.93.55/gparted-0.12.0-5/filesystem.squashfs
 

 

Установку Debian 6 по сети добавить даже приятно. Фактически, нужно только подключить готовые меню, и появится дополнительный пункт с готовыми настройками и оформлением. Надо взять готовые архивы (Squeeze):
для консольной версии — netboot.tar.gz, отсюда: http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/
для версии на GTK — netboot.tar.gz, отсюда: http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/gtk/
- не перепутайте, первый — 9 мегабайт, второй 20, в остальном выглядит всё очень похоже.
На будущее, когда выйдет новый релиз и ссылки выше устареют, смотрите страницу http://www.debian.org/distrib/netinst и там ищите в «сетевой загрузке» вашу архитектуру и т.д. по аналогии.
Соответствующий архив надо распаковать в /srv/tftp и дописать в конфиг:
 	MENU BEGIN Установить Debian 6
 	MENU TITLE Установить Debian 6
 
 	LABEL < Вернуться обратно
 	MENU GOTO .top
 
 	INCLUDE debian-installer/i386/boot-screens/menu.cfg
 	DEFAULT debian-installer/i386/boot-screens/vesamenu.c32
 
 	MENU END
 
Нужно обратить внимание на то, что файлы называются идентично в обоих случаях, следовательно, иметь и то, и другое одновременно без ручного вмешательства не получится, обе версии хотят быть в каталоге debian-installer и так далее по дереву. Чтобы иметь оба варианта, нужно создать два разных каталога, но тогда придётся править руками все файлы конфигурации, чтобы поменять жестко прописанный каталог debian-installer на другое название. Я этого делать не стал, мне лень, поэтому у меня просто версия на gtk.

 

Вот как выглядит подменю с Debian 6:
Меню загрузки Debian

 

Завершающие штрихи: пустая строка-разделитель в меню, которую нельзя выбрать, и загрузка с жёсткого диска:
 LABEL  
 MENU LABEL
 MENU DISABLE
 
 LABEL localboot
 MENU LABEL Загрузиться с локального диска
 localboot 0
 

 

Для избежания недоразумений, вот как выглядит /srv/tftp:
 [root@ColonialOne:/srv/tftp]$ ll
 итого 280K
 drwxr-xr-x 2 root root 4,0K Апр 26 02:29 backgrounds
 drwxr-xr-x 2 root root 4,0K Апр 11 02:59 clonezilla
 drwxr-xr-x 3 root root 4,0K Апр 26 02:11 debian-installer
 drwxr-xr-x 2 root root 4,0K Апр 11 04:34 gparted-0.12.0-5
 drwxr-xr-x 3 root root 4,0K Апр 26 02:47 knoppix-6.7.1
 -rw-r--r-- 1 root root  60K Апр 11 04:13 menu.c32
 -rw-r--r-- 1 root root  27K Апр 12 02:11 pxelinux.0
 drwxr-xr-x 2 root root 4,0K Май  1 23:02 pxelinux.cfg
 -rw-r--r-- 1 root root 160K Апр 11 04:14 vesamenu.c32
 
И вот как выглядит /srv/tftp/pxelinux.cfg:
 [root@ColonialOne:/srv/tftp/pxelinux.cfg]$ ll
 итого 24K
 -rw-r--r-- 1 root root 4,0K Май  1 22:00 default
 -rw-r--r-- 1 root root 4,2K Май  1 21:54 default.src
 -rwxr-xr-- 1 root root   95 Апр 26 02:54 recode.sh
 -rw-r--r-- 1 root root 5,3K Апр 13 23:31 UniCyr-sans-8x16.psf
 
  1. Стас
    Email: stasjem гав-гав gmail.com  
    предложение по некоторому допиливанию статьи
    Статья в целом мне очень помогла, не помешало мы полного архива с рабочей конфигурацией.
    У меня пока проблемы с установкой debian, при выборе зеркала установке прекращается ибо не скачивается файл release.
    [ Запись от 01.08.2012, отправлена в 23:14 ]
    Могу только предположить, что проблема с сетью: специально проверил, у меня при неизменном с момента написания статьи конфиге Debian-а всё ставится без проблем.
  2. Стас
    Email: stasjem гав-гав gmail.com  
    продолжение про статью
    С установкой справился на ура, причём полная автоматическая установка с последующей полной настройкой системы debian.
    Не могли бы вы написать мне на почту, если кое какие мысли по поводу сетевой установки и загрузки систем.
    [ Запись от 01.11.2012, отправлена в 23:08 ]
  3. toreador
    Email: complux гав-гав yandex.ru  URL: statcs.ru
    Добавил в закладки
    Интересно можно ли подобное меню реализовать с помощью windows загрузчика?
    [ Запись от 14.11.2012, отправлена в 19:12 ]
    Нет, не интересно.
  4. turk
    Email: aaa гав-гав aaa.ru  
    Установка linux из интернет по сети pxe
    http://alexprays.blogspot.ru/2012/04/blog-post_16.html
    [ Запись от 05.09.2013, отправлена в 14:36 ]
    Хорошо, но местами ужасно неграмотно написано (в смысле русского языка).
  5. Александр
    Email: cka3 гав-гав yandex.ru  
    ***
    Пишу диплом по этой теме. Вы не могли бы подсказать - как сделать так, чтобы для установки debian не нужен был интернет? Я вижу только два варианта и оба пока не осилил: создание локальной копии репозитария и загрузка по pxe полновесного установщика. Со вторым вариантом облом ибо через memdisk он хочет драйвера cd-rom, а просто так запускаться отказывается. Я понимаю, что скорее всего я что-то упускаю, но подскажите хотя бы куда копать. Спасибо. Если можно на почту.
    [ Запись от 26.08.2015, отправлена в 4:55 ]
  6. Я буду рад, если вы оставите свой отзыв об этой заметке:

    Никнейм

    Email

    URL

    Заголовок комментария

    Проверка на человечность
    - Введите буквы:
    The CAPTCHA image