Уже начиная с Ubuntu 20.04 я давно грезил задумкой разобрать как настраивается PXE сервис по сетевой установке Ubuntu выше чем 18.04 с применением файла ответов, но все как-то то руки не доходили то не мог понять принцип настройки, а тут сказал всё хватит, нужно сделать. Мне нужно чтобы я мог тестовые системы под OS: Ubuntu 22.04 Server разворачивать по сети на своем тестовом сервере под управлением Debian 10 + Proxmox 6.4-13 и также последующими версия.

Сейчас я покажу, опять же в шагах как люблю это дело, как поднимается PXE сервис на Ubuntu 22.04 Server и с которого будем устанавливать Ubuntu 22.04 Server + файл ответов, чтобы после получать готовую VM для последующей эксплуатации.

Что понадобится:

  • Тестовый сервер под управлением Debian 10 + Proxmox 6.4-13
  • Виртуальная машина с осью Ubuntu 22.04 Server которая установлена из образа: ubuntu-22.04.4-live-server-amd64.iso
  • Роутер (на нем у меня роль DHCP), Mikrotik rb2011UiAS-2Hnd-IN
  • Виртуальная машина, на которую по сети будет устанавливать ось Ubuntu 22.04 Server

Шаг №1: Устанавливаю на виртуальную машину, которая будет srv-pxe ось Ubuntu 22.04 Server из образа: ubuntu-22.04.2-live-server-amd64.iso

  • RAM: 4Gb
  • CPU: 1 sockets, 2 cores
  • HDD: 50Gb
sudo nano /etc/hosts
172.33.33.126 srv-pxe
sudo nano /etc/hostname
srv-pxe

Шаг №2: Обновляю установленную систему на хосте srv-pxe до самого последнего релиза в рамках текущего LTS релиза для Ubuntu 22.04 Server/Desktop:

ekzorchik@srv-pxe:~$ sudo nano /etc/update-manager/release-upgrades
[DEFAULT]
Prompt=never
ekzorchik@srv-pxe:~$ sudo rm -Rf /var/lib/apt/lists
ekzorchik@srv-pxe:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
ekzorchik@srv-pxe:~$ sudo reboot
ekzorchik@srv-pxe:~$ uname -a && lsb_release -a
Linux srv-pxe 5.15.0-112-generic #122-Ubuntu SMP Thu May 23 07:48:21 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-pxe:~$

Шаг №3: Настройки локали прописываю следующим образом:

sudo rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
sudo locale-gen en_US.UTF-8
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

Шаг №4: Создаю каталог который будет отправной точкой для сервиса TFTP из которого будет загружаться образ Ubuntu 22.04 Server и файлов ответов на автоматизированное развертывание:

ekzorchik@srv-pxe:~$ sudo mkdir /var/pxe

Шаг №5: Устанавливаю необходимые приложения на текущую систему, а именно Web-сервис, tftpd-hpa и т.д:

ekzorchik@srv-pxe:~$ sudo apt -y install nginx tftpd-hpa grub-pc grub-efi-amd64-signed net-tools tree

Шаг №6: Настраиваю на текущей системе TFTP сервис:

ekzorchik@srv-pxe:~$ sudo nano /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/pxe"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
ekzorchik@srv-pxe:~$ sudo systemctl restart tftpd-hpa.service
ekzorchik@srv-pxe:~$ sudo netstat -tulpn | grep :69
udp        0      0 0.0.0.0:69              0.0.0.0:*                           1727/in.tftpd
udp6       0      0 :::69                   :::*                                1727/in.tftpd
ekzorchik@srv-home:~$

Шаг №7: Настраиваю Webсервис Nginx:

ekzorchik@srv-pxe:~$ sudo rm -f /var/www/html/index.nginx-debian.html
ekzorchik@srv-pxe:~$ sudo rm -f /usr/share/nginx/html/index.html
ekzorchik@srv-pxe:~$ sudo unlink /etc/nginx/sites-enabled/default
ekzorchik@srv-pxe:~$ sudo rm -f /etc/nginx/sites-available/default
ekzorchik@srv-pxe:~$ sudo nano /etc/nginx/sites-available/pxe.conf
server {
        listen 80 default_server;
        server_name 172.33.33.126;
        location / {
                root /var/pxe;
        }
}
ekzorchik@srv-pxe:~$ sudo ln -s /etc/nginx/sites-available/pxe.conf /etc/nginx/sites-enabled/pxe.conf
ekzorchik@srv-pxe:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-home:~$
ekzorchik@srv-pxe:~$ sudo systemctl restart nginx

