Варианты загрузки компьютера
Для низкоуровневого обслуживания компьютеров (работа с разделами и образами жесткого диска, восстановление данных, борьба с вирусами и кибератаками и т.п.), а также для установки операционной системы можно использовать загрузочные 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