README.md

Подключение компьютерного класса к существующему контроллеру Альт Домен при помощи микрокомпьютера Repka Pi

Дано

  • Класс с ~20 рабочими станциями, поддерживающими загрузку с помощью UEFI и PXE (CSM выключен).
  • Рабочие станции находятся в общем сетевом L2-сегменте.
  • DHCP-сервер отсутствует, сеть на рабочих станциях настраивается статически.
  • Существует контроллер Альт Домен.
  • Имеются: Repka Pi 4 и microSD ≥ 8 ГБ, рабочая станция под управлением ОС Альт p11 (для подготовки микрокомпьютера).

Задача

  • Установить Альт Образование 11 на рабочие станции автоматически, с минимальным присутствием техника.
  • Использовать заранее подготовленный образ ОС Альт p11 для установки (описыватся в секции stage2/ этого README.md).
  • Автоматически присоединить рабочие станции к контроллеру домена.

Используемый набор репозитория

├── repka
│   ├── altp11-repka-base.sh
│   ├── altp11-repka-ipxe.yml
│   ├── dhcpd.conf
│   ├── ipxe.sh
├── stage1
│   ├── init
│   ├── make-initramfs.sh
│   ├── netinfo
└── stage2
    └── init-stage2.sh

Подготовка микрокомпьютера

repka/

altp11-repka-base.sh

Скрипт для ОС Альт p11, позволяющий автоматически установить на microSD систему ОС Альт p11 aarch64 (для Repka Pi 4). Результат работы скрипта: минимально настроенная microSD для Repka Pi 4 с доступом через UART, OpenSSH и Ansible.

Обязательные аргументы запуска:

-d путь_до_устройства_microSD
-f путь_до_файла_публичного_ключа_OpenSSH

Стоит отметить, что в установленной системе используется ядро производителя платы от пакета kernel-image-repka4, а не kernel-image-6.12. Ядро стандартной поставки репозитория ОС Альт p11 aarch64 (kernel-image-6.12) не имеет необходимых программных изменений для работы PCI-E контроллера на плате Repka Pi 4.

Repka Pi 4 основывается на SoC от Allwinner H6, об этом свидетельствуют используемые файлы DTB (напр. dtb/allwinner/sun50i-h6-repka-pi4-optimal.dtb) на microSD карте под /boot, и сообщения вида sun50i-h6 в dmesg ядра при загрузке.

На январь 2026, Repka Pi 4 может загрузиться и со стандартным (kernel-image-6.12) ядром, но в таком случае не будут работать, как минимум, eMMC и Ethernet. Дальнейшая проверка показала, что стандартное ядро не может работать с PCI-E контроллером платы (см. “Allwinner H6 has a quirky PCIe controller that doesn’t map the PCIe address space properly” по ссылке), а Ethernet платы зависит от работы драйвера PHY stmmac, работа которого на плате зависит от драйвера sunxi-pcie (в ядре производителя).

На данный момент, судя по вики linux-sunxi.org, попытки апстриминга драйвера PCI-E для Allwinner H6 нет.

altp11-repka-ipxe.yml

Файл Ansible playbook, настраивающий ОС Альт p11 на Repka Pi 4 до состояния iPXE установщика (stage1) для рабочих станций.

На Repka Pi 4 до применения этого playbook работают:

  • DHCP-клиент
  • OpenSSH-сервер
  • Пользователь root с вшитым ключом доступа из -f altp11-repka-base.sh

Для пуша playbook используется рабочая станция с ОС Альт p11 и пакетом ansible из репозитория 11 платформы:

$ ansible-playbook --key-file id_ed25519 -i 10.0.0.3, altp11-repka-ipxe.yml

Важно: До пуша playbook публичный ключ Repka Pi 4 должен быть доверенным на рабочей станции, запускающей ansible-playbook. Для этого можно либо войти по SSH на Repka Pi 4, либо использовать переменную окружения ANSIBLE_HOST_KEY_CHECKING=False

Важно: В директории repka/ должны присутствовать файлы stage1: vmlinuz, initramfs.img.zst, netinfo, они автоматически будут присутствовать после сборки stage1, описываемой далее.

dhcpd.conf

Файл конфигурации ISC DHCPD для Repka Pi 4 для работы DHCP и TFTP сервисов, необходимых для работы сетевой PXE загрузки на рабочих станциях, переходе из PXE в iPXE.

ipxe.sh

