Linux скоростная загрузка по сети. Ubuntu: сетевая установка. Устанавливаем ОС по сети

Для меня долгое время оставалось загадкой, почему в Ubuntu только два варианта установочного диска – Desktop и Alternate. В Debian кроме обычных полных установочных дисков, устанавливающих сразу полный GNOME или KDE, существует также NetInstall диск, предназначенный для установки системы по сети.

Загрузочный CD в таком варианте предназначен для запуска инсталлятора, устанавливающего минимальный необходимый набор пакетов. Все остальное при необходимости выкачивается и устанавливается из сети. Такой вариант предполагает большую квалификацию пользователя, выполняющего установку, но зато обеспечивает гибкость в установке только необходимых компонентов системы. Это также позволяет экономить дисковое пространство.

Оказалось, что в Ubuntu тоже есть вариант установочного диска, предназначенный для установки по сети. Просто ссылка для его закачки не расположена на главной странице сайта. А спрятана по следующему адресу .

Меня интересовал вопрос, какого минимального размера можно получить установленную Ubuntu без совершения специальных трюков. Для теста было решено установить Ubuntu c минимального диска в VirtualBox.

Размер имиджа минимального диска составляет 11Mб. Это немного, и позволяет выкачать его на любой, даже самой маленькой скорости.

А вот при установке желательно иметь канал в интернет побыстрее. Потому что минимальный диск, кроме собственно инсталлятора, не содержит ничего. Поэтому в процессе установки будет качаться все. Действительно всё!

Первую попытку выполнить установку Ubuntu с минимального диска я предпринял, подключившись к интернету по ADSL на скорости 128 кбит/с. Установка (в основном закачка пакетов) растянулась на несколько часов.

Для повторного эксперимента удалось найти подключение на существенно большей скорости.

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

а затем стандартное загрузочное графическое(!) меню Ubuntu:

Имеющийся пункт "Command-line install" не означает, что установка будет производиться из командной стоки. В любом случае запускается инсталятор в текстовом режиме.

Пункт «Advanced options» содержит дополнительное меню:

позволяющее выполнить Expert install. При его выборе появляется меню с действиями по установке, позволяющее выполнить их в почти произвольном порядке:

Я же выбираю пункт – «Install».

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

Инсталятор традиционно спрашивает язык:

настраивает раскладку клавиатуры:

потом предлагает выбрать репозиторий:

который по умолчанию предлагается локальный для выбраной страны:

Каждому, кто хоть изредка промышляет администрированием хотя бы раз нужно было установить операционку на комп. И зачастую происходит всё так: скачивается образ, записывается на диск или флешку, грузимся и ставим. Но может оказаться что ни флешки ни диска под рукой нет, а установку нужно выполнить на вчера... Тогда можно загрузится по сети, и с линуксом в этом плане особо проблем нет. Типичная конфигурация - это связка DHCP , TFTP и NFS . Но у меня под рукой не было настроенного NFS , зато была Samba . Поэтому пришлось разобраться как использовать Samba вместо NFS .

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

Но я тут начну с самого начала. Итак для начала нужно обзавестись дистрибутивом. Так как ставим мы Linux Mint , ищем свежий образ . Скачиваем дистрибутив, подходящий именно нам (я ставил тот, что с MATE , но очевидно это не имеет особого значения). Скачав образ, нужно получить доступ к файлам образа. В некоторых руководствах рекомендуют распаковать образ, но я не вижу в этом смыла, поэтому поддерживаю мнение, которое заключается в том, чтобы смонтировать образ как loop . Чтобы не вмешиваться в существующий порядок, просто создаём новый каталог, куда и монтируем образ:

# mkdir /mnt/mint
# mount -o loop /home/user/download/linuxmint-17-mate-64bit-v2.iso /mnt/mint

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


path = /mnt/mint
available = yes
browsable = yes
public = yes
writable = no

Должно работать поверх дефолтных настроек Samba . Если же не работает, то скорее всего вы что-то меняли сами, а значит найдёте как решить проблему. Итак мы добавили шару mint , через которую можно с сети получить файлы для установки. Не забудьте перезапустить Samba для принятия новых настроек.

Для Archlinux :

# systemctl restart smbd
# systemctl restart nmbd

Для Gentoo :

# /etc/init.d/samba restart

