Bash · 25.10.2024

PXE без танцев с бубнами

Сегодня на пятничной повестке скрипт установки и запуска утилиты iVentoy, основанной на свободном PXE-сервере iPXE. Собственно, эта история для тех, кто хочет «поднять» PXE-сервер за пять минут, запустив только один скрипт.

iVentoy я разворачивал на Ubuntu Server 20.04. Обращаю Ваше внимание, что iVentoy для Linux существует только в редакции для 64-битных систем.

На сервере у меня предварительно запущена Samba с коллекцией сетевых папок (пост), к которой добавим ещё одну сетевую папку — iso. В неё будем складывать загрузочные образы.

sudo mkdir /iso && sudo chmod 777 /iso

В файл конфигурации Samba добавляем созданную папку:

[ISO]
path = /iso
read only = Yes
guest ok = Yes
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777

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

sudo service smbd restart

Теперь сам sh-скрипт:

#!/bin/bash
# sudo chmod +x /scripts/getiventoy.sh

# Блок переменных #
iventoy_path="/ventoy"
iventoy_version="/$iventoy_path/iventoy-*"
iventoy_run="$iventoy_version/iventoy.sh"

# Установка jq #
dpkg --verify jq || apt install jq -y

if [ ! -f $iventoy_run ]
then
	mkdir -p $iventoy_path
	cd $iventoy_path
	link=$(curl --silent "https://api.github.com/repos/ventoy/PXE/releases/latest" | jq -r ".assets[-4] | .browser_download_url")
	filename=$(basename "$link")
	wget $link $filename -q --show-progress
	tar -xvf $filename
	rm *gz*
	cd $iventoy_version
	sudo bash $iventoy_run start
else
	cd $iventoy_version
	sudo bash $iventoy_run -R start
fi

Скрипт установит утилиту jq (тег), если она не будет найдена в системе. В принципе, вся конструкция основана на скрипте из предыдущего поста.

Сразу после запуска iVentoy, в консоль упадёт url формата http://127.0.0.1:26000/. Проследите, чтобы порт 26000 был разрешён в брандмауэре сервера. IP-адрес можно заменить на реальный адрес сервера и войти в консоль с любого компьютера. Логины-пароли не требуются.

Перед запуском PXE-сервера требуется провести первичные настройки (читаем доки) и обновить список доступных установочных образов. Вот теперь, как раз, о самом важном…

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

sudo ln -s /iso/* /ventoy/iventoy-1.0.20/iso/

Обратите внимание на версию iVentoy, которая фигурирует в имени папки — если она у Вас будет отличаться — укажите корректный номер версии.

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

ln: failed to create symbolic link '/ventoy/iventoy-1.0.20/iso/file.iso': File exists

Это вполне нормально, так как ссылки уже существуют. Попробуйте форсировать команду:

sudo ln -sf /iso/* /ventoy/iventoy-1.0.20/iso/

Из ощутимых минусов: как не пытался осуществить автозапуск iVentoy при старте системы, ничего не вышло. Возможно, попытаю удачу чуть позже, а пока остаётся только ручной запуск.

UPD: исправляю тот самый ощутимый минус, о котором я упоминал чуть выше. Большое спасибо читателю Vazelinchik за метод запуска iVentoy в виде системной службы. Структура команд полностью авторская.

Важно понимать, что для последующих действий необходимы права суперпользователя!

Итак, первым делом скачиваем iVentoy. На момент публикации этой upd’шки последняя доступная (читай — стабильная) версия 1.0.21.

wget https://github.com/ventoy/PXE/releases/download/v1.0.21/iventoy-1.0.21-linux-free.tar.gz -O /tmp/iventoy.tar.gz

Теперь извлекаем все файлы из скачанного архива в папку /opt:

sudo tar -xvzf /tmp/iventoy.tar.gz -C /opt

Для удобства отсекаем номер версии в имени папки:

sudo mv /opt/iventoy-1.0.21 /opt/iventoy

И удаляем скачанный архив:

rm /tmp/iventoy.tar.gz

Начинается самое интересное: создание файла службы. Для этого используем магическую силу команды cat.

cat << EOF > /etc/systemd/system/iventoy.service
[Unit]
Description=iVentoy iPXE Server
Requires=network-online.target
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/iventoy
ExecStart=/opt/iventoy/iventoy.sh -R start
ExecStop=/opt/iventoy/iventoy.sh stop

[Install]
WantedBy=multi-user.target
EOF

Данный сервис имеет зависимость от network-online.target и не сможет запуститься, если соединения с сетью не будет. Также сервис будет запускаться от имени пользователя root. Учитывая особенность запуска службы, предусмотрено «ветвление» процесса.

Как только создание сервиса будет успешно завершено — перезапустим конфигурацию systemd:

systemctl daemon-reload

Осталось лишь включить автозапуск iventoy.service:

systemctl enable iventoy

Последним штрихом будет создание символических ссылок на образы. Предполагается, что они лежат в каталоге /iso.

ln -s /iso/* /opt/iventoy/iso/

Кстати, чтобы список образов обновлялся каждый раз при запуске службы можно прописать данную команду в секцию Service в качестве директивы ExecStartPost:

[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/iventoy
ExecStart=/opt/iventoy/iventoy.sh -R start
ExecStartPost=/bin/sh -c 'ln -s /iso/* /opt/iventoy/iso/'
ExecStop=/opt/iventoy/iventoy.sh stop

Запускаем сервис:

systemctl start iventoy

Чтобы убедиться, что всё прошло штатно — опрашиваем iVentoy:

bash /opt/iventoy/iventoy.sh status

Напоминаю, что iVentoy работает на 26000 порту.