Файл сценария iPXE, позволяющий iPXE загрузить по HTTP (надежнее чем TFTP) stage1 установщика в оперативную память (ядро + initramfs) и передать им управление.

stage1/

init

Скрипт, реализующий минимальную логику для подготовке рабочей станции к сетевой установке: монтирует необходимые виртуальные файловые системы /dev, /proc, /sys, /run, /tmp, efivarfs (позже для автоматической смены приоритета загрузки загрузчиком GRUB в stage2 далее), запускает udevd (что подгружает модули ядра устройств), проверяет наличие диска для установки (переменная INSTALL_DISK) (в случае отсутствия диска открывает Bash для оценки ситуации), загружает с Repka Pi файл netinfo (настройки сети по MAC адресу) и настраивает сеть.

После настройки сети stage1 предлагает технику переключить Ethernet кабель рабочей станции в общий сетевой сегмент, после чего установщик скачает следующую степень установки stage2 (описывается позже) уже из общей сети и передаст управление ей.

Настроенная сеть также используется для выставления (достаточно точного) времени через HTTP-заголовок DATE (см. DATEURL в init) (NTP может быть недоступен, корректная дата может быть необходима для дальнейшей установки, в т.ч. когда установочный образ может находится в Интернете и доступен по https://).

make-initramfs.sh

Скрипт, создающий stage1 из init и загрузочное окружение установщика из текущего актуального состояния 11 платформы Альт. Копирует полученные vmlinuz (ядро), initramfs.img.zst (загрузочное окружение), netinfo (перечисление сетевых настроек по MAC адресу) в директорию repka/ для дальнейшего пуша через ansible-playbook на Repka Pi. Написан и работает для ОС Альт p11.

netinfo

Одна рабочая станция — одна строка. Перечисление:

MAC IPv4/CIDR IPv4-шлюз IPv4-NS имя_компьютера
MAC IPv4/CIDR IPv4-шлюз IPv4-NS имя_компьютера_2
...

stage2/

init-stage2.sh

Основная логика установщика. Здесь системный администратор может поменять логику разметки диска, использовать более продвинутые сценарии установки, и т.п. Логика использует UUID разделов для надёжности при изменении конфигурации дисков, и ещё использует discard для твердотельных носителей (в т.ч. для swap раздела), что облегчает wear leveling твердотельным носителям и, в теории, должно привести к меньшему износу носителей.

Для установки используется образ alt.tar.zst (который находится вне Repka Pi см. export STAGE2URL в stage1/init), который из себя представляет сжатый tar-архив уже установленной ОС Альт p11. Для подготовки архива можно просто установить весь нужный перечень ПО в виртуальную машину, выключить виртуальную машину, примонтировать образ (vm.img это qemu raw образ диска виртуальной машины) через:

# udisksctl loop-setup -r -f vm.img
# mount /dev/loop0p2 /mnt
# tar -C /mnt --xattrs --xattrs-include='*' --acls --preserve-permissions --numeric-owner --exclude=./lost+found -cpf - . | zstd -T0 -9 -o /tmp/alt.tar.zst

… и забрать полученный alt.tar.zst.

Дополнительно, stage2 настраивает сеть в распакованном образе и добавляет одноразовый systemd unit, который включает рабочую станцию после первой загрузки в домен, затем юнит удалит себя после присоединения рабочей станции к домену.

В конце работы stage2 устанавливается загрузчик (протестирована только актуальная UEFI загрузка), что приводит к добавлению EFI boot entry для ОС Альт p11 и автоматическая установка приоритета загрузки №1 на ОС Альт p11 (т.к. примонтировали раннее efivarfs).

Наконец, размонтирование носителей, синхронизация кэша, быстрая перезагрузка через sysrq-trigger, загрузка в ОС Альт p11 и автоматическое присоединение к домену, перезагрузка, и рабочая станция в домене готова.

Замечания

Перенос с microSD на eMMC, как описывает вики Альта вместе с подключенным UART к Repka Pi 4 и отсутствием microSD в Repka Pi 4, может привести к тому, что Repka Pi 4 не сможет загружаться до тех пор, пока не будет введена команда “boot” для u-boot через UART (отсутствие microSD вызывает ошибку в u-boot, а наличие подключенного UART приводит к ожиданию интерактивного ввода?).

CSM лучше выключить, т.к. некоторые материнские платы могут загрузиться в UEFI режиме через PXE только в том случае, если CSM был выключен.

Описание
Конвейеры
0 успешных
0 с ошибкой
Разработчики