Шаг №8: Создаем в каталоге /var/pxe файлы GRUB:

ekzorchik@srv-pxe:~$ sudo mkdir /var/pxe/grub
ekzorchik@srv-pxe:~$ sudo grub-mkimage -d /usr/lib/grub/i386-pc/ -O i386-pc-pxe -o /var/pxe/grub_i386.pxe -p '/grub' pxe tftp
ekzorchik@srv-pxe:~$ sudo grub-mkimage -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi -o /var/pxe/grub_x64.pxe -p '/grub' efinet tftp
ekzorchik@srv-pxe:~$
ekzorchik@srv-pxe:~$ sudo cp -rf /usr/lib/grub/i386-pc/ /var/pxe/grub/i386-pc
ekzorchik@srv-pxe:~$ sudo cp -rf /usr/lib/grub/x86_64-efi/ /var/pxe/grub/x86_64-efi
ekzorchik@srv-pxe:~$ ls -l /var/pxe/
total 344
drwxr-xr-x 4 root root   4096 Jun  7 10:52 grub
-rw-r--r-- 1 root root  50052 Jun  7 08:52 grub_i386.pxe
-rw-r--r-- 1 root root 290816 Jun  7 08:53 grub_x64.pxe
drwxr-xr-x 3 root root   4096 Jun  7 10:21 iso
ekzorchik@srv-pxe:~$

Шаг №9: На домашнем роутере в лице Mikrotik rb2011UiAS-2Hnd-IN (Version 6.47.4) для сети 172.33.33.0/24 применительно к DHCP указываю на каком хосте адрес PXEсервис и загрузчик:

winbox - IP&DNS&MAC - user&pass - IP - DHCP Server — вкладка Networks и для сети 172.33.33.0/24

  • Next Server: 172.33.33.126
  • Boot File Name: grub_i386.pxe

и нажимаю Apply, OK.

Шаг №10: Описываю настройки выбора меню (grub.cfg) что устанавливать по сети:

ekzorchik@srv-pxe:~$ sudo nano /var/pxe/grub/grub.cfg
default=installed_os
timeout=5
timeout_style=menu
menuentry "Ubuntu 22.04 Manual Install" --id=22_manual {
  echo "Loading Kernel..."
  linux /iso/ubuntu/22.04/casper/vmlinuz ip=dhcp url=http://172.33.33.126/iso/ubuntu/22.04/ubuntu-22.04.4-live-server-amd64.iso root=/dev/ram0 cloud-config-url=/dev/null net.ifnames=0 biosdevname=0
  echo "Loading Ram Disk..."
  initrd /iso/ubuntu/22.04/casper/initrd
}
menuentry "Ubuntu 22.04 AutoInstall" --id=22_noswap {
  echo "Loading Kernel..."
  linux /iso/ubuntu/22.04/casper/vmlinuz ip=dhcp url=http://172.33.33.126/iso/ubuntu/22.04/ubuntu-22.04.4-live-server-amd64.iso root=/dev/ram0 cloud-config-url=/dev/null net.ifnames=0 biosdevname=0 autoinstall ds="nocloud-net;s=http://172.33.33.126/iso/ubuntu/22.04/cloud-init/noswap/"
  echo "Loading Ram Disk..."
  initrd /iso/ubuntu/22.04/casper/initrd
}
menuentry 'Installed OS (on disk)' --id=installed_os{
        exit 1
}

Шаг №11: Скачиваю образ и располагаю файлы необходимые для установки по сети:

ekzorchik@srv-pxe:~$ sudo mkdir -p /var/pxe/iso/ubuntu/22.04/casper
ekzorchik@srv-pxe:~$ sudo wget https://mirror.yandex.ru/ubuntu-releases/22.04/ubuntu-22.04.4-live-server-amd64.iso -O /var/pxe/iso/ubuntu/22.04/ubuntu-22.04.4-live-server-amd64.iso
ekzorchik@srv-pxe:~$ ls -l /var/pxe/iso/ubuntu/22.04/
total 2055100
drwxr-xr-x 2 root root       4096 Jun  7 10:56 casper
drwxr-xr-x 3 root root       4096 Jun  7 10:28 cloud-init
-rw-r--r-- 1 root root 2104408064 Feb 17 02:52 ubuntu-22.04.4-live-server-amd64.iso

Шаг №12: Из скачанного образа копирую файлы initrd & vmliuz в каталог casper для загрузки по сети:

ekzorchik@srv-pxe:~$ sudo mount -o loop /var/pxe/iso/ubuntu/22.04/ubuntu-22.04.4-live-server-amd64.iso /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
ekzorchik@srv-home:~$
ekzorchik@srv-pxe:~$ sudo cp /mnt/casper/initrd /var/pxe/iso/ubuntu/22.04/casper/
ekzorchik@srv-pxe:~$ sudo cp /mnt/casper/vmlinuz /var/pxe/iso/ubuntu/22.04/casper/
ekzorchik@srv-pxe:~$ sudo umount /mnt

Шаг №13: Настройки Subiquity:

ekzorchik@srv-pxe:~$ sudo mkdir -p /var/pxe/iso/ubuntu/22.04/cloud-init/noswap
ekzorchik@srv-pxe:~$ sudo touch /var/pxe/iso/ubuntu/22.04/cloud-init/noswap/{meta-data,user-data,vendor-data}

На заметку:

  • The file vendor-data is optional. I have this file on my system but it is completely empty. Subiquity will try several times to find this file if it does not exist, but if it exists and is empty, then Subiquity will only look for it the one time. As a result, Subiquity is faster to start up if this file exists and is empty.
  • The file meta-data should have the content instance-id: jammy-autoinstall. Update this when 24.04 comes out and you need to change the codename.
  • The file user-data is the real meat and potatoes of the autoinstall and it is where you will put your configuration. The documentation on some of the pieces of Subiquity are difficult to find. These resources can be very helpful when writing a configuration

Шаг №14: Чтобы сгенерировать Хеш пароль для файла ответов нужна утилита mkpasswd:

ekzorchik@srv-pxe:~$ apt-cache search mkpasswd
whois - intelligent WHOIS client
libstring-mkpasswd-perl - Perl module implementing a random password generator
ekzorchik@srv-pxe:~$ sudo apt-get install -y whois
ekzorchik@srv-pxe:~$ whereis mkpasswd
mkpasswd: /usr/bin/mkpasswd /usr/share/man/man1/mkpasswd.1.gz
ekzorchik@srv-pxe:~$ mkpasswd --method=sha-512 712mbddr@
$6$c00Oftw1wjPYkzkF$mHNmKfA0JhfqHZ8TEazerEfnQsQ4WmhCpHh5Wo7kCyuqcb6m4C5W0uiz.LYv5BJ/46nFOmuHGmSQJpkqXJcWX1
ekzorchik@srv-home:~$

Шаг №15: Создаем собственный файл ответов дабы установка Ubuntu 22.04 Server происходила автоматически без ручного участия:

ekzorchik@srv-pxe:~$ sudo nano /var/pxe/iso/ubuntu/22.04/cloud-init/noswap/user-data
#cloud-config
autoinstall:
  version: 1
  locale: en_US.UTF-8
  network:
    version: 2
    ethernets:
      nics:
       match:
         name: en*
       dhcp4: true
#      any:
#        dhcp4: true
#        addresses:
#        - 172.33.33.177/24
#        gateway4: 172.33.33.100
#        match:
#          name: en*
#        nameservers:
#          addresses:
#          - 8.8.8.8
  storage:
    layout:
      name: lvm
  identity:
    hostname: srv-test
    password: $6$c00Oftw1wjPYkzkF$mHNmKfA0JhfqHZ8TEazerEfnQsQ4WmhCpHh5Wo7kCyuqcb6m4C5W0uiz.LYv5BJ/46nFOmuHGmSQJpkqXJcWX1
    realname: ekzorchik
    username: ekzorchik
  keyboard:
    layout: us
    toggle: null
    variant: ''
  ssh:
    allow-pw: true
    authorized-keys: []
    install-server: true
  apt:
    disable_components: []
    geoip: true
    preserve_sources_list: false
    primary:
      - arches: [default]
        uri: http://us.archive.ubuntu.com/ubuntu/
  drivers:
    install: false
  packages:
    - build-essential
    - network-manager
    - dkms
  package_update: true
  package_upgrade: true
  late-commands:
    - "echo 'ekzorchik ALL=(ALL) NOPASSWD: ALL' >> /target/etc/sudoers.d/ekzorchik"
    - "chmod 440 /target/etc/sudoers.d/ekzorchik"
    - rm -f /target/etc/update-manager/release-upgrades
    - |
      cat << EOF | sudo tee /target/etc/update-manager/release-upgrades
      [DEFAULT]
      Prompt=never
      EOF
    - find /target/etc/netplan/ -name "*.yaml" -exec sh -c 'mv "$1" "$1-orig"' _ {} \;
    # Create a new netplan and enable it
    - |
      cat <<EOF | sudo tee /target/etc/netplan/01-netcfg.yaml
      network:
        version: 2
        renderer: NetworkManager
      EOF
    - curtin in-target --target /target netplan generate
    - curtin in-target --target /target netplan apply
    - curtin in-target --target /target systemctl enable NetworkManager.service
    - curtin in-target -- apt-get -y install htop net-tools unzip tree qemu-guest-agent
    - sed -ie 's/GRUB_TIMEOUT=.*/GRUB_TIMEOUT=5/' /target/etc/default/grub

