Настройка PXE загрузки Ubuntu 20.04 + OpenWRT

Автор: | 14.06.2021

Предисловие

Задача: организовать сетевую загрузку с помощью syslinux pxeboot.0 для установки:

  • Ubuntu Linux
  • Windows 10
  • Kaspersky Rescie Disk
  • Paragon Hard Disk Manager™ 17 Advanced
  • возможно что-то еще…

В качестве ОС TFTP-сервера будем использовать Ubuntu 20.04 Server

Шаг 1: Начальная настройка tftp-hpa

Устанавливаем необходимые пакеты

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install tftpd-hpa nfs-kernel-server

Убеждаемся что файл конфигурации /etc/default/tftp-hpa к имеед следующий вид:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

Список возможных параметров tftp-hpa можно посмотреть здесь или здесь

Если были внесены правки, то перезагружаем tftp-server

sudo systemctl restart tftpd-hpa.service

Шаг 2: Настройка параметров DHCP-сервера OpenWRT

Заходим через ssh на маршрутизатор и смотрим текущие натройки dhcp-сервера:

uci -N show dhcp.@dnsmasq[0]

В моем случае ответ выглядит следующим образом:

dhcp.cfg01411c=dnsmasq
dhcp.cfg01411c.domainneeded='1'
dhcp.cfg01411c.localise_queries='1'
dhcp.cfg01411c.rebind_protection='1'
dhcp.cfg01411c.rebind_localhost='1'
dhcp.cfg01411c.local='/lan/'
dhcp.cfg01411c.domain='lan'
dhcp.cfg01411c.expandhosts='1'
dhcp.cfg01411c.authoritative='1'
dhcp.cfg01411c.readethers='1'
dhcp.cfg01411c.leasefile='/tmp/dhcp.leases'
dhcp.cfg01411c.resolvfile='/tmp/resolv.conf.auto'
dhcp.cfg01411c.confdir='/tmp/dnsmasq.d'
dhcp.cfg01411c.localservice='0'

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

uci add_list dhcp.@dnsmasq[0].dhcp_boot='pxelinux.0,<имя внешнего tftp pxe сервера>,<IP внешнего tftp pxe сервера>'
uci commit dhcp
/etc/init.d/dnsmasq restart

Альтернативный способ изменения параметров DHCP

Описаный выше способ вполне рабочий, но если вы используете OpenWRT с web-интерфейсом LuCI, то при каждом изменении параметров в разделе Сеть -> DHCP и DNS настройки относительно загрузки через TFTP будут сбрасываться. Чтобы этого не происходило можно сделать следующие настройки на вкладке «Настройки TFTP» данного раздела:

Где вместо строки lpxelinux.0,aquarius,192.168.0.66 будет pxelinux.0,<имя внешнего tftp pxe сервера>,<IP вашего tftp pxe сервера>

Шаг 3: Установка загручика

В качестве загрузчика будем использовать Syslinux

sudo apt install syslinux-common syslinux pxelinux

Копируем необходимые файлы в каталог /srv/tftp

sudo cp -v /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
sudo cp -v  /usr/lib/syslinux/modules/bios/{ldlinux.c32,linux.c32,libcom32.c32,libutil.c32,chain.c32,menu.c32} /srv/tftp
sudo cp -v /usr/lib/syslinux/memdisk /srv/tftp/

Так же нам понадобится утилита wimboot для загрузки WindowsPE дистрибутивов использующих wim-образы. Для этого выполняем слудующее:

wget -P ~ http://git.ipxe.org/releases/wimboot/wimboot-latest.zip
unzip ~/wimboot-latest.zip -d ~
sudo cp -v ~/wimboot-2.6.0-signed/wimboot /srv/tftp/
sudo chmod -v 644 /srv/tftp/wimboot
sudo chown -v root:root /srv/tftp/wimboot
rm -v ~/wimboot-latest.zip
rm -R -v ~/wimboot-2.6.0-signed/

Версия последней версии wimboot может отличаться, тогда нужно будет в используемых путях заменить wimboot-2.6.0-signed на правильный путь

