Сейчас я свой сервис FOG Project на машине где у меня также развернут сервис apt-cacher-ng сделаю меню автоматизированной установки нужного мне дистрибутива — а именно Ubuntu 18.04 Server + файл ответов и добавлю в него скрипт подготовки системы к дальнейшему использованию. В моем случае это экономия времени во время тестов и последующего боевого использования.

Текущая система:

srv-cache

  • OS: Ubuntu 18.04 Server
  • Services: FOG Project, apt-cacher-ng

Шаг №1: Обновленная установка FOG Project on Ubuntu 18.04 Server

Шаг №2: Т.к. пакет tftpd-hpa установлен шагов выше, то произвожу изменения в конфигурационном файле и месторасположению:

ekzorchik@srv-cache:~$ dpkg -l | grep tftpd-hpa
ii  tftpd-hpa                              5.2+20150808-1ubuntu3                           amd64        HPA's tftp server
ekzorchik@srv-cache:~$
ekzorchik@srv-cache:~$ sudo mkdir /tftpboot
ekzorchik@srv-cache:~$ sudo chmod -R 777 /tftpboot/
ekzorchik@srv-cache:~$ sudo chown -R nobody:nogroup /tftpboot/
ekzorchik@srv-cache:~$ sudo cp /etc/default/tftpd-hpa /etc/default/tftpd-hpa.backup
ekzorchik@srv-cache:~$ sudo nano /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create --verbose"
ekzorchik@srv-cache:~$ sudo systemctl restart tftpd-hpa.service 
ekzorchik@srv-cache:~$ sudo netstat -tulpn | grep tftp
udp        0      0 0.0.0.0:69              0.0.0.0:*                           8145/in.tftpd       
udp6       0      0 :::69                   :::*                                8145/in.tftpd       
ekzorchik@srv-cache:~$

Шаг №3: Создаю структуру каталогов для iPXE Menu: OS.Ubuntu 18.04.6 Server:

ekzorchik@srv-cache:~$ wget http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.6-server-amd64.iso
ekzorchik@srv-cache:~$ sudo mkdir -p /images/os/ubuntu/server/18.04
ekzorchik@srv-cache:~$ sudo mkdir -p /tftpboot/os/ubuntu/server/18.04
ekzorchik@srv-cache:~$ sudo mount -o loop -t iso9660 /home/ekzorchik/ubuntu-18.04.6-server-amd64.iso /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
ekzorchik@srv-cache:~$ 
ekzorchik@srv-cache:~$ sudo cp -R /mnt/* /images/os/ubuntu/server/18.04/
ekzorchik@srv-cache:~$ sudo umount /mnt
ekzorchik@srv-cache:~$ rm ubuntu-18.04.6-server-amd64.iso 
ekzorchik@srv-cache:~$ sudo cp /images/os/ubuntu/server/18.04/install/vmlinuz /tftpboot/os/ubuntu/server/18.04/
ekzorchik@srv-cache:~$ sudo cp /images/os/ubuntu/server/18.04/install/netboot/ubuntu-installer/amd64/initrd.gz /tftpboot/os/ubuntu/server/18.04/
ekzorchik@srv-cache:~$

Шаг №4: Корневая директория для Web-сервиса — это /var/www/, но FOG Management использует /var/www/fog/, а значит создаю структуру:

ekzorchik@srv-cache:~$ sudo a2dissite
Your choices are: 001-fog
Which site(s) do you want to disable (wildcards ok)?
ekzorchik@srv-cache:~$ sudo apache2ctl -S | grep fog
*:80 172.35.35.16 (/etc/apache2/sites-enabled/001-fog.conf:1)
ekzorchik@srv-cache:~$ cat /etc/apache2/sites-enabled/001-fog.conf | grep Root
DocumentRoot /var/www/
ekzorchik@srv-cache:~$
ekzorchik@srv-cache:~$ sudo mkdir -p /var/www/fog/ubuntu/bionic/server

файл server.seed помещаю в каталог /var/www/fog/ubuntu/bionic/server

Содержимое server.seed

ekzorchik@srv-cache:~$ sudo nano /var/www/fog/ubuntu/bionic/server/server.seed
#General configuration
d-i auto-install/enable boolean true
d-i debconf/priority string critical
d-i pkgsel/update-policy select none

#Localization
d-i debian-installer/locale string en_US.UTF-8
d-i debian-installer/language string en
d-i localechooser/supported-locales multiselect en_US.UTF-8, ru_RU.UTF8
d-i debian-installer/country string US

#Keyboard
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string us
d-i console-setup/modelcode string SKIP
d-i keyboard-configuration/xkb-keymap select us

#Set physical link
d-i netcfg/choose_interface select auto

#The Debian release to install
d-i mirror/country select US
d-i mirror/http/mirror select us.archive.ubuntu.com
# TODO: d-i mirror/http/proxy string http://HOST:3142/
d-i mirror/http/proxy string http://172.35.35.16:3142/
d-i mirror/suite string bionic

# CLOCK / TIMEZONE
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string time.nist.gov

#hostname
d-i netcfg/get_hostname string srv-bionic

#user setup
d-i passwd/user-fullname string Ubuntu 18.04 test user
d-i passwd/username string ekzorchik
d-i passwd/user-password password 712mbddr@
d-i passwd/user-password-again password 712mbddr@
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
d-i live-installer/enable boolean false
#Partitioning
d-i partman-auto/disk string /dev/sda /dev/vda
d-i partman-auto/method string regular
#d-i partman-auto/method string lvm
#d-i partman-lvm/device_remove_lvm boolean true
#d-i partman-lvm/confirm boolean true
#d-i partman-lvm/confirm_nooverwrite boolean true
#d-i partman-auto-lvm/guided_size string max
#atomic -> all files in on partition
#home   -> separate /home partition
#multi   -> separate /home, /var, /tmp partitions
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
#Software selection
d-i tasksel/first multiselect standard
d-i preseed/late_command string apt-install mc unzip tmux mercurial vim build-essential multipath-tools lsscsi lvm2 htop net-tools openssh-server qemu-guest-agent
d-i finish-install/reboot_in_progress no
ekzorchik@srv-cache:~$ sudo chown -R www-data:www-data /var/www/fog/ubuntu/

Шаг №5: Проверяю, что обратившись к URL адресу получаю файл ответов:

ekzorchik@srv-cache:~$ curl -vsSf http://172.35.35.16/fog/ubuntu/bionic/server/server.seed > /dev/null
*   Trying 172.35.35.16...
* TCP_NODELAY set
* Connected to 172.35.35.16 (172.35.35.16) port 80 (#0)
> GET /fog/ubuntu/bionic/server/server.seed HTTP/1.1
> Host: 172.35.35.16
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 22 Jan 2022 16:01:55 GMT
< Server: Apache/2.4.29 (Ubuntu)
< Last-Modified: Sat, 22 Jan 2022 15:56:00 GMT
< ETag: "8fa-5d62dc5910b85"
< Accept-Ranges: bytes
< Content-Length: 2298
< Connection: close
< 
{ [2298 bytes data]
* Closing connection 0
ekzorchik@srv-cache:~$

Статус имеет код 200 и это означает что запрашиваемый URL доступен, также можно просто скопировать URL (http://172.35.35.16/fog/ubuntu/bionic/server/server.seed) в другую вкладку и в ответ Вы должны получить содержимое файла ответов server.seed.

Шаг №6: Создаю iPXE меню возможности установки Ubuntu 18.04 Server (дистрибутив: ubuntu-18.04.6-server-amd64.iso)

http://172.35.35.16/fog/management/index.php

Авторизуюсь:

  • Username: fog
  • Password: password
  • Language: English

и нажимаю Login, затем перехожу FOG Configuration — iPXE New Menu Entry -

  • Menu Item: OS: Ubuntu 18.04 Server
  • Description: Ubuntu 18.04 Server
  • Parameters: kernel tftp://${fog-ip}/os/ubuntu/server/18.04/vmlinuz
    initrd tftp://${fog-ip}/os/ubuntu/server/18.04/initrd.gz
    imgargs vmlinuz initrd=initrd.gz root=/dev/nfs netboot=nfs nfsroot=${fog-ip}:/images/os/ubuntu/server/18.04/ locale=en_US.UTF-8 keyboard-configuration/layoutcode=us hostname=srv-bionic url=http://${fog-ip}/fog/ubuntu/bionic/server/server.seed quiet splash ip=dhcp rw
    boot || goto MENU
  • Menu Show with: All Hosts

и нажимаю Save Changes

Шаг №7: Проверяю установку ОС через PXE загрузку, для этого создаю VM на Proxmox 6 и выставляю что образ не используется (т.е. система не устанавливается через подмонтированный iso образ)

и получаю ошибки вида:

Filename: undionly.kpxe

tftp://172.35.35.16/undionly.kpxe... No such file or directory

No more network devices

положил файл undionly.kpxe в каталог /tftpboot

после

tftp://172.35.35.16/default.ipxe... No such file or directory

Chainloading failed, hit 's' for the iPXE shell; reboot in 10 seconds

В каталог /tftpboot помещаю undionly.kpxe и создаю меню установки, странно что дефолтное Web-интерфейсное не задействуется, как было ранее в FOG Project 1.5.5:

ekzorchik@srv-cache:~$ sudo find / -name undionly.kpxe
/opt/fog/packages/tftp/10secdelay/undionly.kpxe
/opt/fog/packages/tftp/undionly.kpxe
ekzorchik@srv-cache:~$
ekzorchik@srv-cache:~$ sudo cp /opt/fog/packages/tftp/undionly.kpxe /tftpboot/
ekzorchik@srv-cache:~$ cd /tftpboot/
ekzorchik@srv-cache:/tftpboot$ ln -s undionly.kpxe undionly.0

Шаг №8: Создаю свое меню через создание файла default.ipxe:

ekzorchik@srv-cache:/tftpboot$ nano default.ipxe
#!ipxe
set fog-ip 172.35.35.16

######## MAIN MENU ###################
:start
menu Welcome to iPXE's Boot Menu
item
item --gap -- ---------------- iPXE boot menu ----------------
item shell	Enter iPXE shell
item Ubuntu_18_04_Server	Ubuntu 18.04 Server
item reboot	Reboot
item config	Config
item exit	Exit (boot local disk)
choose --default return --timeout 15000 target && goto ${target}

:shell
echo Type exit to get the back to the menu
shell
set menu-timeout 0
goto start

:reboot
reboot

:config
config
goto start

:exit
sanboot --no-describe --drive 0x80
exit

#############MAIN MENU ITEMS#############

:Ubuntu_18_04_Server
kernel tftp://${fog-ip}/os/ubuntu/server/18.04/vmlinuz
initrd tftp://${fog-ip}/os/ubuntu/server/18.04/initrd.gz
imgargs vmlinuz initrd=initrd.gz root=/dev/nfs netboot=nfs nfsroot=${fog-ip}:/images/os/ubuntu/server/18.04/ locale=en_US.UTF-8 keyboard-configuration/layoutcode=us hostname=srv-bionic url=http://${fog-ip}/fog/ubuntu/bionic/server/server.seed quiet splash ip=dhcp rw
boot
goto start

После сохраняю внесенные изменения.

ekzorchik@srv-cache:/tftpboot$ cd ~
ekzorchik@srv-cache:~$

Перезапускаю виртуальную машину, выбираю в меню загрузки меню " Ubuntu_18_04_Server" и установка начинается и с учетом что в качестве жесткого диска для виртуальной машины выбран M.2 диск (1000 ГБ SSD M.2 накопитель Kingston KC2500 [SKC2500M8/1000G]) процесс довольно быстро завершается успешно. Операционная система Ubuntu 18.04.6 успешно установлена по сети и готова к использованию:

Установка Ubuntu 18.04 Server выполнена по сети

Подведу итоги, почему-то через FOG Project меню загрузки не появилось, как я раньше использовал, а вместо этого я приобщаюсь к использованию конфигурационного файла описывающего поведение загрузки — default.ipxe. Возможно это и к лучшему и смогу удалить сервис FOG Project в пользу минимизации.

Шаг №9: Удаляю FOG Project:

ekzorchik@srv-cache:~$ sudo mv /var/www/fog/ubuntu/ /var/www/html/

ekzorchik@srv-cache:~$ sudo rm -Rf /var/www/fog/

ekzorchik@srv-cache:~$ sudo mysql -u root -p712mbddr@ -e "drop database fog"

ekzorchik@srv-cache:~$ sudo rm /var/www/html/fog

ekzorchik@srv-cache:~$ sudo rm -rf /opt/fog

ekzorchik@srv-cache:~$ sudo userdel fogproject

ekzorchik@srv-cache:~$ sudo a2dissite 001-fog

ekzorchik@srv-cache:~$ sudo rm -f /var/www/html/index.html

ekzorchik@srv-cache:~$ sudo rm -f /etc/apache2/sites-available/001-fog.conf

ekzorchik@srv-cache:~$ sudo systemctl restart apache2

В итоге остается каталог ubuntu:

FOG удален, остался каталог ubuntu

и изменяю default.ipxe для пути расположения каталога ubuntu:

ekzorchik@srv-cache:~$ nano /tftpboot/default.ipxe
#!ipxe
set server-ip 172.35.35.16

######## MAIN MENU ###################
:start
menu Welcome to iPXE's Boot Menu
item
item --gap -- ---------------- iPXE boot menu ----------------
item shell	Enter iPXE shell
item Ubuntu_18_04_Server	Ubuntu 18.04 Server
item reboot	Reboot
item config	Config
item exit	Exit (boot local disk)
choose --default return --timeout 15000 target && goto ${target}

:shell
echo Type exit to get the back to the menu
shell
set menu-timeout 0
goto start

:reboot
reboot

:config
config
goto start

:exit
sanboot --no-describe --drive 0x80
exit

#############MAIN MENU ITEMS#############

:Ubuntu_18_04_Server
kernel tftp://${server-ip}/os/ubuntu/server/18.04/vmlinuz
initrd tftp://${server-ip}/os/ubuntu/server/18.04/initrd.gz
imgargs vmlinuz initrd=initrd.gz root=/dev/nfs netboot=nfs nfsroot=${server-ip}:/images/os/ubuntu/server/18.04/ locale=en_US.UTF-8 keyboard-configuration/layoutcode=us hostname=srv-bionic url=http://${server-ip}/ubuntu/bionic/server/server.seed quiet splash ip=dhcp rw
boot
goto start

Шаг №10: Добавляем в файл ответов скрипт предварительной настройки системы перед дальнейшим использованием:

ekzorchik@srv-cache:~$ sudo nano /var/www/html/ubuntu/bionic/server/default.sh
#!/bin/bash
# Codepage UTF-8
# aka Олло Александр aka ekzorchik (Telegram: @ekzorchik)
# for Ubuntu 18.04 Server amd64
#Это у меня в локальной сети сервис кеширующий любые устанавливаемые deb-пакеты чтобы не приходилось их раз за разом скачивать во время экспериментов.
function proxy {
cat > /etc/apt/apt.conf.d/02proxy << EOF
Acquire::http { Proxy "http://172.35.35.16:3142"; };
EOF
}
proxy
#for wget no use proxy
sed -i 's/#use_proxy = on/use_proxy = off/g' /etc/wgetrc
rm -Rf /var/lib/apt/lists
locklist="/var/lib/apt/lists/lock"
if [ -f $locklist ]
then
	echo "$locklist found i budet delete"
	rm -rf $locklist
else
	echo "$locklist not found"
fi
lockapt="/var/cache/apt/archives/lock"
if [ -f $lockapt ]
then
	echo "$lockapt found i budet delete"
	rm -rf $lockapt
else
	echo "$lockapt not found"
fi
lock="/var/lib/dpkg/lock"
lockfrontend="/var/lib/dpkg/lock-frontend"
lockbackup="/var/lib/dpkg/lock-backup"
if [ -f "$lock" ]
then
        echo "$lock found i budet delete"
        rm -rf $lock
        ls /var/lib/dpkg/lock
else
        echo "$lock not found."
fi
if [ -f "$lockfrontend" ]
then
        echo "$lockfrontend found i budet delete"
        rm -rf $lockfrontend
        ls /var/lib/dpkg/lock-frontend
else
        echo "$lockfrontend not found"
fi
if [ -f "$lockbackup" ]
then
        echo "$lockbackup found i budet delete"
        rm -rf $lockbackup
        ls /var/lib/dpkg/lock-backup
else
        echo "$lockbackup not found"
fi
apt-get update && sudo apt-get upgrade -y
rm -rf /var/lib/dpkg/updates/*
sed -i '/Prompt/s/lts/never/' /etc/update-manager/release-upgrades
dpkg --configure -a
apt-get dist-upgrade -y
#Timezone
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
apt-get autoremove -y
# Удаляю из системы пакет Cloud Init
sudo bash -c "echo 'datasource_list: [ None ]' sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg"
sudo apt purge -y cloud-init
sudo rm -Rf /etc/cloud /var/lib/cloud
#NTP
sudo apt-get install ntpdate mercurial bikeshed -y
sudo bash -c "echo '@reboot /usr/sbin/ntpdate -s 0.pool.ntp.org > /dev/null'" | sudo -s tee /var/spool/cron/crontabs/root
ntpdate -s 0.pool.ntp.org
#Install nuznoe in work
apt-get install htop mc software-properties-common -y
#locale
#sudo locale-gen ru_RU
#sudo locale-gen ru_RU.UTF-8
sudo locale-gen en_US.UTF-8
sudo sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen && sudo locale-gen
#sudo sed -i 's/ru_RU.KOI8-R/ru_RU.UTF-8/g' /etc/locale.alias
echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale

Шаг №11: Изменяю файл server.seed с добавлением выполнения скрипта после установки системы Ubuntu 18.04 Server:

ekzorchik@srv-cache:~$ sudo nano /var/www/html/ubuntu/bionic/server/server.seed
#General configuration
d-i auto-install/enable boolean true
d-i debconf/priority string critical
d-i pkgsel/update-policy select none

#Localization
d-i debian-installer/locale string en_US.UTF-8
d-i debian-installer/language string en
d-i localechooser/supported-locales multiselect en_US.UTF-8, ru_RU.UTF8
d-i debian-installer/country string US

#Keyboard
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string us
d-i console-setup/modelcode string SKIP
d-i keyboard-configuration/xkb-keymap select us

#Set physical link
d-i netcfg/choose_interface select auto

#The Debian release to install
d-i mirror/country select US
d-i mirror/http/mirror select us.archive.ubuntu.com
# TODO: d-i mirror/http/proxy string http://HOST:3142/
d-i mirror/http/proxy string http://172.35.35.16:3142/
d-i mirror/suite string bionic

# CLOCK / TIMEZONE
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string time.nist.gov

#hostname
d-i netcfg/get_hostname string srv-bionic

#user setup
d-i passwd/user-fullname string Ubuntu 18.04 test user
d-i passwd/username string ekzorchik
d-i passwd/user-password password 712mbddr@
d-i passwd/user-password-again password 712mbddr@
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
d-i live-installer/enable boolean false
#Partitioning
d-i partman-auto/disk string /dev/sda /dev/vda
d-i partman-auto/method string regular
d-i partman-auto/method string lvm
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max
#atomic -> all files in on partition
#home   -> separate /home partition
#multi   -> separate /home, /var, /tmp partitions
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
#Software selection
d-i tasksel/first multiselect standard
d-i preseed/late_command string apt-install mc unzip tmux mercurial vim build-essential multipath-tools lsscsi lvm2 htop net-tools openssh-server qemu-guest-agent; in-target wget --no-proxy http://172.35.35.16/ubuntu/bionic/server/default.sh -O /tmp/default.sh; in-target chmod +x /tmp/default.sh; in-target /bin/bash /tmp/default.sh
d-i finish-install/reboot_in_progress no
ekzorchik@srv-cache:~$ sudo chown -R www-data:www-data /var/www/html/

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

На этом у меня пока все, с уважением автор блога Олло Александр aka ekzorchik.