Rescue/Deploy: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
м (source tags deprecated)
Строка 334: Строка 334:


(dhcpd.conf)
(dhcpd.conf)
<source lang="">
<syntaxhighlight lang="ini">
...
...
elsif option arch = 00:00 {          # Legacy BIOS
elsif option arch = 00:00 {          # Legacy BIOS
Строка 340: Строка 340:
}
}
...
...
</source>
</syntaxhighlight>


'''undionly.kpxe''' необходим для того чтобы перейти (chainloading) от загрузчика '''PXE''' к загрузчику '''iPXE''', который имеет гораздо больше возможностей по сетевой загрузке операционных систем (https://ipxe.org/howto/dhcpd#pxe_chainloading).
'''undionly.kpxe''' необходим для того чтобы перейти (chainloading) от загрузчика '''PXE''' к загрузчику '''iPXE''', который имеет гораздо больше возможностей по сетевой загрузке операционных систем (https://ipxe.org/howto/dhcpd#pxe_chainloading).
Строка 347: Строка 347:


(dhcpd.conf)
(dhcpd.conf)
<source lang="">
<syntaxhighlight lang="ini">
...
...
if exists user-class and option user-class = "iPXE" {
if exists user-class and option user-class = "iPXE" {
Строка 353: Строка 353:
         }
         }
...
...
</source>
</syntaxhighlight>


Содержимое скрипта '''script.ipxe''':
Содержимое скрипта '''script.ipxe''':


<source lang="">
<syntaxhighlight lang="ini">
#!ipxe
#!ipxe


Строка 366: Строка 366:


boot
boot
</source>
</syntaxhighlight>


Выполняя скрипт script.ipxe сетевой загрузчик получает ядро, initrd и передает им опции загрузки ОС:
Выполняя скрипт script.ipxe сетевой загрузчик получает ядро, initrd и передает им опции загрузки ОС:
Строка 389: Строка 389:
Обновление до актуального состояния:
Обновление до актуального состояния:


<source lang="">
<syntaxhighlight lang="bash">
$ su -
$ su -
# apt-get update
# apt-get update
Строка 396: Строка 396:
# apt-get clean
# apt-get clean
# reboot
# reboot
</source>
</syntaxhighlight>


Отключаем и останавливаем следующие службы:
Отключаем и останавливаем следующие службы:


<source lang=""># systemctl disable --now smartd nscd nslcd</source>
<syntaxhighlight lang="bash"># systemctl disable --now smartd nscd nslcd</syntaxhighlight>


Создадим необходимые каталоги:
Создадим необходимые каталоги:
 
<syntaxhighlight lang="bash">
<source lang="">
# mkdir /img
# mkdir /img
# mkdir /srv/img
# mkdir /srv/img
</source>
</syntaxhighlight>


=== Установка пакетов для сервера сетевой загрузки ===
=== Установка пакетов для сервера сетевой загрузки ===


<source lang="">
<syntaxhighlight lang="bash">
# apt-get install ipxe-bootimgs
# apt-get install ipxe-bootimgs
# apt-get install dhcp-server nginx tftp tftp-server-xinetd nfs-utils nfs-server
# apt-get install dhcp-server nginx tftp tftp-server-xinetd nfs-utils nfs-server
</source>
</syntaxhighlight>


=== Настройка сети сервера ===
=== Настройка сети сервера ===
Строка 422: Строка 421:
Создаем каталог для настройки сетевого интерфейса (если его еще нет):
Создаем каталог для настройки сетевого интерфейса (если его еще нет):


<source lang="">
<syntaxhighlight lang="bash">
# mkdir /etc/net/ifaces/enp6s19
# mkdir /etc/net/ifaces/enp6s19
</source>
</syntaxhighlight>


Создаем конфигурационный файл интерфейса '''enp6s19''':
Создаем конфигурационный файл интерфейса '''enp6s19''':


<source lang="">
<syntaxhighlight lang="bash">
# cat /etc/net/ifaces/enp6s19/options
# cat /etc/net/ifaces/enp6s19/options
TYPE=eth
TYPE=eth
Строка 438: Строка 437:
NM_CONTROLLED=no
NM_CONTROLLED=no
SYSTEMD_CONTROLLED=no
SYSTEMD_CONTROLLED=no
</source>
</syntaxhighlight>


<source lang="">
<syntaxhighlight lang="bash">
# cat /etc/net/ifaces/enp6s19/ipv4address
# cat /etc/net/ifaces/enp6s19/ipv4address
192.168.15.1/24
192.168.15.1/24
</source>
</syntaxhighlight>


"Поднимаем" интерфейс, если он в состоянии down:
"Поднимаем" интерфейс, если он в состоянии down:


<source lang="">
<syntaxhighlight lang="bash">
# ifup enp6s19
# ifup enp6s19
</source>
</syntaxhighlight>


Итоговые настройки сети:
Итоговые настройки сети:


<source lang="">
<syntaxhighlight lang="bash">
# ip addr show enp6s19
# ip addr show enp6s19
3: enp6s19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
3: enp6s19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
Строка 461: Строка 460:
     inet6 fe80::6cf6:17ff:fec7:21a6/64 scope link  
     inet6 fe80::6cf6:17ff:fec7:21a6/64 scope link  
       valid_lft forever preferred_lft forever
       valid_lft forever preferred_lft forever
</source>
</syntaxhighlight>


=== Настройка DHCP сервера ===
=== Настройка DHCP сервера ===


<source lang=""># cat /etc/dhcp/dhcpd.conf
<syntaxhighlight lang="bash"># cat /etc/dhcp/dhcpd.conf
authoritative;
authoritative;
ddns-update-style none;
ddns-update-style none;
Строка 513: Строка 512:
         }
         }
}
}
</source>
</syntaxhighlight>


Определяем для службы '''dhcpd''' интерфейс, на котором она будет работать:
Определяем для службы '''dhcpd''' интерфейс, на котором она будет работать:


<source lang=""># cat /etc/sysconfig/dhcpd
<syntaxhighlight lang="bash"># cat /etc/sysconfig/dhcpd


