Уже начиная с 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)
и вот начался процесс применения файла ответов
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
вывод длинный его по понятным причинам не привожу здесь.
Ожидаю…
После завершения система уйдет в перезагрузку, опять будет 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
ждет состояния "онлайн"
для интерфейса, поправляется это путем, когда система загрузится, вы авторизуетесь и выполните команды:
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.