Создаем каталог конфигурации pxelinux

sudo mkdir /srv/tftp/pxelinux.cfg

И создаем файл меню по умолчанию /srv/tftp/pxelinux.cfg/default со следующим содержанием:

menu title Boot menu PXE
DEFAULT menu.c32
TIMEOUT 50

label boothdd
  MENU LABEL Boot from first hard drive
  COM32 chain.c32
  APPEND hd0

После чего можно проверить что сервер работает, проверив что служба tftpd слушает порт и выполнить пробную загрузку по сети

Проверяем порт:

ss -l4|grep tftp

В результате мы должны увидеть такую строку:

udp   UNCONN 0      0                0.0.0.0:tftp          0.0.0.0:*

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

В папку /srv/tftp/images качаем нужные нам образы:

sudo mkdir -v /nfs
sudo mkdir -v /srv/tftp/{images,linux,windows}
wget -P /srv/tftp/images/ https://rescuedisk.s.kaspersky-labs.com/latest/krd.iso
wget -P /srv/tftp/images/ http://releases.ubuntu.com/18.04/ubuntu-18.04.5-desktop-amd64.iso
wget -P /srv/tftp/images/ http://releases.ubuntu.com/18.04/ubuntu-18.04.5-live-server-amd64.iso
wget -P /srv/tftp/images/ http://releases.ubuntu.com/20.04/ubuntu-20.04.2.0-desktop-amd64.iso
wget -P /srv/tftp/images/ http://releases.ubuntu.com/20.04/ubuntu-20.04.2-live-server-amd64.iso

Так же в папку /srv/tftp/images необходимо положить загрузочный образ Paragon Hard Disk Manager 17 Advanced, который в моем случае называется paragon-HDM-advanced_17.13.1_x64.iso

Создаем папки для монтирования образов

sudo mkdir -v /srv/tftp/linux/{ubuntu-18.04.5-desktop-amd64,ubuntu-18.04.5-live-server-amd64,ubuntu-20.04.2.0-desktop-amd64,ubuntu-20.04.2-live-server-amd64,krd,paragon}
sudo mkdir -v /nfs/{ubuntu-18.04.5-desktop-amd64,ubuntu-18.04.5-live-server-amd64,ubuntu-20.04.2.0-desktop-amd64,ubuntu-20.04.2-live-server-amd64,krd,paragon}

добавляем строки точек монтирования в файл /etc/fstab

/srv/tftp/images/ubuntu-18.04.5-desktop-amd64.iso      /nfs/ubuntu-18.04.5-desktop-amd64      iso9660  loop,ro,uid=tftp,gid=tftp  0 0
/srv/tftp/images/ubuntu-18.04.5-live-server-amd64.iso  /nfs/ubuntu-18.04.5-live-server-amd64  iso9660  loop,ro,uid=tftp,gid=tftp  0 0
/srv/tftp/images/ubuntu-20.04.2.0-desktop-amd64.iso    /nfs/ubuntu-20.04.2.0-desktop-amd64    iso9660  loop,ro,uid=tftp,gid=tftp  0 0
/srv/tftp/images/ubuntu-20.04.2-live-server-amd64.iso  /nfs/ubuntu-20.04.2-live-server-amd64  iso9660  loop,ro,uid=tftp,gid=tftp  0 0
/srv/tftp/images/krd.iso                               /nfs/krd                               iso9660  loop,ro,uid=tftp,gid=tftp  0 0
/srv/tftp/images/paragon-HDM-advanced_17.13.1_x64.iso  /nfs/paragon                           iso9660  loop,ro,uid=tftp,gid=tftp  0 0

