Загрузка по сети с netboot.xyz под Docker

Andrew Buldyzhov February 17, 2020

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

Для низкоуровневого обслуживания компьютеров (работа с разделами и образами жесткого диска, восстановление данных, борьба с вирусами и кибератаками и т.п.), а также для установки операционной системы можно использовать загрузочные USB флешки, например: Ubuntu Live, Clonezilla, SergeyStrelec.

Однако, у этого решения есть недостатки:

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

Кроме того, при использовании Gigabit Ethernet, загрузка по сети быстрее.

Под Windows для загрузки по сети я обычно использовал tftpd32 — удобная портабельная маленькая, но достаточно мощная программа с открытыми исходниками. Однако я в последнее время стараюсь уходить от Windows, поэтому решил разобраться, как решить эту задачу под Linux.

Поиск выдает довольно много вариантов, но можно выделить netboot.xyz как зрелое решение с хорошей поддержкой. Уникальным преимуществом этого проекта является то, что там собраны и обновляются образы многих дистрибутивов ОС и утилит, которые можно загружать прямо из интернета или выкачать для кеширования на локальный диск. Есть загрузочное меню, которое можно редактировать и наращивать, в том числе через Git. Можно загружать ISO образы, однако не все: например, SergeyStrelec не пошел.

Самый удобный способ установки netboot.xyz — с помощью контейнера Docker. Это дает такие преимущества:

  • быстрая и удобная установка и конфигурация;
  • можно быстро запустить/остановить и удалить ПО;
  • высокая надежность и безопасность — изоляция от основной ОС, благодаря виртуализации, при этом используемые ресурсы (место на диске, память, процессор) намного меньше, чем при использовании виртуальной машины.

Docker контейнеров для netboot.xyz также существует несколько, наиболее зрелым представляется этот. Также вот его дополнительное описание.

Особенность этого контейнера — отсутствие своего DHCP сервера. Если DHCP уже есть в сети, например, в роутере, то следует использовать его во избежание конфликтов. Если же роутера нет, или не получается его настроить, то можно установить DHCP сервер на компьютере также с помощью Docker контейнера, например этого. Либо использовать другой контейнер c netbootxyz со встроенным DHCP, например этот. Либо использовать контейнер, в котором реализован PXE и DHCP без netboot.xyz, например этот.

Установка и настройка netbootxyz

Однако мы рассмотрим тут контейнер linuxserver/netbootxyz. Здесь приведены основные выжимки из официальной документации, а также кое-что, чего там не хватало.
Установка Docker для Ubuntu. Ставим вариант docker.io из официального репозитория Ubuntu — ранее он считался устаревшим, но недавно возобновилась его поддержка. Соответственно, другие варианты удаляем (если они не были установлены, не важно):

sudo apt-get update
sudo apt-get remove docker docker-engine docker.io docker-ce docker-ce-cli containerd.io
sudo apt install docker.io docker-compose
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

Существует несколько способов запуска этого контейнера, самый удобный — с помощью docker-compose. Следует создать файл docker-compose.yml:

version: "2"
services:
  netbootxyz:
    image: linuxserver/netbootxyz
    container_name: netbootxyz
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./netbootxyz-config:/config
      - /media/d1/Dist/OS/netbootxyz:/assets # put here the path for the local downloaded distributives
    ports:
      - 3000:3000
      - 69:69/udp
      - 8080:80
    restart: unless-stopped

Далее отредактируйте в docker-compose.yml путь /media/d1/Dist/OS/netbootxyz — там будут храниться скачанные образы. Для удобства запуска можно еще создать файл start.sh в той же директории (закомментированные строки — для установки Windows 10):

#!/bin/bash
#mkdir /media/d1/Dist/OS/netbootxyz/win
#sudo mount -o loop /media/d1/Dist/OS/Windows10_orig/WIN10_64_En.ISO /media/d1/Dist/OS/netbootxyz/win
docker-compose up --build
#sudo umount /media/d1/Dist/OS/netbootxyz/win                                             

Для запуска контейнера — sh start.sh в терминале, для остановки — Ctrl-C.
Далее следует настроить DHCP сервер в роутере. Например, для OpenWRT (в нашем примере адрес компьютера с запущенным контейнером — 192.168.1.2):
Network -> DHCP and DNS -> TFTP Settings -> Enable -> Network boot image:
для Legacy BIOS:

netboot.xyz.kpxe,,192.168.1.2

для UEFI:

netboot.xyz.efi,,192.168.1.2

Уже можно пробовать загружаться по сети. Образы будут выкачиваться из интернета каждый раз при загрузке.
Для убыстрения загрузки, а также для работы без интернета (что часто бывает на промышленных объектах) следует закешировать образы на локальном диске. Для этого нужно открыть в браузере веб-интерфейс программы (http://localhost:3000/) и перейти по ссылке Local Assets в верхнем меню.

Я себе решил выкачать следующие утилиты (заняло 7.3 Гб):

Kali Live KDE
Ubuntu 19.10 Gnome/Default
Kaspersky Rescue Disk 
DBAN
4MLinux
Breakin
Rescatux
GParted Live
GRML
Clonezilla Debian stable

Также нужно отредактировать файлы меню, которые находятся в поддиректории ./netbootxyz-config/menus :

4mlinux.ipxe
clonezilla.ipxe
dban.ipxe
gparted.ipxe
kaspersky.ipxe
live-kali.ipxe
live-ubuntu.ipxe
utils-efi.ipxe
utils-pcbios.ipxe

В этих файлах нужно добавить такую строку после заголовка #!ipxe :

set live_endpoint http://192.168.1.2:8080

Установка Windows

Хотя такая опция и предусмотрена в netboot.xyz, но из коробки она не работает. Получилось допилить только для Windows 10 (возможно Windows 8.1 тоже заработает, не пробовал; но Windows 7 не заработал).

Итак, нужно отредактировать файл windows.ipxe:

  • добавить после заголовка строку:
set win_base_url http://192.168.1.2:8080/win
  • заменить везде по тексту строку “${win_base_url}/${win_arch}” на “${win_base_url}” — в моих дистрибутивах Windows не оказалось подпапки x86/x64.
  • заменить строку “kernel http://${boot_domain}/wimboot” на “kernel http://192.168.1.2:8080/wimboot”, а также скопировать файл wimboot из ./netbootxyz-config/menus/ в /media/d1/Dist/OS/netbootxyz/ — это нужно, чтобы было можно загружаться без интернета.

Далее нужно расшарить по сети (Samba) директорию /media/d1/Dist/OS/netbootxyz/win , в которую должен быть распакован или замонтирован (до запуска контейнера) образ ISO.
Далее, когда откроется первый экран установщика Windows (там где выбирается язык, формат времени и клавиатура), следует нажать Shift+F10 и выполнить следующие команды (взято отсюда):

wpeinit
net use S: \\192.168.1.2\Dist /user:guest password
S:\OS\netbootxyz\win\sources\setup.exe

Загрузка ISO образов

В меню netboot.xyz есть пункт “Test Distribution ISO”. Чтобы эта функция работала без интернета, нужно скопировать файл memdisk из ./netbootxyz-config/menus/ в /media/d1/Dist/OS/netbootxyz/ и отредактировать файл ./netbootxyz-config/menus/boot.cfg :
заменить

set memdisk http://${boot_domain}/memdisk

на

set memdisk http://192.168.1.2:8080/memdisk

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

Ваш email не будет опубликован. Обязательные поля помечены *