Создать pxe образ linux

Обновлено: 07.07.2024

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

Подготовка загрузочных файлов 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
Скопируем шрифт, который использует 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 можно отключить без сохранения изменений:
Копируем образ системы Windows PE в папку загрузки:
Теперь самое время сгенерировать конфигурацию загрузки, для этого создадим файл makebcd.cmd:
bcdedit -createstore %1\BCD
bcdedit -store %1\BCD -create /d "Ramdisk options"
bcdedit -store %1\BCD -set ramdisksdidevice boot
bcdedit -store %1\BCD -set 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=
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,
bcdedit -store %1\BCD -set %guid% device ramdisk=[boot]\Boot\winpe.wim,
bcdedit -store %1\BCD -create /d "Windows BootManager"
bcdedit -store %1\BCD -set timeout 30
bcdedit -store %1\BCD -set displayorder %guid%
move %1\BCD %1\bcd
И запустим его на исполнение, передав ему в качестве аргумента расположение и имя файла хранилища конфигурации:
На этом подготовка необходимых файлов для загрузки с PXE в среде Windows окончена, и мы приступаем к настройке Linux-сервера.

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

Установка TFTP

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 на сервере.

Создаём файл маппинга:

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, загрузчик не сможет загрузить систему, т.к. не найдёт нужного файла.

Создаём наш каталог загрузки:

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

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

Для того, чтобы меню загрузки работало, нам понадобятся следующие файлы, копируем их в корневой каталог нашего tftp-сервера:
И создаём каталог, где будет хранится само меню загрузки:
Ещё нам понадобится красивая загрузочная картинка для нашего меню. Она должна быть в формате jpg и разрешением 640x480. Копируем её с нашей машины:
C:\Users\golovlevmv\> pscp Pictures\menu.jpg root@pxeboot.home.local:/srv/tftpboot/pxelinux.cfg/menu.jpg

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

LABEL ^1) Load Windows PE 3.1 x86
TEXT HELP
Boot Windows PE x86 from pxeboot
ENDTEXT
kernel winpe/pxeboot.0

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

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

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

Нам понадобится memdisk, копируем его из состава пакета syslinux:

C:\WinPE\x86\> pscp WinPE_x86.iso root@pxeboot.home.local:/srv/tftpboot/winpe/winpe_x86.iso
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

  • filename = "pxelinux.0";
  • next-server <ip-адрес сервера>;

Устанавливаем DHCP сервер:

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;
>

Теперь у нас должно загружаться окружение Windows PE. Через него мы можем скопировать данные из аварийной системы и установить чистую систему на машину.

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


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

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

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

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

Правим конфигурацию samba:

[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/

Попробуем обратиться к нашему сетевому ресурсу по имени или 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

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

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

Что необходимо?

Для загрузки системы нужны три компонента: ядро, initramfs и корневая файловая система.
Ядро и initramfs мы передадим по TFTP, а корневую файловую систему — по iSCSI.

iSCSI-таргеты

iSCSI — реализация протокола SCSI поверх TCP. Сам протокол SCSI весьма универсален, теоретически с его помощью можно подключить устройство любого типа. Тем не менее, в большинстве случаев SCSI используется для доступа к тем или иным устройствам хранения данных (жёсткие диски, приводы CD и DVD и т. п.). Для примера Mass Storage Device, использующийся в USB-устройствах, является реализацией SCSI поверх USB. Поэтому, кстати, флешки в Linux опознаются как /dev/sdX-устройства. Использующаяся на серверах шина SAS также является реализацией SCSI (собственно, это видно из названия — Serial Attached SCSI).
В iSCSI различаются понятия таргета (target, целевое устройство, осуществляет приём и выполнение запросов) и инициатора (initiator, порождает запросы). В более привычных терминах таргет — это сервер, а инициатор — клиент.
Таргеты и инициаторы бывают разных видов. iSCSI-таргетом может выступать обычный компьютер, сервер или система хранения данных. Инициаторами обычно выступают сетевые карты (в их ROM бывает прошит необходимый код) или software-реализации.

Вариант, предлагаемый ниже, состоит из двух серверов: таргета, который дополнительно к iSCSI-таргету содержит на себе DHCP и tftp-сервер, необходимые для начальной загрузки и инициатора, у которого дисков нет, а есть только сетевая карта.

На таргете желательно использовать LVM для нарезания томов, но можно использовать и обычные файлы.

1. Образ целевой системы

Создадим том размером 16 ГиБ, который будет отдаваться по iSCSI (моя VolumeGroup называется vg00, том будет называться client):

1.1. Разделы и файловые системы

Я люблю и уважаю LVM за его гибкость и удобство в работе, поэтому использую сетап, не требующий таблицы разделов на образе client. Вместо этого сразу на client создаётся еще одна VolumeGroup, которая потом режется на lv-тома.


Создадим файловую систему и разметим раздел под swap:

1.2 Сам образ системы

Примонтируем файловую систему и развернем туда с помощью debootstrap минимальный образ:

Приведем fstab к нужному виду:

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


Отмонтируем rootfs и деактивируем группу томов, чтобы случайно ее не задеть:


Образ системы готов! Загрузчик ему не нужен, ядро будет запускаться с помощью pxelinux.

2. iSCSI-таргет

Установим userspace-утилиты для управления таргетом:


И запустим утилиту управления таргетом — targetcli:

2.1. Backstore

Находясь в консоли targetcli необходимо выполнить следующие команды:


Таким образом будет создан backstore для нашего тома vg00-client.

2.2. iSCSI


Назначим предварительно созданный backstore этому таргету:


Назначим таргету интерфейс для работы (без указания параметров назначатся все активные интерфейсы):


Настроим права доступа (документация по правам доступа доступна на официальном сайте:

2.3. Сохранение настроек

Несмотря на то, что действия в targetcli выполняются немедленно, они не сохраняются и после перезагрузки все таргеты не вернутся. В этом поведение LIO похоже на поведение любых других ядерных служб (iptables, ebtables, ipvsadm и т. п.). При сохранении настроек targetcli компилирует всю конфигурацию в shell-скрипт, который просто скармливает нужные данные в configFS.

Сохраним все настройки:


Таргет готов! Перейдем к настройке DHCP + TFTP.

3. DHCP-сервер

Предполагаем следующую конфигурацию:
Серверы живут в сети 10.0.0.0/24, таргет живет на 10.0.0.2, клиент получает по DHCP адрес 10.0.0.5.

Мануалов в сети море, поэтому коротко:

4. TFTP-сервер

Опять же, мануалов в сети море.

5. Syslinux


Копируем pxelinux.0 в /var/lib/tftpboot:


Также нам необходим образ ядра (можно взять с хост-системы). Сейчас у меня используется ядро от Ubuntu версии 3.2.0.37:


Дальше нужно собрать правильный initramfs. Для этого нам нужен модуль iSCSI:


Pxelinux будет искать файл с конфигурацией в директории pxelinux.cfg относительно корня tftp-сервера. Создадим ему конфигурацию:


Вместо XX необходимо подставить MAC-адрес сетевой карты client'а, записанный в нижнем регистре через минусы, а не через двоеточия.


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

Настройка Syslinux закончена. Теперь можно насладиться загрузкой :)

Мой лог загрузки выглядит примерно так:

Итоги:

Можно вполне использовать iSCSI для загрузки серверов, не имеющих своих дисков (актуально для виртуализации, самопильных систем хранения данных, серверов, которые не должны долго жить и т.п.).

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

Присутствует security-hole, поскольку /proc/cmdline доступен любому желающему в системе и этот любой желающий может получить доступ к экспортированному тому. Поэтому можно на таргете закрыть фаерволом все адреса, кроме необходимого.

Описанная схема — по большей части драфт и основа для инфраструктуры сетевой загрузки.

PXE загрузка может показаться чем-то сложным на первый взгляд, однако! Собрать систему которая бы реализовывала загрузку можно минут за пять.

Наверно те, кто сталкивался с частой установкой операционных систем могут заметить, что каждый раз необходимо готовить флешку, конечно можно изготовить флешку с которой будет грузиться все что угодно, но флешек размер ограничен, а что если необходимо установить операционную систему на 10 или скажем 100 компьютеров?

Вот тут и поможет загрузка по сети. Какие возможности открываются при этом? Можно загрузить множество систем одновременно на различном количестве ПК не использую физический носитель для загрузки, скорость загрузки остается вполне не плохой, приятным бонусом может стать возможность автоматизации, особенно если вы выполняете сервисное обслуживание.
Еще одно применением загрузки по сети может являться создание тонких клиентов, для этих целей очень подходит операционная система Linux.

Что необходимо для PXE

Настройка DHCP

Windows server 2008R2

Тут все просто: добавляем две опции в параметры области сети

Поле настроек для области DHCP

DHCP сервер dnsmasq

Добавляем строку в конфигурационный файл

DHCP сервер ISC-DHCP-SERVER

В секцию описания зоны добавляем название файла (pxelinux.0) для загрузки
и адрес TFTP сервера

option bootfile-name "pxelinux.0" ;
next-server "192.168.0.1" ;

TFTP сервер

Настройка tftpd-hpa

Открываем файл /etc/default/tftpd-hpa

nano / etc / default / tftpd-hpa

Где взять файлы для загрузки

nano / srv / tftp / pxelinux.0 / default
label hdd
menu default
KERNEL chain.c32

Сохраняем, попробуем загрузиться на клиенте, устанавливаем в БИОС PXE ROM enable (или подобную настройку, часто находится во вкладке advenced) и ставим сетевой адаптер первым в списке загрузке во вкладке boot, сохраняем и перезагружаем

Окно BIOS

/images/iso
Образ не обязательно распаковывать, я его просто монтирую.
Создадим каталог для наших образов для PXE загрузки:

/ images / ubuntu-16.04.4-desktop-amd64.iso / srv / tftp / linux / ubuntu / 16.04 /

Затем переходим в каталог /srv/tftp/linux/ubuntu/16.04/casper и ищем как записано ядро и образ памяти

qq @ mybook: / srv / tftp / linux / ubuntu / 16.04 / casper$ ls
filesystem.manifest filesystem.squashfs vmlinuz.efi
filesystem.manifest-remove filesystem.squashfs.gpg
filesystem.size initrd.lz
qq @ mybook: / srv / tftp / linux / ubuntu / 16.04 / casper$

В данном случае ядро называется vmlinuz.efi, а образ памяти initrd.lz, запоминаем эту информацию и правим конфигурационный файл /srv/tftp/pxelinux.cfg/default

label linux
menu label ubuntu 16.04
KERNEL linux / ubuntu / 16.04 / casper / vmlinuz.efi
APPEND root = / dev / nfs boot =casper netboot =nfs nfsroot =192.168.0.1: / srv / tftp / linux / ubuntu / 16.04 / initrd = / linux / ubuntu / 16.04 / casper / initrd.lz --

Для образа с Ubuntu 18.04 пришлось вносить изменения в строку APPEND, необходимо добавить параметр toram

label linux
menu label ubuntu 18.04
KERNEL linux / ubuntu / 16.04 / casper / vmlinuz.efi
APPEND root = / dev / nfs boot =casper netboot =nfs nfsroot =192.168.0.1: / srv / tftp / linux / ubuntu / 18.04 / initrd = / linux / ubuntu / 18.04 / casper / initrd.lz toram--

Как успели заметить тут есть параметр nfs, эту службу необходимо настроить:
в файл конфигурации /etc/exports я вношу строку:

И перезапускаю nfs

Готово, можно попробовать загрузиться

Процесс загрузки PXE

Процесс загрузки PXE

Создание меню в PXE

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

default ubuntu
label ubuntu
KERNEL linux / ubuntu / 16.04 / casper / vmlinuz.efi
APPEND root = / dev / nfs boot =casper netboot =nfs nfsroot =192.168.1.26: / srv / tftp / linux / ubuntu / 16.04 / initrd = / linux / ubuntu / 16.04 / casper / initrd.lz --

Графическое меню очень полезно когда у нас множество различных образов, тут нам поможет создать модуль vesamenu.c32
Хороший мануал по настройке меню предвствлен на сайте syslinux

Привожу пример своих настроек цветов, добавляю вначале в /srv/tftp/pxelinux.cfg/default

Тыква

В итоге получилась такое симпатичное загрузочное меню

Пример меню Syslinux

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Мультизагрузочный сервер для PXE и UEFI network boot (Сегодня сделаем загрузку по сети для старых и новых компьютеров!)

Полезные советы и программы от пользователей нашего форума.

Мультизагрузочный сервер для PXE и UEFI network boot

Коллеги линуксойды, из-за очень малого количества информации в интернетах по вопросам uefi network boot, я решил восполнить этот пробел, и рассказать сам, как организовать мультизагрузочный сервис, со всякими разными линуксами, доступный одновременно через старый Legacy PXE и через новомодный UEFI Network Stack.

1 Часть. Подготовка сервера.

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

Начнём с DHCP.
Лично я использую ISC DHCPD там где нужна расширенная конфигурация (прямо как сейчас)
Возможно в будущем я сделаю такие же статьи о kea, но пока что dhcpd будет моей платформой для рассказа.
Если вы не используете у себя dhcpd и по какой-то причине не хотите использовать, вам придётся додумать это колдунство самостоятельно.

На самом деле настроить dhcpd для наших целей очень просто. Достаточно добавить в конфиг следующую конструкцию:

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

Разберёмся по пунктам:
1) Когда pxe клиент получает ip адрес, он возвращает опцию vendor-class-identifier,
которая выглядит так:

такую строку клиент вернёт если будет грузится по legacy pxe.
А вот такую если по UEFI:

Как нетрудно догадаться, наш оператор сравнения, отрезает от этой опции 15 байт ( PXEClient:Arch: )
После чего берёт следующие 5 байт 00007 и сравнивает со строкой (именно строкой а не числом !) после знака =
В зависимости от результата, передаёт клиенту тот или иной filename. Что это такое на filename я объясню чуть позже.
Если вы хотите увидеть ещё один способ реализации той же самой задачи, посмотрите мою статью про dhcpd.
ISC DHCPD - разделяем клиентов на классы

директива next-server передаёт клиенту ip адрес сервера, с которого нужно скачать загрузочный файл. Подразумевается разумеется
tftp сервер. Поэтому, разумеется следующим пунктом у нас будет настройка tftp сервера.
Итак после запроса ip, наш сервер передаст клиентам адрес сервера 192.168.0.5 и путь bios/lpxelinux.0 или EFI/grubx64.efi

tftp сервер:

Мне очень нравится tftp сервер в openbsd. Потому что его настройка очень легкая и понятная. Знаете что нужно для его настройки?
Ничего.
Но, чтобы вам было проще диагностировать ту или иную неисправность в вашей системе, разумно включить режим verbose.
Для этого в openbsd добавим следующую строку в rc.conf.local:

Правда в openbsd такой способ включения сервисов уже устарел.
Сейчас модно добавлять все через rcctl: По умолчанию директории /tftpboot не существует.
Да и нам будет неудобно всё время лазить по файловой системе в её поисках. Разумно создать эту директорию в домашнем каталоге пользователя и сделать на неё ссылку:

обратите внимание, tftpd работает не от root, это значит что для доступа к нужной директории, весь путь должен иметь бит x.
например у меня директория /home/kasak имеет права drwxr-xr-x, это не всегда хороший вариант. Но в моём случае это сделано лишь для удобства.

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

Папка для загрузок будет находится в /var/lib/tftpboot

NFS сервер:

Так же будет не лишним настроить nfs сервер, в основном если вы собираетесь загружать убунто-подобные дистрибутивы. Это в значительной степени ускорит процесс запуска.

в openbsd для этого нужно добавить в /etc/exports строку

разумеется поправив путь на ваш вариант, и все опции на ваши.
-mapall совершенно излишняя и добавлена для исправления возможных косяков с правами доступа. (опция превращает всех гостей в пользователя kasak)
-alldirs нужна обязательно. она разрешает маунтить любую директорию внутри экспортированной.
-ro необязательна, запрещает запись.
-network и -mask я думаю понятно что такое.
Разумеется nfs нужно ещё активировать. В openbsd: В линуксе всё немного сложнее.
Нужно установить пакет nfs-utils,
включить

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

2 Часть. Работа с legacy pxe.

Эти оба файла положите в директорию bios, которую вы создадите в директории tftpboot.
(обратите внимание на опции dhcpd из первой части)
там же в директории bios создайте директорию pxelinux.cfg
При загрузке, lpxelinux.0 будет искать в этой директории конфиг следующим образом:

Я думаю тут всё понятно без особенного расписывания, однако обратите внимание на vesamenu.c32
нам для отображения меню потребуется ещё вот эта штуковина. Найти её можно в каталоге скачанного syslinux: bios/com32/menu.
Для работы этой штуковины, нужны ещё другие штуковины:
bios/com32/elflink/ldlinux/ldlinux.c32
bios/com32/libutil/libutil.c32
bios/com32/lib/libcom32.c32

Зачем всё это нужно даже не спрашивайте. Просто смиритесь с этим фактом, и положите это всё в папку bios в tftpboot.

Теперь при загрузке наш клиент будет запрашивать файлы вот в такой последовательности:

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

3 Часть. Загрузчик UEFI.

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

Для загрузки через uefi мы будем использовать разумеется grub2 (потому что в принципе иных вариантов у нас и нет, не пытайтесь использовать pxelinux.efi, он не работает). И писать конфиг для него будем ручками. Не бойтесь, конфиг граба очень простой, просто в нём очень часто много лишнего.

Для того чтобы приступить к работе, вам ОБЯЗАТЕЛЬНО потребуется установленный дистибутив linux. в моём случае это fedora. И в этом линуксе нужно установить пакет grub2-efi-x64-modules, чтобы мы могли создать образ граба конкретно под наш случай.

ВНИМАНИЕ. Брать где-то готовый бинарник абсолютно бесполезно , мы должны создать конкретно свой.
Как это делатся сейчас поясню.
Первое что делает граб, когда грузится - ищет свой grub.cfg внутри директории $prefix
А любой дистрибутив имеет в prefix что? всё что угодно, но не tftp адрес.
То есть если вы просто возьмёте grub который установлен в дистибутиве, после загрузки он попытается загрузить grub/grub.cfg
c жесткого диска, и разумеется, не найдёт там его. Нам нужно создать свой бинарник, который при загрузке, будет искать свой конфиг не на диске а в tftp, в определённом месте, и уже оттуда будем вести наши дела. Кроме того, мы сделаем бинарник очень маленького размера, без встроенных лишних модулей. Мы будем подгружать их уже из конфигурационного файла, а сам grub будет иметь только минимально нужное: поддержку сети и tftp.
для этого выполните команду:

Разумеется нужно заменить все значения на ваши.
(tftp,192.168.0.5) - адрес tftp сервера. /EFI - директория с грабом на этом сервере (внутри /tftpboot разумеется).
-O x86_64-efi говорит грабу о том для какой архитектуры создавать бинарник
tftp efinet - это два модуля которые граб включит в бинарник, чтобы граб мог работать с сетью и tftp.

Вот и всё. Нужный бинарник готов. но это конечно не простой путь, а сложный.

Есть путь проще, воспользоваться утилитой grub2-mknetdir, которая создаст бинарники самостоятельно.
Но я же должен был рассказать вам, как это работает, верно?
Разумеется я вам рекомендую использовать grub2-mknetdir в ваших установках, но я должен был показать вам что будет происходить и как создать тоже самое руками.

Итак, если вы пошли моим путём и собрали свой бинарник, вам ещё нужны модули, их можно взять тоже из дистибутива linux, например в федоре они установлены в /usr/lib/grub. переместите папку x86_64-efi в папку EFI на сервере.
Так же желательно переместить шрифт unicode.ps2 в папку EFI/fonts. Поищите этот шрифт в своём дистрибутиве linux, вполне вероятно он лежит в grub prefix вашей установки.

Так же создайте первоначальный grub.cfg в паке EFI на сервере:

Ну, чтож теперь у нас есть готовая платформа, которую теперь достаточно только наполнить контентом и можно загружаться.

Часть 4. Наполнение контентом и конфиги.

Как вы можете видеть, я не просто так засунул один загрузчик в папку bios, а второй в папку efi. можно было бы конечно кинуть всё это в корень tftpboot, но тогда бы такой бардак наступил, просто ужас.
Именно поэтому все мои конфиги ссылаются на папку d/
это просто ссылочка, если вы выполните ls -l в папке /tftpboot увидите примерно следующее:

а внутри папок EFI и bios есть ссылочка ведущая на ../d:

таким образом можно сохранить на tftp сервере некоторый порядок. Однако вам не обязательно повторять за мной, вы можете создать свою структуру.