/nfs/ubuntu-18.04.5-desktop-amd64      /srv/tftp/linux/ubuntu-18.04.5-desktop-amd64       none  bind  0 0
/nfs/ubuntu-18.04.5-live-server-amd64  /srv/tftp/linux/ubuntu-18.04.5-live-server-amd64   none  bind  0 0
/nfs/ubuntu-20.04.2.0-desktop-amd64    /srv/tftp/linux/ubuntu-20.04.2.0-desktop-amd64     none  bind  0 0
/nfs/ubuntu-20.04.2-live-server-amd64  /srv/tftp/linux/ubuntu-20.04.2-live-server-amd64   none  bind  0 0
/nfs/krd                               /srv/tftp/linux/krd                                none  bind  0 0
/nfs/paragon                           /srv/tftp/windows/paragon                          none  bind  0 0

Монтируем образы командой mount -a

Добавляем следующие строки в файл конфигурации NFS-сервера /etc/exports:

/nfs/ubuntu-18.04.5-desktop-amd64      192.168.0.0/24(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
/nfs/ubuntu-18.04.5-live-server-amd64  192.168.0.0/24(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
/nfs/ubuntu-20.04.2.0-desktop-amd64    192.168.0.0/24(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
/nfs/ubuntu-20.04.2-live-server-amd64  192.168.0.0/24(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
/nfs/krd                               192.168.0.0/24(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)

Перезапускаем сервис NTP

sudo systemctl restart nfs-server.service

Создаем файл дополнительного меню загрузчика /srv/tftp/pxelinux.cfg/linux со следующим содержимым:

Menu title Linux Boot

label menu
  menu label Return to Main menu
  kernel menu.c32
  append pxelinux.cfg/default

label ubuntu-desctop
  menu label Ubuntu 18.04 Desktop [amd64]
  kernel linux/ubuntu-18.04.5-desktop-amd64/casper/vmlinuz
  APPEND initrd=linux/ubuntu-18.04.5-desktop-amd64/casper/initrd file=/cdrom/preseed/ubuntu.seed boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.66:/nfs/ubuntu-18.04.5-desktop-amd64/ only-ubiquity quiet splash ---

label ubuntu-server
  menu label Ubuntu 18.04 Server [amd64]
  kernel linux/ubuntu-18.04.5-live-server-amd64/casper/vmlinuz
  APPEND initrd=linux/ubuntu-18.04.5-live-server-amd64/casper/initrd boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.66:/nfs/ubuntu-18.04.5-live-server-amd64/ quiet ---

label ubuntu-desctop
  menu label Ubuntu 20.04 Desktop [amd64]
  kernel linux/ubuntu-20.04.2.0-desktop-amd64/casper/vmlinuz
  APPEND initrd=linux/ubuntu-20.04.2.0-desktop-amd64/casper/initrd file=/cdrom/preseed/ubuntu.seed boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.66:/nfs/ubuntu-20.04.2.0-desktop-amd64/ maybe-ubiquity quiet splash ---

label ubuntu-server
  menu label Ubuntu 20.04 Server [amd64]
  kernel linux/ubuntu-20.04.2-live-server-amd64/casper/vmlinuz
  APPEND initrd=linux/ubuntu-20.04.2-live-server-amd64/casper/initrd boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.66:/nfs/ubuntu-20.04.2-live-server-amd64/ quiet ---

Изменяем основное меню /srv/tftp/pxelinux.cfg/default добавляем раздел для перехода в подменю «Install Linux distributions» и дополнительные пункты:

menu title Boot menu PXE
DEFAULT menu.c32
TIMEOUT 50

label boothdd
  MENU LABEL Boot from first hard drive
  COM32 chain.c32
  APPEND hd0

label linux-menu
  menu label Install Linux distributions
  kernel menu.c32
  append pxelinux.cfg/linux

label krd
  menu label Kaspersky Rescue Disk 18.0.11.0(c)
  kernel linux/krd/boot/grub/k-x86_64
  initrd linux/krd/boot/grub/initrd.xz
  append net.ifnames=0 lang=en dostartx netboot=nfs://192.168.0.66:/nfs/krd/

label paragon
  menu label Paragon Hard Disk Manager 17 Advanced
  com32 linux.c32 wimboot
  APPEND initrdfile=windows/paragon/bootmgr,/windows/paragon/boot/bcd,/windows/paragon/boot/boot.sdi,/windows/paragon/sources/boot.wim