# The following variables are recognized:
# The following variables are recognized:
DHCPDARGS=enp6s19</source>
DHCPDARGS=enp6s19</syntaxhighlight>


<source lang=""># systemctl enable --now dhcpd</source>
<syntaxhighlight lang="bash"># systemctl enable --now dhcpd</syntaxhighlight>


Убедимся что служба '''dhcpd''' запущена без ошибок:
Убедимся что служба '''dhcpd''' запущена без ошибок:


<source lang=""># systemctl status dhcpd
<syntaxhighlight lang="bash"># systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
● dhcpd.service - DHCPv4 Server Daemon
     Loaded: loaded (/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
     Loaded: loaded (/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
Строка 549: Строка 548:
ноя 07 13:26:12 host-215 dhcpd[4830]: Sending on  Socket/fallback/fallback-net
ноя 07 13:26:12 host-215 dhcpd[4830]: Sending on  Socket/fallback/fallback-net
ноя 07 13:26:12 host-215 dhcpd[4830]: Wrote 0 leases to leases file.
ноя 07 13:26:12 host-215 dhcpd[4830]: Wrote 0 leases to leases file.
ноя 07 13:26:12 host-215 dhcpd[4830]: Server starting service.</source>
ноя 07 13:26:12 host-215 dhcpd[4830]: Server starting service.</syntaxhighlight>


=== Настройка tftp и xinetd ===
=== Настройка tftp и xinetd ===
Строка 557: Строка 556:
Копируем необходимые файлы ('''iPXE''') для первоначальной загрузки по '''TFTP''':
Копируем необходимые файлы ('''iPXE''') для первоначальной загрузки по '''TFTP''':


<source lang=""># cp -v /usr/share/ipxe/{ipxe-i386.efi,ipxe-x86_64.efi,undionly.kpxe} /var/lib/tftpboot/
<syntaxhighlight lang="bash"># cp -v /usr/share/ipxe/{ipxe-i386.efi,ipxe-x86_64.efi,undionly.kpxe} /var/lib/tftpboot/
'/usr/share/ipxe/ipxe-i386.efi' -> '/var/lib/tftpboot/ipxe-i386.efi'
'/usr/share/ipxe/ipxe-i386.efi' -> '/var/lib/tftpboot/ipxe-i386.efi'
'/usr/share/ipxe/ipxe-x86_64.efi' -> '/var/lib/tftpboot/ipxe-x86_64.efi'
'/usr/share/ipxe/ipxe-x86_64.efi' -> '/var/lib/tftpboot/ipxe-x86_64.efi'
'/usr/share/ipxe/undionly.kpxe' -> '/var/lib/tftpboot/undionly.kpxe'</source>
'/usr/share/ipxe/undionly.kpxe' -> '/var/lib/tftpboot/undionly.kpxe'</syntaxhighlight>


Сконфигурируем '''xinetd'''.
Сконфигурируем '''xinetd'''.


<source lang=""># cat /etc/xinetd.d/tftp
<syntaxhighlight lang="bash"># cat /etc/xinetd.d/tftp
service tftp
service tftp
{
{
Строка 574: Строка 573:
server = /usr/sbin/in.tftpd
server = /usr/sbin/in.tftpd
server_args = -4 -a 192.168.15.1 -u tftp -s /var/lib/tftpboot -m /etc/tftpd.map
server_args = -4 -a 192.168.15.1 -u tftp -s /var/lib/tftpboot -m /etc/tftpd.map
}</source>
}</syntaxhighlight>


<source lang=""># cat /etc/tftpd.map
<syntaxhighlight lang="bash"># cat /etc/tftpd.map


# Convert backslashes to slashes
# Convert backslashes to slashes
rg \\ /</source>
rg \\ /</syntaxhighlight>


<source lang=""># cat /etc/xinetd.conf
<syntaxhighlight lang="bash"># cat /etc/xinetd.conf
defaults
defaults
{
{
Строка 592: Строка 591:
}
}


includedir /etc/xinetd.d</source>
includedir /etc/xinetd.d</syntaxhighlight>


<source lang=""># cat /etc/sysconfig/xinetd
<syntaxhighlight lang="bash"># cat /etc/sysconfig/xinetd
EXTRAOPTIONS='-remlock'</source>
EXTRAOPTIONS='-remlock'</syntaxhighlight>


<source lang=""># systemctl start xinetd.service</source>
<syntaxhighlight lang="bash"># systemctl start xinetd.service</syntaxhighlight>


=== Настройка nginx ===
=== Настройка nginx ===
Строка 603: Строка 602:
Создадим файл конфигурации '''nginx''' следующего содержания:
Создадим файл конфигурации '''nginx''' следующего содержания:


<source lang=""># cat /etc/nginx/sites-available.d/boot.conf
<syntaxhighlight lang="bash"># cat /etc/nginx/sites-available.d/boot.conf
server {
server {
         listen 192.168.15.1:80;
         listen 192.168.15.1:80;
Строка 614: Строка 613:


         access_log  /var/log/nginx/access.log;
         access_log  /var/log/nginx/access.log;
}</source>
}</syntaxhighlight>


Создадим каталог, доступ к которому будет предоставлять '''nginx''':
Создадим каталог, доступ к которому будет предоставлять '''nginx''':


<source lang=""># mkdir -p /var/www/html</source>
<syntaxhighlight lang="bash"># mkdir -p /var/www/html</syntaxhighlight>


Запустим службу '''nginx''' с созданным сайтом:
Запустим службу '''nginx''' с созданным сайтом:


<source lang=""># ln -sv /etc/nginx/sites-available.d/boot.conf /etc/nginx/sites-enabled.d/boot.conf
<syntaxhighlight lang="bash"># ln -sv /etc/nginx/sites-available.d/boot.conf /etc/nginx/sites-enabled.d/boot.conf
'/etc/nginx/sites-enabled.d/boot.conf' -> '/etc/nginx/sites-available.d/boot.conf'</source>
'/etc/nginx/sites-enabled.d/boot.conf' -> '/etc/nginx/sites-available.d/boot.conf'</syntaxhighlight>


<source lang=""># systemctl enable --now nginx.service</source>
<syntaxhighlight lang="bash"># systemctl enable --now nginx.service</syntaxhighlight>


Создадим линки, чтобы '''nginx''' смог предоставить доступ к загрузчику '''iPXE''' и смонтированному образу:
Создадим линки, чтобы '''nginx''' смог предоставить доступ к загрузчику '''iPXE''' и смонтированному образу:


<source lang=""># ln -sv /var/lib/tftpboot /var/www/html/boot
<syntaxhighlight lang="bash"># ln -sv /var/lib/tftpboot /var/www/html/boot
'/var/www/html/boot' -> '/var/lib/tftpboot'</source>
'/var/www/html/boot' -> '/var/lib/tftpboot'</syntaxhighlight>
<source lang=""># ln -sv /srv/img/ /var/www/html
<syntaxhighlight lang="bash"># ln -sv /srv/img/ /var/www/html
'/var/www/html/img' -> '/srv/img/'</source>
'/var/www/html/img' -> '/srv/img/'</syntaxhighlight>


=== Настройка nfs ===
=== Настройка nfs ===
Строка 638: Строка 637:
Добавляем каталог, в котором будет смонтирован образ, в '''/etc/exports''':
Добавляем каталог, в котором будет смонтирован образ, в '''/etc/exports''':


<source lang=""># echo "/srv/img 192.168.15.0/24(ro,insecure,no_subtree_check,no_root_squash,crossmnt)" >> /etc/exports</source>
<syntaxhighlight lang="bash"># echo "/srv/img 192.168.15.0/24(ro,insecure,no_subtree_check,no_root_squash,crossmnt)" >> /etc/exports</syntaxhighlight>


Опция '''crossmnt''' обязательна. Иначе NFS не сможет работать с '''loop''' устройством.
Опция '''crossmnt''' обязательна. Иначе NFS не сможет работать с '''loop''' устройством.


<source lang=""># systemctl enable --now nfs
<syntaxhighlight lang="bash"># systemctl enable --now nfs
</source>
</syntaxhighlight>




Строка 658: Строка 657:
Монтируем образ как '''loop''' устройство:
Монтируем образ как '''loop''' устройство:


<source lang=""># losetup -P -f --show /img/iso2stick.img
<syntaxhighlight lang="bash"># losetup -P -f --show /img/iso2stick.img
/dev/loop0
/dev/loop0
</source>
</syntaxhighlight>


<source lang="">
<syntaxhighlight lang="bash">
# ls -l /dev/loop0*
# ls -l /dev/loop0*
brw-rw---- 1 root disk  7, 0 ноя  7 14:09 /dev/loop0
brw-rw---- 1 root disk  7, 0 ноя  7 14:09 /dev/loop0
brw-rw---- 1 root disk 259, 0 ноя  7 14:09 /dev/loop0p1
brw-rw---- 1 root disk 259, 0 ноя  7 14:09 /dev/loop0p1
brw-rw---- 1 root disk 259, 1 ноя  7 14:09 /dev/loop0p2</source>
brw-rw---- 1 root disk 259, 1 ноя  7 14:09 /dev/loop0p2</syntaxhighlight>


В образе 2 раздела.
В образе 2 раздела.
Строка 673: Строка 672:
Монтируем '''loop0p2''' устройство с данными:
Монтируем '''loop0p2''' устройство с данными:


<source lang=""># mount /dev/loop0p2 /srv/img/</source>
<syntaxhighlight lang="bash"># mount /dev/loop0p2 /srv/img/</syntaxhighlight>


Содержимое раздела:
Содержимое раздела:


<source lang=""># ls /srv/img/
<syntaxhighlight lang="bash"># ls /srv/img/
AMDZ  autorun  boot  chroot.sh  esp.tgz  files  home.tgz  lost+found  META.tgz  rescue  root.tgz</source>
AMDZ  autorun  boot  chroot.sh  esp.tgz  files  home.tgz  lost+found  META.tgz  rescue  root.tgz</syntaxhighlight>


=== Подготовка iPXE ===
=== Подготовка iPXE ===
Строка 684: Строка 683:
Создаем скрипт запуска загрузки '''iPXE''' следующего содержания:
Создаем скрипт запуска загрузки '''iPXE''' следующего содержания:


<source lang=""># cat /var/lib/tftpboot/script.ipxe
<syntaxhighlight lang="bash"># cat /var/lib/tftpboot/script.ipxe
#!ipxe
#!ipxe


Строка 692: Строка 691:
imgargs vmlinuz initrd=full.cz fastboot live ramdisk_size=439569 stagename=rescue splash=0 showopts automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img tz=Europe/Moscow lang=ru_RU autorun=method:nfs,server:192.168.15.1,directory:/srv/img
imgargs vmlinuz initrd=full.cz fastboot live ramdisk_size=439569 stagename=rescue splash=0 showopts automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img tz=Europe/Moscow lang=ru_RU autorun=method:nfs,server:192.168.15.1,directory:/srv/img


boot</source>
boot</syntaxhighlight>


<code>automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img</code> - указано как '''iPXE''' должен загружать ОС по  сети;
<code>automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img</code> - указано как '''iPXE''' должен загружать ОС по  сети;

Версия от 13:15, 10 ноября 2022

Здесь описывается технология массового развёртывания дистрибутивов Альт в промышленных масштабах, а именно типовая процедура подготовки эталонного компьютера и образа загрузочного локально подключаемого носителя для клонирования. Такой носитель с эталонными образами мы называем "деплойной системой" (деплойным USB-стиком). Также здесь !!!СКОРО БУДЕТ!!! описан способ массового развёртывания ОС Альт по сети с заранее подготовленных эталонных образов либо с использованием подготовленного деплойного USB-стика, включая настройку сервера.

Создание деплойного USB-стика

Вкратце: любой пользователь ОС Альт может сделать резервную копию своей системы для последующего восстановления всего двумя командами: system-backup -- для снятия бэкапов и iso2stick -- для создания загрузочного носителя с этими образами. Описание утилиты iso2stick из пакета usermode-fs-tools находится в отдельной статье.

Системные требования

  • Целевой компьютер "заказчика", для которого делается деплойная система.
  • Мощный компьютер с достаточным местом на диске и аппаратной виртуализацией.
  • Желательно иметь большой объём памяти, чтобы работать с образами на TMPFS.
  • Бранч p8, но лучше p9, p10 или Сизиф на хостовой системе, на которой делаем USB-стик.
  • Установленные пакеты usermode-fs-tools, qemu-system-x86-core или qemu-kvm, qemu-img.
  • Для работы с UEFI-загрузкой сюда же надо заранее установить пакет edk2-ovmf.
  • Заранее скаченный образ спасательной системы ALT Rescue / x86_64.
  • Пакеты проприетарного ПО, которые мы собираемся включить в образ.
  • Триальные лицензии к проприетарному ПО, если таковые требуются.
  • "Боевые" лицензии к проприетарному ПО, если таковые требуются.

Общий план действий

  • Произвести ручную установку ОС Альт и другого ПО на целевой компьютер "заказчика".
  • Настроить в виртуальной среде эталонный компьютер с учётом выявленных на "железе" нюансов.
  • Загрузиться с ALT Rescue и снять с виртуалки образы файловых систем.
  • Переместить каталог с этими образами на свой компьютер, если это ещё не сделано.
  • Подготовить деплойный скрипт -- есть масса готовых примеров и ожидается альтернатива.
  • Объединить спасательную систему ALT Rescue с образами эталонного компьютера и деплойным скриптом.
  • Записать получившийся образ USB-стика на физический носитель (HDD или флэшку USB 3.0).
  • Проверить контрольные суммы методом обратного считывания с внешнего HDD или флэшки.
  • Проверить работу деплойной системы и целевого компьютера после процедуры развёртывания.
  • При наличии ошибок в системе развёртывания вернуться к шагу подготовки деплойного скрипта.

Предварительные условия

Необходимо заранее определить, с какими параметрами должна устанавливаться ОС Альт: логины и пароли пользователей, пароль root, ключи ssh, пожелания по разметке диска, требуется ли автоматический вход в графическую систему, пароль на загрузчик grub (если нужен), выбор компонентов ПО, в т.ч. из репозитория после установки, возможно какие-то другие требования.

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

  • ОС Альт допускает массовое развёртывание, не требует активации, при переносе на другое "железо" можно привязать ОС к этому новому железу.
  • Антивирус Касперского с агентом 10 и 11 версии допускает массовое развёртывание: в эталонном образе следует использовать файл ответов, триальную лицензию, подключение к Интернет, а на этапе развёртывания необходимо привязывать "боевую" лицензию к целевому "железу". Другая альтернатива: после установки пакетов вообще не выполнять донастройку, просто отключить службы Касперского и агента. В первом случае в целевую систему попадёт полностью готовый к работе антивирус, во втором случае в образ не попадёт база антивирусных сигнатур, требуется обратное включение служб, донастройка и активация (ручная либо централизованная с Kaspersky Security Center).
  • ViPNet PKI Client версий 1.3, 1.4 и 1.6 допускает массовое развёртывание: в эталонном образе следует использовать триальную лицензию и подключение к Интернет, а на этапе развёртывания необходимо привязывать "боевую" лицензию к целевому "железу".
  • Dallas Lock Linux версии 2.0 не допускает массовое развёртывание: в эталонный образ можно поместить инсталлятор со скриптом установки и лицензией, а устанавливать продукт следует после развёртывания на целевом "железе".
  • TrueConf клиент для Linux версий 7.x допускает массовое развёртывание, не требует активации, в настройках эталонного компьютера следует учитывать веб-камеру целевого "железа".
  • Настольные продукты МойОфис Стандартный допускают массовое развёртывание, не требуют активации, к "железу" не привязываются.

Черновая установка на целевой компьютер

Цель этой ручной установки: выяснить на "голом железе" все нюансы инсталляции и настройки ОС, прикладного ПО, определиться с более подходящими режимом загрузки (Legacy/UEFI) и видео-модулем xorg, работой "спящего" и "ждущего" режимов, проверить устанавливаемость и работу проприетарных программ с триальными лицензиями. При такой проверке можно дать себе волю порезвиться с домашним каталогом пользователя, запускать и тестировать тут можно любые приложения. Обратите внимание на название проводного сетевого интерфейса в /etc/net/ifaces -- вероятно, в виртуалке название интерфейса будет иным, так что это придётся учитывать.

Чистовая установка в виртуальной среде

Чистовая инсталляция ОС Альт и другого ПО может быть как ручной, так и полностью автоматической, скриптами можно автоматизировать все или часть операций. При такой установке нужно минимизировать запуск программ, выход в Интернет, если что-то тестируем, то не здесь и не сейчас. Почему лучше делать это в виртуальной среде, а не на физическом хосте?

  • Можно и на физическом хосте, но нужна гарантия, что образы эталонного компьютера не привязаны к нему.
  • Значительная экономия времени, если образы из виртуалки сохраняются прямо в оперативку хоста оператора.
  • Можно быстро создавать точки состояния системы (снэпшоты) и быстро к ним возвращаться, в случае необходимости.
  • Так будет намного проще автоматизировать очень многие процессы создания эталонных образов, некоторые операции приходится выполнять неоднократно (нужна воспроизводимость), у оператора может быть своя библиотека готовых наработок, которые можно повторно использовать.

Если в качестве среды виртуализации выступает PVE или что-то подобное, снятые с виртуалки образы потом придётся "перегонять" на машину оператора по сети. Если же использовать qemu локально, образы можно сохранять сразу на диск или в TMPFS хостовой системы. Устанавливать ОС в виртуалку лучше в том режиме загрузки, который будет использоваться на целевом "железе" при развёртывании. Если деплойная система должна быть универсальной, предпочтение следует отдавать режиму загрузки UEFI. В процессе установки нужно будет указать имя компьютера -- укажите тут "computername.нужный.вам.домен".

Подготовка среды для локальной установки ОС в qemu, режим загрузки BIOS:

$ GUEST="WS91bios"
$ MEDIA="$HOME/iso/alt-workstation-9.1-x86_64.iso"
$ RESCUE="$HOME/iso/regualar-rescue-latest-x86_64.iso"

$ cd ~/path/to/workdir/
$ qemu-img create -f qcow2 -o size=30G "$GUEST.img"

Разовый запуск инсталлятора ОС Альт в режиме загрузки BIOS:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$MEDIA" -boot d -no-reboot

Сразу после инсталляции виртуальная машина выключится. Не все указанные тут опции могут оказаться подходящими к вашей версии qemu, периодически интерфейс меняется, смотрите детали в документации.

Последующий запуск ОС в режиме загрузки BIOS:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew

Подготовка среды для локальной установки ОС в qemu, режим загрузки UEFI:

$ GUEST="WS91uefi"
$ MEDIA="$HOME/iso/alt-workstation-9.1-x86_64.iso"
$ RESCUE="$HOME/iso/regualar-rescue-latest-x86_64.iso"

$ cd ~/path/to/workdir/
$ cp -Lf /usr/share/OVMF/OVMF_CODE.fd bios.bin
$ cp -Lf /usr/share/OVMF/OVMF_VARS.fd efivars.bin
$ qemu-img create -f qcow2 -o size=30G "$GUEST.img"

Разовый запуск инсталлятора ОС Альт в режиме загрузки UEFI:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$MEDIA" -boot menu=on -no-reboot

В процессе установки на вопрос о том, куда ставить загрузчик, нужно выбрать либо "EFI (сначала очистить NVRAM)", при наличии такого варианта, либо просто "EFI (рекомендуемый)". Сразу после инсталляции виртуальная машина выключится. Не все указанные тут опции могут оказаться подходящими к вашей версии qemu, периодически интерфейс меняется, смотрите детали в документации.

Последующий запуск ОС в режиме загрузки UEFI:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew

При запуске виртуалок с указанными опциями, текущий каталог хоста становится "точкой обмена данными" между хостом и гостевой системой, кроме того, с хостовой системы можно зайти в гостевую по ssh такой командой:

$ ssh -p 5555 -o NoHostAuthenticationForLocalhost=yes user@localhost

где user -- логин обычного пользователя в гостевой системе. Это может оказаться полезным и для автоматизаци, и чтобы копировать в консоль через буфер обмена, а не набирать полностью команды в гостевой системе. Для монтирования общего каталога выполняем в консоли гостевой системы:

$ su-
# mkdir /tmp/host
# mount -t 9p host /tmp/host

Теперь в каталоге /tmp/host гостевой системы будет то же, что и в текущем каталоге хостовой системы.

Обычно сразу после установки систему и ядро обновляют до того, как ставить что-то ещё:

$ su-
# apt-get update
# apt-get dist-upgarde
# update-kernel
# reboot

$ su-
# remove-old-kernels
# apt-get autoremove
# apt-get clean

Теперь можно ставить другие пакеты, проприетарное ПО, настраивать систему и среду пользователя. При настройке системы уделите внимание двум файлам: /etc/fstab и /etc/sysconfig/grub2 -- в виртуалке жёсткий диск называется /dev/sda, а в этих двух файлах прописаны UUID'ы. При развёртывании на целевое "железо" такая система не загрузится, если не восстановить те же UUID'ы, либо если сразу на этапе настройки не поменять эти UUID'ы на имена дисков и разделов, в чём может помочь команда lsblk -f.

Если уже известно, что на целевом "железе" не работает "ждущий" и/или "спящий" режим с имеющимся ядром, ядерным модулем drm и видео-модулем xorg, если это никак "не лечится", просто отключите кнопки в интерфейсе для соответствующих режимов сна:

# Отключаем "ждущий" режим
systemctl mask suspend.target

# Отключаем "спящий" режим
systemctl mask hibernate.target

Когда машина окончательно настроена, убираем с неё явно лишние файлы и временно записанные дистрибутивы, в последнюю очередь меняем пароли root и пользователя на реальные, под конец выполняем:

$ su-
# apt-get autoremove
# apt-get clean
# init 0

После этого можно сделать промежуточный снэпшот на случай необходимости в донастройке.

Снятие образов файловых систем с эталонного компьютера

Для этой операции потребуется заранее скаченный ISO-образ ALT Rescue с утилитой system-backup и поддержкой rescue-launcher. Он же будет использоваться для создания финального образа USB-стика (следующий раздел). Следует отметить, что не все установочные диски ОС Альт удовлетворяют этим требованиям, даже если содержат файл второй стадии загрузки rescue, но свежие регулярные сборки ALT Rescue данным требованиям удовлетворяют.

Загрузка с ALT Rescue на виртуалке qemu в режиме BIOS:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$RESCUE" -boot d

Загрузка с ALT Rescue на виртуалке qemu в режиме UEFI:

$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$RESCUE" -boot menu=on

В консоли загрузившейся виртуалки выполняем:

# mkdir /mnt/backup
# mount -t 9p host /mnt/backup
# system-backup -A sha256 -b /mnt/backup -Rc
# init 0

В результате этой долгоиграющей операции в текущем каталоге хоста появится подкаталог с сегодняшней датой, в котором будут находиться образы эталонного компьютера, перед их снятием система будёт жёстко почищена так, что пользоваться ей уже будет невозможно, единственный сетевой интерфейс будет переименован в "eth0". После этого можно смело удалить из текущего каталога другие файлы, связанные с этой виртуалкой (WS91bios.img либо WS91uefi.img + bios.img + efivars.img).

Если вы работаете с PVE или другой не локальной системой виртуализации, либо если образы снимаются с реального "железа", придётся поступить иначе. К эталонной машине подключается внешний жёсткий диск (в виртуальной среде -- второй виртуальный диск), при необходимости, форматируется. Образы будут сниматься на этот второй диск, а затем копироваться на компьютер оператора. Загружаем эталонный компьютер с ALT Rescue, затем:

# Смотрим, какие диски подключены
lsblk -f

# Если нужно, создаём единственный раздел на втором диске и форматируем его
fdisk /dev/sdb
mkfs.ext4 -q -j -L BACKUP /dev/sdb1

# Куда будем сохранять образы
mkdir /mnt/backup
mount /dev/sdb1 /mnt/backup

# Жёстко "чистим" и бэкапим систему
system-backup -A sha256 -b /mnt/backup -Rc

# Поднимаем сеть и ssh
ip l
dhcpcd -i eth0
echo "PermitRootLogin yes" >> /etc/openssh/sshd_config
ssh-keygen -A
service sshd start
ip a

# Подключаемся с хоста к этой машине и забираем с неё образы к себе
# $ scp -r root@<IP-ADDRESS>:/mnt/backup/$(date +%Y-%m-%d) ./

# Выключаем виртуалку
init 0

Будьте внимательны с именами дисков и разделов, в случае отличий. Перегонять образы по сети можно и другими способами. Например, можно сначала поднять сеть в ALT Rescue, смонировать сетевой ресурс cifs, и бэкапить эталонный компьютер сразу на SAMBA-сервер.

Подготовка деплойного скрипта

Теперь в каталог с образами эталонного компьютера нужно сложить скрипт autorun, примеры можно найти здесь. Необязательно делать его исполняемым. В этом скрипте следует учесть, что на эталонном компьютере диск назывался /dev/sda, и если на целевом "железе" диск называется иначе, то сразу после восстановления из образов следует переименовать диск и разделы в соответствующих файлах (/etc/fstab и /etc/sysconfig/grub2). В скрипте необходимо восстанавливать UUID'ы при создании разделов, если это не было учтено в настройке эталонного компьютера. Также в скрипте нужно переименовать проводной интерфейс /etc/net/ifaces/eth0 в то название, что было определено на этапе ручной установки на "голое железо", если имя отличается от "eth0" и если этот каталог не был переименован в эталонном компьютере перед снятием с него образов.

Создание финального образа деплойной системы

# Переименуем каталог с образами и деплойным скриптом
$ mv $(date +%Y-%m-%d) sys-part

# Создадим ещё один каталог
$ mkdir efi-part

# Поместим в этот каталог файл HpSetup.txt, полученный путём сохранения настроек BIOS на флэшку с ФС FAT

# Создадим образ USB-стика с универсальной загрузкой grub
$ iso2stick -qsd -D . -- "$RESCUE" .

# Если нужен USB-стик только с BIOS-загрузкой
$ iso2stick -qb -D . -- "$RESCUE" .

# Если нужен USB-стик только с 64-бит UEFI-загрузкой и Secure Boot
$ iso2stick -qus -D . -- "$RESCUE" .

# В простом случае все команды выше можно заменить одной (на примере BIOS-загрузки)
$ iso2stick -qb -D ./$(date +%Y-%m-%d) -- "$RESCUE" .

Запись финального образа на физический носитель

Это единственная операция, для которой требуются полномочия root на хосте оператора. Нужно быть очень внимательным с именами дисков, чтобы случайно не остаться без рабочей системы. Вставляем USB-флэшку, на которой нет ценных данных, – её сейчас будем перезаписывать. Ещё лучше использовать для тех же целей внешний USB 3.0 HDD. Логинимся в рутовую консоль и отмонтируем флэшку, предварительно выяснив её название:

$ su-
# mount | tail
...
/dev/sdb1 on /media/MYDATA type vfat (rw,...)

Обычно последняя строка, самое первое поле (/dev/sdb1 в данном примере). Именно это устройство и нужно отмонтировать. Однако на флэшке может быть несколько разделов и отмонтировать нужно все, поэтому надёжнее сделать так:

# umount /dev/sdb[1-9]*

Здесь и далее по тексту наша флэшка называется /dev/sdb, у вас это может называться иначе, так что будьте внимательны! Записываем созданный образ на USB-флэшку или USB HDD:

# dd if=/path/to/usbstick.img of=/dev/sdb bs=1M iflag=fullblock oflag=direct status=progress; sync

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

# dd if=/dev/sdb bs=1M count=<ЧИСЛО> iflag=fullblock status=none |sha256sum
# dd if=/dev/sdb bs=1M count=<ЧИСЛО> iflag=fullblock status=none |md5sum

где <ЧИСЛО> -- число целых блоков, записанных предыдущей командой. Контрольные суммы должны совпасть с теми, что записаны в файлах checksum.256 и checksum.MD5, лежащих рядом с образом USB-стика.

Заключительные шаги

Входим в BIOS HP Setup и восстанавливаем настройки BIOS из файла HpSetup.txt, записанного на флэшку. Перезагружаемся с этой же флэшки или внешнего HDD на целевом компьютере, используя boot-меню BIOS. В загрузочном меню grub выбираем второй пункт "Rescue Deploy" и засекаем время. Через несколько минут или секунд компьютер будет восстановлен и выключен. Можно выдёргивать внешний USB-диск, включать компьютер и проверять, всё ли правильно.

OEM Setup

...

Настройка сервера сетевой загрузки

Общая схема сетевой установки

ПК, на котором будет осуществляться установка ОС, должен поддерживать загрузку по сети.

Если ПК умеет только PXE (большинство сетевых карт имеет именно прошивку PXE) и загрузка происходит в Legacy, то сначала загружается undionly.kpxe по tftp и ему передается управление:

(dhcpd.conf)

...
elsif option arch = 00:00 {           # Legacy BIOS
      filename "undionly.kpxe";
}
...

undionly.kpxe необходим для того чтобы перейти (chainloading) от загрузчика PXE к загрузчику iPXE, который имеет гораздо больше возможностей по сетевой загрузке операционных систем (https://ipxe.org/howto/dhcpd#pxe_chainloading).

Когда осуществлен переход на iPXE, то он в свою очередь получает свои настройки от DHCP сервера. А именно то, что ему необходимо выполнить скрипт script.ipxe, который находится на HTTP сервере:

(dhcpd.conf)

...
if exists user-class and option user-class = "iPXE" {
                filename "http://192.168.15.1/boot/script.ipxe";
        }
...

Содержимое скрипта script.ipxe:

#!ipxe

kernel http://192.168.15.1/boot/vmlinuz
initrd http://192.168.15.1/boot/full.cz

imgargs vmlinuz initrd=full.cz fastboot live ramdisk_size=439569 stagename=rescue splash=0 showopts automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img tz=Europe/Moscow lang=ru_RU autorun=method:nfs,server:192.168.15.1,directory:/srv/img

boot

Выполняя скрипт script.ipxe сетевой загрузчик получает ядро, initrd и передает им опции загрузки ОС:

automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img - директива указывает как будет загружаться ОС: по сетевому протоколу NFS, ресурс - /srv/img; ip адрес будет получен автоматически (dhcp). Подробнее Installer/common/propagator.

autorun=method:nfs,server:192.168.15.1,directory:/srv/img - директива указывает откуда rescue-launcher запускает скрипт развертывания autorun. Подробнее Rescue/Launcher.

Описание конфигурации

В качестве сервера сетевой загрузки используется Альт Сервер 10. При установке ОС необходимо выбрать профиль: Минимальная установка.

IP адрес сервера: 192.168.15.1/24

  • /var/lib/tftpboot - в этом каталоге лежат загрузочные файлы для первоначальной загрузки по PXE и дальнейшего перехода на iPXE;
  • /img - в этом каталоге располагаются образы;
  • /srv/img - в этот каталог монтируется образ как loop устройство.

Подготовка к настройке

Обновление до актуального состояния:

$ su -
# apt-get update
# apt-get dist-upgrade
# update-kernel
# apt-get clean
# reboot

Отключаем и останавливаем следующие службы:

# systemctl disable --now smartd nscd nslcd

Создадим необходимые каталоги:

# mkdir /img
# mkdir /srv/img

Установка пакетов для сервера сетевой загрузки

# apt-get install ipxe-bootimgs
# apt-get install dhcp-server nginx tftp tftp-server-xinetd nfs-utils nfs-server

Настройка сети сервера

enp6s19 - сетевой интерфейс для сетевой загрузки

Создаем каталог для настройки сетевого интерфейса (если его еще нет):

# mkdir /etc/net/ifaces/enp6s19

Создаем конфигурационный файл интерфейса enp6s19:

# cat /etc/net/ifaces/enp6s19/options
TYPE=eth
CONFIG_WIRELESS=no
BOOTPROTO=static
SYSTEMD_BOOTPROTO=static
CONFIG_IPV4=yes
DISABLED=no
NM_CONTROLLED=no
SYSTEMD_CONTROLLED=no
# cat /etc/net/ifaces/enp6s19/ipv4address
192.168.15.1/24

"Поднимаем" интерфейс, если он в состоянии down:

# ifup enp6s19

Итоговые настройки сети:

# ip addr show enp6s19
3: enp6s19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 6e:f6:17:c7:21:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.15.1/24 brd 192.168.15.255 scope global enp6s19
       valid_lft forever preferred_lft forever
    inet6 fe80::6cf6:17ff:fec7:21a6/64 scope link 
       valid_lft forever preferred_lft forever

Настройка DHCP сервера

# cat /etc/dhcp/dhcpd.conf
authoritative;
ddns-update-style none;
ddns-domainname "test.alt";

option space altlinux;
option altlinux.keydata code 2 = string;
vendor-option-space altlinux;

option arch code 93 = unsigned integer 16;

option space ipxe;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;

subnet 192.168.15.0 netmask 255.255.255.0 {
        option nis-domain               "test.alt";
        option domain-name              "test.alt";
        option broadcast-address        192.168.15.255;
        option subnet-mask              255.255.255.0;

        default-lease-time              1800;
        max-lease-time                  3600;

        option ipxe.no-pxedhcp          1;

        if exists user-class and option user-class = "iPXE" {
                filename "http://192.168.15.1/boot/script.ipxe";
        } elsif option arch = encode-int(16, 16) {
                option vendor-class-identifier "HTTPClient";
                filename "http://192.168.15.1/boot/ipxe-x86_64.efi";
        } elsif substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
                next-server             192.168.15.1;

                if option arch = 00:06 {                # EFI IA32
                        filename "ipxe-i386.efi";
                } elsif option arch = 00:07 {           # EFI Byte Code
                        filename "ipxe-x86_64.efi";
                } elsif option arch = 00:09 {           # EFI x86-64
                        filename "ipxe-x86_64.efi";
                } elsif option arch = 00:00 {           # Legacy BIOS
                        filename "undionly.kpxe";
                }
        }

        pool {
                range 192.168.15.50 192.168.15.250;
        }
}

Определяем для службы dhcpd интерфейс, на котором она будет работать:

# cat /etc/sysconfig/dhcpd

# The following variables are recognized:
DHCPDARGS=enp6s19
# systemctl enable --now dhcpd

Убедимся что служба dhcpd запущена без ошибок:

# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
     Loaded: loaded (/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2022-11-07 13:26:12 UTC; 6s ago
       Docs: man:dhcpd(8)
             man:dhcpd.conf(5)
    Process: 4730 ExecStartPre=/etc/chroot.d/dhcpd.all (code=exited, status=0/SUCCESS)
   Main PID: 4830 (dhcpd)
      Tasks: 1 (limit: 4658)
     Memory: 7.3M
        CPU: 166ms
     CGroup: /system.slice/dhcpd.service
             └─ 4830 /usr/sbin/dhcpd -4 -f --no-pid enp6s19

ноя 07 13:26:12 host-215 dhcpd[4830]: All rights reserved.
ноя 07 13:26:12 host-215 dhcpd[4830]: For info, please visit https://www.isc.org/software/dhcp/
ноя 07 13:26:12 host-215 dhcpd[4830]: Config file: /etc/dhcp/dhcpd.conf
ноя 07 13:26:12 host-215 dhcpd[4830]: Database file: /state/dhcpd.leases
ноя 07 13:26:12 host-215 dhcpd[4830]: PID file: /var/run/dhcpd.pid
ноя 07 13:26:12 host-215 dhcpd[4830]: Listening on LPF/enp6s19/a2:8c:4e:5a:c4:8e/192.168.15.0/24
ноя 07 13:26:12 host-215 dhcpd[4830]: Sending on   LPF/enp6s19/a2:8c:4e:5a:c4:8e/192.168.15.0/24
ноя 07 13:26:12 host-215 dhcpd[4830]: Sending on   Socket/fallback/fallback-net
ноя 07 13:26:12 host-215 dhcpd[4830]: Wrote 0 leases to leases file.
ноя 07 13:26:12 host-215 dhcpd[4830]: Server starting service.

Настройка tftp и xinetd

/var/lib/tftpboot - корневой каталог tftp. Здесь будет распологаться загрузчик iPXE, которому PXE передаст управление.

Копируем необходимые файлы (iPXE) для первоначальной загрузки по TFTP:

# cp -v /usr/share/ipxe/{ipxe-i386.efi,ipxe-x86_64.efi,undionly.kpxe} /var/lib/tftpboot/
'/usr/share/ipxe/ipxe-i386.efi' -> '/var/lib/tftpboot/ipxe-i386.efi'
'/usr/share/ipxe/ipxe-x86_64.efi' -> '/var/lib/tftpboot/ipxe-x86_64.efi'
'/usr/share/ipxe/undionly.kpxe' -> '/var/lib/tftpboot/undionly.kpxe'

Сконфигурируем xinetd.

# cat /etc/xinetd.d/tftp
service tftp
{
	disable		= no
	socket_type	= dgram
	protocol	= udp
	wait		= yes
	user		= root
	server		= /usr/sbin/in.tftpd
	server_args	= -4 -a 192.168.15.1 -u tftp -s /var/lib/tftpboot -m /etc/tftpd.map
}
# cat /etc/tftpd.map

# Convert backslashes to slashes
rg \\ /
# cat /etc/xinetd.conf
defaults
{
	log_type = SYSLOG authpriv info
	log_on_success = PID HOST DURATION
	log_on_failure = HOST
	instances = 100
	per_source = 5
#	only_from = 127.0.0.1
}

includedir /etc/xinetd.d
# cat /etc/sysconfig/xinetd
EXTRAOPTIONS='-remlock'
# systemctl start xinetd.service

Настройка nginx

Создадим файл конфигурации nginx следующего содержания:

# cat /etc/nginx/sites-available.d/boot.conf
server {
        listen 192.168.15.1:80;
        server_name 192.168.15.1;

        location / {
            root /var/www/html;
            autoindex on;
        }

        access_log  /var/log/nginx/access.log;
}

Создадим каталог, доступ к которому будет предоставлять nginx:

# mkdir -p /var/www/html

Запустим службу nginx с созданным сайтом:

# ln -sv /etc/nginx/sites-available.d/boot.conf /etc/nginx/sites-enabled.d/boot.conf
'/etc/nginx/sites-enabled.d/boot.conf' -> '/etc/nginx/sites-available.d/boot.conf'
# systemctl enable --now nginx.service

Создадим линки, чтобы nginx смог предоставить доступ к загрузчику iPXE и смонтированному образу:

# ln -sv /var/lib/tftpboot /var/www/html/boot
'/var/www/html/boot' -> '/var/lib/tftpboot'
# ln -sv /srv/img/ /var/www/html
'/var/www/html/img' -> '/srv/img/'

Настройка nfs

Добавляем каталог, в котором будет смонтирован образ, в /etc/exports:

# echo "/srv/img 192.168.15.0/24(ro,insecure,no_subtree_check,no_root_squash,crossmnt)" >> /etc/exports

Опция crossmnt обязательна. Иначе NFS не сможет работать с loop устройством.

# systemctl enable --now nfs


Массовое развёртывание по сети с готового USB-стика

К этому моменту должен быть настроен сервер сетевой загрузки - Rescue/Deploy#Настройка_сервера_сетевой_загрузки.

Также есть готовый USB-стик (iso2stick.img).

Монтирование образа для сетевой загрузки

Размещаем образ в /img.

Монтируем образ как loop устройство:

# losetup -P -f --show /img/iso2stick.img
/dev/loop0
# ls -l /dev/loop0*
brw-rw---- 1 root disk   7, 0 ноя  7 14:09 /dev/loop0
brw-rw---- 1 root disk 259, 0 ноя  7 14:09 /dev/loop0p1
brw-rw---- 1 root disk 259, 1 ноя  7 14:09 /dev/loop0p2

В образе 2 раздела. Как правило первый раздел (loop0p1) это EFI, а во втором (loop0p2) находятся данные.

Монтируем loop0p2 устройство с данными:

# mount /dev/loop0p2 /srv/img/

Содержимое раздела:

# ls /srv/img/
AMDZ  autorun  boot  chroot.sh  esp.tgz  files  home.tgz  lost+found  META.tgz  rescue  root.tgz

Подготовка iPXE

Создаем скрипт запуска загрузки iPXE следующего содержания:

# cat /var/lib/tftpboot/script.ipxe
#!ipxe

kernel http://192.168.15.1/img/boot/vmlinuz
initrd http://192.168.15.1/img/boot/full.cz

imgargs vmlinuz initrd=full.cz fastboot live ramdisk_size=439569 stagename=rescue splash=0 showopts automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img tz=Europe/Moscow lang=ru_RU autorun=method:nfs,server:192.168.15.1,directory:/srv/img

boot

automatic=method:nfs,network:dhcp,server:192.168.15.1,directory:/srv/img - указано как iPXE должен загружать ОС по сети;

autorun=method:nfs,server:192.168.15.1,directory:/srv/img - указано откуда rescue-launcher запускает скрипт развертывания - autorun.


После этого подключаем ПК, на котором должна развертываться ОС, к сети. Выбираем режим загрузки по сети - PXE.

Массовое развёртывание по сети с эталонных образов

...

Полезные ссылки