Далее нужно подготовить сетевой загрузчик. В этом нам поможет программа tftp-hpa . В Archlinux и в Gentoo пакет называется именно так. Нужно расположить файлы загрузчика в рабочем каталоге ftp-сервера (в арче /srv/tftp ). Копируем туда ядро и initrd со смонтированного образа:

# cp /mnt/mint/casper/{vmlinux,initrd.lz} /srv/http

# cp /usr/lib/syslinux/bios/{pxelinux.0,menu.c32,ldlinux.c32,libutil.c32} /srv/http

DEFAULT menu.c32
LABEL LinuxMint
KERNEL vmlinuz
APPEND showmounts toram root=/dev/cifs boot=casper netboot=cifs nfsroot=//192.168.0.1/mint NFSOPTS=-oguest,ro initrd=initrd.lz nosplash

Где 192.168.0.1 - наш IP-адрес относительно машины, на которую быдем ставить. Ах да, и про nfs там - это не опечатка, в режиме работы с cifs, нужно передавать опции типа как для nfs, не могу сказать почему. Особое внимание нужно обратить на опцию toram, поскольку без неё всё отваливается на полпути и загрузится мы не можем (может это особенности самбы). Но с этой опцией нужно помнить о том, что на целевой машине должно быть достаточно оперативки, чтобы скопировать туда установщик. TFTP-сервер нужно запустить. Для Archlinux :

# systemctl tftpd.socket start

Для Gentoo :

# /etc/init.d/in.tftpd start

Теперь нужно биосу целевой машины как-то сказать откуда грузится. В этом нам поможет dnsmasq (хотя не обязательно, можно использовать и другой DHCP сервер, здесь описываю то, что было под рукой). Настраиваем раздачу IP (опция dhcp-range ) на своё усмотрение, под свою "сеть" между машинами. Для установки нам важны лишь три опции:

Dhcp-boot=/pxelinux.0
dhcp-option=vendor:PXEClient,6,2b
pxe-service=x86PC, "Install Linux", pxelinux

Их нужно добавить к конфигурации dnsmasq , ну и естественно запустить его (или перезапустить).

Для Archlinux :

# systemctl start dnsmasq

Для Gentoo :

# /etc/init.d/dnsmasq start

Помните, чтобы всё заработало необходимо, чтобы порты на DHCP (UDP 67,68), TFTP (UDP 69), Samba (UDP 137,138, TCP 139,445) должны быть обязательно открыты, обязательно учтите это в конфигурации своего фаерволла. Если же фаерволла нет или полностью открыт интерфейс - ну и ладно, должно работать.

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

Уже довольно давно, мной была написана статья о сетевой установке Ubuntu, по локальной сети, без использования различных носителей, только загрузка по PXE и все. В этот раз я решил обновить статью и сделать ее ближе к современным реалиям, а главное, расширить функционал. Все будет выполняться на примере Ubuntu 14.04!

Под разные требования, должны быть и разные решения, главная загвоздка в том, что зачастую, нам требуется не одна операционная система, а несколько. Вот я и решил написать на эту тему статью. С предыдущей статьей, можно ознакомиться по ссылке, .
Главная идея заключаться в том что у нас появится возможность, выбирать какую операционную систему мы будем устанавливать, а также ее разрядность, фактически, у нас появится меню загрузки, после загрузки системы по локальной сети.
Все это мы реализуем, на примере, только что вышедшей Ubuntu 14.04

Для тех кто не понял, все затевается ради того чтобы появилась возможность выбора, какую операционную систему устанавливать, а также ее разрядность т.е. должно появиться меню где будут представлены все ОС доступные для установи по сети, которое будет иметь следующий вид:

Ubuntu_14.04x86
Ubuntu_14.04amd64
Для работы нам понадобится:
Обязательно!
1) Настроенный шлюз, для примера, воспользуйтесь статьей:
2) DHCP сервер, для примера, можно воспользоваться статьёй:
3) Настроенный TFTP сервер, загружающий PXE загрузчик, воспользоваться статьёй:

Опционально!
3) Дополнительным, но не обязательным моментом, может быть настроенный DNS сервер, пример есть в статье

Предполагается что у вас настроен шлюз, DHCP, TFTP севрер, а также добавлено меню загрузки PXE т.к. на этом моменте я останавливаться не буду.