Шаг №16: Проверяю, что процесс установки по сети работает, для этого создаю VM на Debian 10 + Proxmox 6.4-13 и не указываю образ загрузки, выбираю меню "Ubuntu 22.04 Autoinstall"

Listening on LPF/eth0/7e:07:96:e6:44:16

Sending on LPF/eth0/7e:07:96:e6:44:16

Sending on Socket/fallback

DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 (xid=0x9c7d96e)

DHCPOFFER of 172.33.33.127 from 172.33.33.100

DHCPREQUEST for 172.33.33.127 on the to 255.255.255.255 port 67 (xid=0x6ed9c709)

DHCPACK of 172.33.33.127 from 172.33.33.100 (xid=0x9c7d96e)

bound to 172.33.33.127 - renewal in 1736 seconds

Begin: Running /scripts/casper-premount … done

Запускается установка по сети.

видно для VM присвоился адрес 172.33.33.127

GRUB GRUB version 2.06

  • Ubuntu 22.04 Manual Install
  • Ubuntu 22.04 AutoInstall
  • Installed OS (on disk)

В меню GRUB выбираю Ubuntu 22.04 AutoInstall

и вот начался процесс применения файла ответов

Starting Time & Date Service…

Ubuntu 22.04.4 LTS Ubuntu-server tty

connecting…

waiting for cloud-init…

start: subiquity/Meta/status_GET

finish: subiquity/Filesystem/_probe/probe_once: restricted=False

finish: subiquity/Filesystem/_probe

start: subiquity/Network/_send_update: CHANGE eth0

finish: subiquity/Network/_send_update: CHANGE eth0

start: subiquity/Network/_send_update: CHANGE eth0

finish: subiquity/Network/_send_update: CHANGE eth0

И вот начался процесс применения файла ответов

вывод длинный его по понятным причинам не привожу здесь.

Привер вывода применения файла ответов при установке по сети Ubuntu 22.04 Server

Ожидаю…

После завершения система уйдет в перезагрузку, опять будет GRUB меню, но т.к. у меня по умолчанию обозначено "Installed OS (on disk)" то система загрузится, а загрузится то что было произведено установкой по сети. В процессе вы можете увидеть:

A start job is running for Wait for Network to be Configured (1 min 12s / no limit)

Это значит это служба systemd-networkd-wait-online ждет состояния "онлайн" для интерфейса

это значит это служба systemd-networkd-wait-online ждет состояния "онлайн" для интерфейса, поправляется это путем, когда система загрузится, вы авторизуетесь и выполните команды:

ekzorchik@srv-test:~$ sudo systemctl disable systemd-networkd-wait-online.service
Removed /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service.
ekzorchik@srv-test:~$ sudo systemctl mask systemd-networkd-wait-online.service
Created symlink /etc/systemd/system/systemd-networkd-wait-online.service → /dev/null.
ekzorchik@srv-test:~$
ekzorchik@srv-test:~$ uname -a && lsb_release -a
Linux srv-test 5.15.0-112-generic #122-Ubuntu SMP Thu May 23 07:48:21 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-test:~$

Перезагружаем системы и загрузка системы проходит быстро, и Вы в консоли виртуальной машины видите приветствие на авторизацию:

Ubuntu 22.04.4 LTS srv-test tty1
srv-test login:

Итого я наконец-таки разобрал, каким образом можно осуществить развертывание PXE сервиса на базе Ubuntu 22.04 Server и выполнить установку по сети Ubuntu 22.04 Server с применением файла ответом. Теперь дело пойдет, будут обкатывать различные моменты для PXE и усовершенствовать как я делал до Ubuntu 20.04 чем пользуюсь и по сей день, но в качестве PXE сервиса у меня выступает комбайн на базе FOG Project.

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