Теперь в папке d достаточно создать подпапки с разными дистрибутивами, и добавить в конфиги pxelinux и grub.cfg ссылки на них.

Я спрячу под спойлер множественные примеры работающих конфигураций для pxelinux и grub:

для pxelinux: Spoiler

label Загрузка с первого диска
localboot 0x80

menu begin
menu title Ubuntu based

label ..
menu exit

label Ubuntu
linux d/ubuntu/casper/vmlinuz
initrd d/ubuntu/casper/initrd
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/ubuntu locale=ru_RU.UTF-8 quiet splash --

label Mint Cinnamon 64 bit
linux d/mint/casper/vmlinuz
initrd d/mint/casper/initrd.lz
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/mint locale=ru_RU.UTF-8 quiet splash --

label Elementary OS
linux d/elementary/casper/vmlinuz
initrd d/elementary/casper/initrd.lz
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/elementary locale=ru_RU.UTF-8 quiet splash --

label KDE Neon
linux d/kdeneon/casper/vmlinuz
initrd d/kdeneon/casper/initrd
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/kdeneon locale=ru_RU.UTF-8 quiet splash --

menu begin
menu title Debian

label ..
menu exit

label Debian 10 netinst
linux d/debian/vmlinuz
initrd d/debian/initrd.gz
append --- quiet

menu begin
menu title Arch Linux

label ..
menu exit

label Manjaro Linux via NFS
linux d/manjaro/boot/vmlinuz-x86_64
initrd d/manjaro/boot/intel_ucode.img,d/manjaro/boot/initramfs-x86_64.img
append miso_basedir=manjaro miso_nfs_srv=192.168.0.15:/tftpboot/d/manjaro/ ip=. eth0:dhcp

menu begin
menu title System Rescue CD

label ..
menu exit

LABEL Boot SystemRescue (NFS)
LINUX d/sysrcd/sysresccd/boot/x86_64/vmlinuz
INITRD d/sysrcd/sysresccd/boot/intel_ucode.img,d/sysrcd/sysresccd/boot/amd_ucode.img,d/sysrcd/sysresccd/boot/x86_64/sysresccd.img
APPEND archisobasedir=sysresccd ip=dhcp archiso_nfs_srv=192.168.0.15:/home/kasak/tftpboot/d/sysrcd

menu begin
menu title Утилиты

label ..
menu exit

label Memtest86+
kernel d/memtest/memtest

label Seagate Seatools
linux d/seatools/boot/64bit/vmlinuz_4817_64-signed
initrd d/seatools/boot/64bit/modules_4817_64.gz,d/seatools/boot/32bit/rootfs_4817_32.gz
append nfsmount=192.168.0.15:/home/kasak/tftpboot/d/seatools tce=nfs/tce lst=onboot_STB_Xorg.lst desktop=xfwm4 xexec="ST4L --exitPowerOff" mydata=mydata_STB quiet

label Dr. Web Live CD
linux d/drweb/casper/vmlinuz
initrd d/drweb/casper/initrd.lz
append ip=dhcp boot=casper union=aufs maybe-ubiquity netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/drweb quiet splash --

menu begin
menu title Минималистичные дистрибутивы

label ..
menu exit

label TinyCore Linux
kernel d/tinycore/boot/vmlinuz
initrd d/tinycore/boot/core.gz
append nfsmount=192.168.0.15:/home/kasak/tftpboot/d/tinycore tce=nfs/cde

label Минималистичная ОС Колибри
linux /boot/memdisk
initrd /d/kolibri/kolibri.img
append raw

label Damn Small Linux
linux /boot/memdisk
initrd /d/dsl/current.iso

menu begin
menu title Red Hat based distros

label ..
menu exit

menu begin
menu title CentOS

label ..
menu exit

menu begin
menu title Fedora

label ..
menu exit

menu begin
menu title Установка Windows
menu background boot/winburn.jpg

label ..
menu exit

submenu "Arch Linux" <

menuentry "Manjaro Linux via NFS" linux d/manjaro/boot/vmlinuz-x86_64 miso_basedir=manjaro miso_nfs_srv=192.168.0.15:/home/kasak/tftpboot/d/manjaro/ ip=. eth0:dhcp quiet
initrd d/manjaro/boot/intel_ucode.img d/manjaro/boot/initramfs-x86_64.img
>