Переходим к настройке инсталлируемой системы.
Для начала мы создадим пункт установки для Ubuntu 14.04x86, для чего нам понадобится установочный диск соответствующей разрядности. Нам его необходим скачать и примонтировать, для того чтобы извлечь файлы загрузчика инасталятора системы.
Т.к. файл сетевого загрузчика у нас лежат в директории директории /var/lib/tftpboot/ откуда они и подтягиваются TFTP сервером, то в ней нам нужно создать директорию Ubuntu, чтобы в нее сложить файлы с дисков установки, сделаем это:
mkdir /var/lib/tftpboot/ubuntu
В директории Uubntu мы создаем дополнительные директории для файлов загрузчика инсталлятора ОС для x86 разрядных систем и ADM64-соответсвенно.
mkdir /var/lib/tftpboot/ubuntu/x86 mkdir /var/lib/tftpboot/ubuntu/amd64

Теперь нам требуется скачать установочный диск посмотреть можно тут mirror.yandex.ru/ubuntu-releases/14.04/
Мы качнем версию х86 для сервера т.к. она меньше весит
wget http://mirror.yandex.ru/ubuntu-releases/14.04/ubuntu-14.04-server-i386.iso
После завершения закачки ISO образа, нам нужно его смонтировать, чтобы извлечь нужные нам файлы, а для этого, в директории /media мы создадим директорию iso , давайте сделаем это:

Mkdir /media/iso
Монтируем образ диска в эту директорию:
sudo su
mount ubuntu-14.04-server-i386.iso /media/iso/
Система выдаст что диск смонтирован в режиме чтения:

mount: warning: /media/iso/ seems to be mounted read-only.
Идем забирать загрузчик и ядро инсталятора:
cd /media/iso/install/netboot/ubuntu-installer/i386/

Нас интересуют 2 файла linux и initrd.gz , которые нам нужно забрать и перенести в директорию /var/lib/tftpboot/ubuntu/x86
давайте скопируем их:
cp linux /var/lib/tftpboot/ubuntu/x86 cp initrd.gz /var/lib/tftpboot/ubuntu/x86

Все, установочный образ нам больше не нужен, для начала отмонтируем его из директории iso:
umount /media/iso/

После этого ISO-образ можно удалить.
Похожие действия проводим для образа установочного диска с разрядностью x64, я не буду расписывать что и куда, просто приведу листинг команд, действия все те же, только пути немного отличаются, там прописано amd64

Wget http://mirror.yandex.ru/ubuntu-releases/14.04/ubuntu-14.04-server-amd64.iso

Mount ubuntu-14.04-server-amd64.iso /media/iso/

Cd /media/iso/install/netboot/ubuntu-installer/amd64/

Cp linux /var/lib/tftpboot/ubuntu/amd64 cp initrd.gz /var/lib/tftpboot/ubuntu/amd64

Umount /media/iso/

С файлами установки закончили, теперь настроим PXE меню загрузки.

Настройка меню загрузки PXE
Для начала добавим пункт меню с названием Linux Install , для этого нам нужно отредактировать файл:
nano /var/lib/tftpboot/pxelinux.cfg/default

В конец файла добавим запись:
LABEL Linux Install MENU LABEL ^Linux Install KERNEL vesamenu.c32 APPEND pxelinux.cfg/linux.menu

Как видно из записи, у нас будет другая страница с выбором дисирибутивов для установки, создадим ее:

Nano /var/lib/tftpboot/pxelinux.cfg/linux.menu

Добавим в нее названия пунктов для загрузки с возможностью выбора операционной системы для установки, пока это будет Ubuntu 14.04 x86 и amd64 архитектуры:
LABEL Install Ubuntu 14.04x86 MENU label ^Ubuntu 14.04x86 KERNEL ubuntu/x86/linux APPEND initrd=ubuntu/x86/initrd.gz LABEL Install Ubuntu 14.04amd64 MENU label ^Ubuntu 14.04amd64 KERNEL ubuntu/amd64/linux APPEND initrd=ubuntu/amd64/initrd.gz

На этом настройка закончена, можно подключать клиентскую машину и пытаться загрузиться по PXE, в результате после загрузки системы по сети, у нас появится меню такого вида:

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

Предисловие.

Это придумано давным давно. Во всяком случае в статье , написанной в конце прошлого века (1998 год), идею сетевой загрузки автор называет старой. И это не удивительно, загрузка операционной системы по сети - мечта любого администратора. Ведь операционная система загруженная с сервера всегда будет «белой и пушистой», а изменения и обновления достаточно будет внести в загрузочный образ на сервере, вместо того, чтобы бегать с флешкой по всему парку компьютеров.

Почему же такая хорошая идея не получила широкого распространения? Из-за сложности? Нет! Серверы для сетевой загрузки настраиваются довольно просто, как правило одним конфигурационным текстовым файлом, и, забегая вперёд, скажу, что в lanboot_server создание файлов конфигурации производится автоматически. На практике это сводится к «включил, и готово».

Что потребуется?.

    Если локальная сеть не настроена - настройте её. После этого смело командуйте lanboot start и клиенты могут загружаться.

    Для остановки соответственно lanboot stop. В ALTLinux и Ubuntu придётся поработать руками, доустановить необходимое и настроить.

Впрочем, не всё так страшно. Скрипт запуска lanboot (/usr/sbin/lanboot) должен работать и в других линуксах, например в Simply Linux (ALT) скрипт создал правильные файлы конфигурации и сервер запустился, только загружаемых файлов в «TFTP directory» (/var/lib/tftpboot) не оказалось, и это не удивительно, ведь откуда взяться файлам PuppyRus в ALTLinux.

Продолжим.

Из чего собрано.

Для загрузки Linux по сети нам потребуется tftp-сервер (используется tftp-hpa-5.0), bootp или dhcp (я выбрал dhcp-4.1.1, хотя сначала использовал bootp) и inetd или xinetd (я выбрал inetd, он проще).

Как настраивается.

1. Bootp

    Самый простой.

    Выдаёт IP привязанный к MAC-адресу клиента.

    Поэтому может применяться только в сетях с постоянным парком машин.

Пример /etc/bootptab

Используемые параметры:

Td -- TFTP directory (отсюда будут загружаться файлы) - rp -- root path (путь к корню сервера) - bf -- bootfile (загружаемый файл) - sa -- boot server address (IP TFTP-сервера) - sm -- subnet mask (маска подсети) - gw -- gateways (шлюз) - to -- time offset (seconds) - ha -- hardware address (аппаратный, он же MAC адрес) # Можно писать либо в столбик, либо в одну строку. # Настройки, общие для всех клиентов: .default:td=/var/lib/tftpboot:rp=/var/lib/tftpboot:bf=pxelinux.0:sa=192.168.1.2:sm=255.255.255.0:gw=192.168.1.1:to=auto: #или так.default:\ td=/var/lib/tftpboot:\ rp=/var/lib/tftpboot:\ bf=pxelinux.0:\ sa=192.168.1.2:\ sm=255.255.255.0:\ gw=192.168.1.1:\ to=auto: # Настройки для клиентов в других подсетях: #.subnet1:sm=255.255.255.0:gw=192.168.0.1:tc=.default: # Индивидуальные настройкм каждого клиента (примеры): #notick:tc=.default:ha=00140B016592:ip=192.168.1.4: #sharick:tc=.default:ha=0123456789ab:ip=192.168.1.2 #bobick:tc=.default:ha=ba9876543210:ip=192.168.1.5 # и т.д.

2. Dhcpd

Полноценный dhcp-сервер.

Пример /etc/dhcpd.conf

# dhcpd.conf # # Use this to enble / disable dynamic dns updates globally. ddns-update-style none; subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; range dynamic-bootp 192.168.1.10 192.168.1.200; default-lease-time 21600; max-lease-time 43200; filename "pxelinux.0"; }

3. Tftp

Файловый сервер с упрощённым протоколом.

Пример /etc/exports

#Каталоги, разрешённые для tftp-загрузки и nfs-монтирования (no_root_squash - разрешён пользователь root) /var/lib/tftpboot 192.168.1.0/255.255.255.0(ro,no_root_squash,sync)

4. Inetd

У нас служит для запуска tftp-сервера и bootp-сервера. Но может запускать и другие службы. Файл конфигурации /etc/inetd.conf. Файл длинный, «на все случаи жизни». Поэтому привожк только нужные строки.

Пример /etc/inetd.conf.

# Эта строка запускает tftp-сервер tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /var/tftpboot # Эта строка запускает bootp-сервер bootps dgram udp wait root /usr/sbin/bootpd bootpd -i

5. Xinetd

Функции те же, что и у inetd, но настройки сложнее. Установлен в Альтлинуксе.

Пример /etc/xinetd.conf

# # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { log_type = SYSLOG authpriv info; log_on_success = PID HOST DURATION; log_on_failure = HOST; instances = 100; per_source = 5; only_from = 127.0.0.1; } includedir /etc/xinetd.d Для каждой запускаемой программы отдельный файл конфигурации кладётся в /etc/xinetd.d Пример /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { disable = no; socket_type = dgram; protocol = udp; wait = yes; user = root; server = /usr/sbin/in.tftpd; server_args = -u tftp -s /var/lib/tftpboot; per_source = 11 cps = 100 2 flags = IPv4 only_from = 192.168.1.0; }

Автоматическая настройка.

Для автоматической настройки переменные берутся из вывода стандартных linux-команд ifconfig и route. Поэтому их можно получить в любом Linux.

Serv=$(ifconfig | grep inet | grep -v 127.0.0.1 | cut -f 2 -d ":" | cut -f 1 -d " ") mask=$(ifconfig | grep inet | grep -v 127.0.0.1 | cut -f 4 -d ":") gate=$(route | grep UG | cut -f 10 -d " ") subnet=$(route | grep " U " | cut -f1 -d " ")

Эти переменные вписаны в соответствующие места шаблонов конфигурационных файлов содержащихся в скрипте lanboot. При выполнении скрипта значения переменных подставляются в шаблон и сгенерированный таким образом файл конфигурации отправляется «по месту назначения». Это избавляет вас от рутинной работы и человеческих ошибок тоже. Единственное непременное условие: сеть должна быть настроена, иначе откуда брать значения переменных.

Скрипт lanboot так же копирует в TFTP directory файлы PuppyRus: vmlinuz, initrd.gz и pup*-200.sfs, необходимые для запуска. Файлы берутся из операционной системы, на которой запущен сервер, и, если эта система не PuppyRus, то их взять неоткуда. Поэтому на других Linux вышеперечисленные файлы необходимо поместить в /var/lib/tftpboot вручную (копированием).

0. Вступление
Загрузка по сети - это очень удобная, и зачастую даже просто незаменимая вещь. Не нужно вскрывать корпус компьютера(порой это совсем не так просто, как с обычными PC-блоками), не нужен cdrom, не нужен свободный ide-шлейф, не нужен дисковод, не нужно USB.
Система для загрузки проста для изменения - её не нужно никуда "заливать" и записывать. Это просто каталог.
Почему-то эту тему боятся и избегают многие. Это кажется чем-то сложным, проблематичным и труднореализуемым. На самом деле всё, как и остальное гениальное, просто.

1. Что нужно, чтобы загрузить Linux на машину по сети?

  • В машинке должна быть сетевая карточка с поддержкой Intel"s PXE. Есть ещё несколько реализаций протоколов загрузки по сети, но PXE наиболее распространён и является, практически, де-факто подразумеваемым протоколом загрузки по сети.
  • Настроенная Linux-система(назовем её машина-хост), которая будет выдавать IP-адрес, и содержать загружаемое ядро и сам образ системы. Это, вообще-то, не обязательно может быть Linux-система, но в данном how-to это будет подразумеваться.
  • Сеть Ethernet. Машину-хост и машинкой-жертвой можно соединить простым кросс-кабелем, а можно и обычными методами. :)
  • Знание MAC-адреса машинки-жертвы. Его можно посмотреть либо по логам DHCP-cервера, либо переписать прямо с экрана в момент начала загрузки по PXE, ну а можно и вовсе обойтись, и настроить DHCP-cервер так, чтобы он выдавал нужный IP и образ всем без разбору. Но это совсем другая история(хорошо описанная в гугле) и она выходит за рамки данного how-to.

2. Как происходит процесс загрузки по сети?
Быстрый ответ: автоконфигурируется сеть по dhcp, загружается загрузчик по tftp, который загружает ядро по tftp, которое загружает всю остальную рут-систему по nfs.
Подробный ответ: Первое, что делает при загрузке машинка, в которой установлена загрузка через PXE - посылает широковещательный DHCP-запрос в сеть в поисках сервера. Машина-хост, на которой мирно посапывая дремлет DHCP-демон, выдаёт адрес и путь к файлу для загрузчика. PXE Boot ROM на основе полученной информации, конфигурирует сетевой адаптер. Если всё проходит успешно, загрузчик загружается по TFTP протоколу и берёт на себя дальнейший ход событий. В общей схеме события развиваются дальше так - загружается по тому же TFTP-протоколу специально подготовленное для загрузки по сети Linux-ядро. Ядру при этом загрузчик передаёт нужные параметры для загрузки по NFS-протоколу. Ядро, загрузившись, монтирует nfs-раздел на машине-хосте и загружает систему уже оттуда.

3. Как это всё настроить и поднять с нуля?
Актуальный вопрос:)
Ведь нам нужны:
а) установленные, настроенные и запущенные dhcp-, tftp- и nfs-сервера
б) загрузчик и готовый образ корневой системы, в который можно chroot-иться и настраивать по надобностям, устанавливать/добавлять пакеты и тп.
в) ядро, подготовленное для загрузки по сети.
Итак, по пунктам, подразумевая, что система у нас Debian(и радуясь, что когда-то сделали правильный выбор дистрибутива), и что все относящиеся к делу файлы мы поместим в каталог /tftpboot:

0. Создание каталогов и установка загрузчика pxelinux.
Для начала создадим и определим каталоги.
Нашим "главным" каталогом пусть будет /tftpboot.
В нем будет два подкаталога: boot/ (с корневой системой) и pxelinux.cfg/ (с настройками загрузчика)

# mkdir /tftpboot # mkdir /tftpboot/boot # mkdir /tftpboot/pxelinux.cfg

# apt-get install syslinux # cp /usr/lib/syslinux/pxelinux.0 /tftpboot/ #

Serial 0 prompt 1 timeout 99 default pxeboot label pxeboot kernel bzImage append ip=dhcp nfsroot=192.168.150.126:/tftpboot/boot root=/dev/nfs init=/sbin/init

Его синтаксис похож на синтаксис lilo.conf. Комментарии, вроде бы тоже не нужны.
Если нужно создать различные конфигурации для разных машин, то можно создавать вместо default файлы для каждого MAC-адреса отдельно. Подробнее про это можно прочитать на странице pxelinux.

1. Создание корневой файловой системы
Это самый интересный вопрос. Здесь стоит сформулировать чётко постановку задачи - для чего нужна будет система? Какой софт там должен быть, на каком железе она будет запускаться и тп.
В принципе, для простейшей загрузки достаточно минимальной системы в пару мегабайт. Образов и руководств по созданию оных в гугле море.
Это может быть rescue-система, может быть инсталлятор чего-нибудь, а может быть и полноценная desktop-система.
В моем случае, мне нужно, чтобы система загружалась практически на любом железе и стартовала мой собственный инсталлятор. Поскольку места мне не жалко, то я решил просто поставить дефолтную минимальную debian-cистему. Радуясь тому, что когда-то выбрал правильный дистрибутив, это оказалось очень просто сделать:

# apt-get install debootstrap ... # debootstrap sarge /tftpboot/boot

При завершении, в каталоге /tftpboot/boot будет полностью рабочая, функциональная и загружаемая система, примерно 140Мб весом. В этот каталог можно за-chroot"иться, инсталлировать и удалять пакеты, изменять rc-cкрипты, и вообще творить всё что угодно. Такой себе линукс в линуксе.

2. Создание ядра.
Для того, чтобы ядро можно было загружать по сети нужно несколько условий при его сборке:
а) включить опцию "Network Options -> IP: autoconfiguration -> dhcp" (для универсальности, лучше все варианты тоже включить)
б) включить поддержку NFS Filesystem
в) включить "FS->Network Filesystems->Root Over NFS".
Это обязательная часть специфики. Остальное же - на ваше усмотрение. Что нужно в этом ядре, что не нужно. Лучше не жалеть на размере, и вкомпиливать в него больше драйверов, отключив модули совсем, чтобы избавиться от необходимости двухступенчатой загрузчки и initrd-файла.

3. Настройка DHCP.
Инсталлим сервер:

# apt-get install dhcpd

Редактируем его конфигурационный файл(/etc/dhcpd.conf) под свою сеть и добавляем в него запись для нашей машинки-жертвы:

Host pxeboot { hardware ethernet 08:00:0e:aa:bb:cc; fixed-address 192.168.150.127; filename "/tftpboot/pxelinux.0"; }

Обзор