submenu "Ubuntu based"

menuentry "change windows password" linux d/ntpass/vmlinuz rw vga=1 loglevel=1
initrd d/ntpass/initrd.czg d/ntpass/scsi.cgz
>

menuentry "Dr.Web Live CD" linux d/drweb/casper/vmlinuz ip=dhcp boot=casper union=aufs maybe-ubiquity netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/drweb quiet splash --
initrd d/drweb/casper/initrd.lz
>

menuentry "Seagate Seatools" linux d/seatools/boot/64bit/vmlinuz_4817_64-signed nfsmount=192.168.0.15:/home/kasak/tftpboot/d/seatools tce=nfs/tce lst=onboot_STB_Xorg.lst desktop=xfwm4 xexec="ST4L --exitPowerOff" mydata=mydata_STB quiet
initrd d/seatools/boot/64bit/modules_4817_64.gz d/seatools/boot/32bit/rootfs_4817_32.gz
>

submenu "Install windows must die"

Часть 5. Украшательства, и косяки с которыми вы можете столкнуться:

Украшательства:
Дабы немного разукрасить скучный вид, можно добавить русский язык в pxelinux. Для этого просто конвертируйте файл с русским шрифтом при помощи iconv:

Так же можно добавить обои в pxelinux и менять их в процессе перехода по разным менюшкам. Для этого нужно добавить строку в default:

такую же строку следует добавить в подменю, если вы хотите чтобы в подменю картинка менялась. так можно добавить картинку например убунты в меню с убунтами.

Картинка должна иметь разрешение 640x480 и цветность 16 бит. Как сконвертировать есть в интернете.

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

Картинку tux.jpg выберите самостоятельно.

Возможные проблемы:
Я не рекомендую использовать русский язык в grub. На некоторых машинах с ним нет никаких проблем, а на некоторых русские буквы просто пропадают.

Существуют проблемы с запуском убунт и их клонов с загрузкой из nfs когда сервер НЕ linux (в моём случае OpenBSD). Для этого нужно добавить опции NFSOPTS="rsize=8192,wsize=8192" к опциям загрузки, тогда всё пройдёт гладко.

Будьте предельно внимательны при копировании дистрибутива убунты на сервер. там есть скрытая папка .disk без которой убунта не загрузится!

Не пытайтесь в uefi загрузить старинные досовские утилиты, они не загрузятся.

Именно поэтому, придётся держать два отдельных конфига под pxe и uefi, иначе получится что в uefi не будет грузится часть досовских прог, а в pxe не будут грузится уефные бинарники

В грабе будьте внимательны с переменными и командами. Например terminal_output это команда, и знак = после неё не нужен. а gfxmode= это переменная, и знак = после неё нужен! Лучше поначалу вообще не используйте никакие переменные, чтобы не путаться.

Так же при загрузке через uefi, отключайте secure boot.
Теоретически, можно около бинарника граба поместить shimx64.efi, но лучше просто выключить secure boot.

seagate seatools можно загрузить через pxe и в режиме bios и в uefi. Он основан на tiny core linux. но к сожалению он не принимает nfsopts и заставить его понизить rsize и wsize нереально, поэтому nfs сервер под bsd не пойдёт.

western digital data lifeguard можно загрузить только в режиме legacy bios. но придётся вручную создать толстый дос диск.
я сделал это так:
1) создал в виртуалбоксе виртуальную машину с диском на 40-50 мегабайт. 2) установил туда фридос 3) скопировал туда dlg, и добавил в autoexec.bat путь к нему. 4) загрузил в этой виртуальной машине линукс и через dd скопировал весь диск в файл img. этот файл и нужно передать программе memdisk.

Часть 6. Заключительная

Возможно вы хотите задать вопросы, поэтому я сразу кое что проясню.
Q: Почему я сразу не использовал grub-mknetdir чтобы упростить себе и вам задачу, а не разводить тут писанину.
Отвечаю: Я поставил перед собой задачу рассказать вам как это происходит, как это работает, хотел показать разные варианты решения этих задач.

Q: Почему я не использовал тот же grub для legacy pxe?
A: Я мог бы, однако, опять же, хотел показать что не одним грабом можно решить эту задачу, и кроме того, pxelinux существует уже очень давно, и я пользуюсь им уже больше 10 лет.

Как: 10 шагов по настройке сервера tftpboot в UNIX / Linux (для установки Linux из сети с использованием PXE)


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

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

В этих сценариях вы можете соответствующим образом настроить службы tftpboot, и установка ОС может выполняться удаленно (вам необходим файл конфигурации autoyast для автоматизации шагов установки ОС).

В этой статье представлена ​​пошаговая процедура для SLES10-SP3 в 64-битной архитектуре. Однако эти шаги очень похожи на любые другие дистрибутивы Linux.

Требуемые пакеты

Следующие пакеты должны быть установлены для установки tftpboot.

Установка пакета

Установите пакеты для служб сервера dhcp:

После установки пакета syslinux файл pxelinux.0 будет создан в каталоге /usr/share/pxelinux/. Это необходимо для загрузки установочного образа ядра и образа initrd на клиентском компьютере.

Убедитесь, что пакеты успешно установлены.

Загрузите соответствующий tftpserver из репозитория вашего соответствующего дистрибутива Linux.

Шаги по настройке tftpboot

Шаг 1: Создайте каталог / tftpboot

Создайте каталог tftpboot в корневом каталоге (/), как показано ниже.

Шаг 2. Скопируйте изображение pxelinux

Образ Linux PXE будет доступен после установки пакета syslinux. Скопируйте этот путь в / tftpboot, как показано ниже.

Шаг 3. Создайте точку монтирования для ISO и смонтируйте ISO-образ

Предположим, мы собираемся установить дистрибутив SLES10 SP3 Linux на удаленный сервер. Если у вас есть диск SUSE10-SP3, вставьте его в дисковод или смонтируйте ISO-образ, который у вас есть. Здесь ISO-образ был смонтирован следующим образом:

Шаг 4: Скопируйте образы vmlinuz и initrd в / tftpboot

Скопируйте initrd в каталог tftpboot, как показано ниже.

Шаг 5: Создайте каталог pxelinux.cfg

Создайте каталог pxelinux.cfg в /tftpboot и определите определения загрузки pxe для клиента.

Следующие параметры используются для,

  • kernel — указывает, где найти установочное ядро ​​Linux на TFTP-сервере.
  • install — указывает параметры загрузки для передачи ядру установки.

Как указано выше, режим установки nfs используется для обслуживания установочных RPM и файлов конфигурации. Итак, настройте nfs на этом компьютере с каталогом / tftpboot в экспортированном списке. Вы можете добавить опцию «autoyast» в файл конфигурации autoyast, чтобы автоматизировать шаги установки ОС, в противном случае вам нужно будет выполнить шаги установки вручную.

Шаг 6: Смена владельца и разрешения для каталога /tftpboot

Никого не назначайте: никому в каталог /tftpboot.

Шаг 7: Изменить /etc/dhcpd.conf

Измените /etc/dhcpd.conf, как показано ниже.

Укажите интерфейс в /etc/syslinux/dhcpd для прослушивания запросов dhcp от клиентов.

Здесь эта машина имеет IP-адрес 192.168.1.101 на устройстве eth1. Итак, укажите eth1 для DHCPD_INTERFACE, как показано выше.

Шаг 8: Изменить /etc/xinetd.d/tftp

Измените файл /etc/xinetd.d/tftp, чтобы отразить следующее. По умолчанию значение параметра disable равно «yes», пожалуйста, убедитесь, что вы изменили его на «no», и вам нужно изменить запись server_args на -s / tftpboot.

Шаг 9: Без изменений в /etc/xinetd.conf

Нет необходимости изменять файл /etc/xinetd.conf. Используйте значения по умолчанию, указанные в файле xinetd.conf.

Шаг 10. Перезапустите службы xinetd, dhcpd и nfs.

Перезапустите эти службы, как показано ниже.

После перезапуска служб nfs вы можете просмотреть список экспортированных каталогов (/ tftpboot) с помощью следующей команды:

Наконец, настройка tftpboot готова, и теперь клиентский компьютер может быть загружен после изменения первого загрузочного устройства в качестве «сетевого» в настройках BIOS.

Если вы столкнулись с какой-либо ошибкой tftp, вы можете выполнить поиск и устранение неисправностей, загрузив некоторые файлы через службу tftpd.

Читайте также: