Подключение компьютерного класса к существующему контроллеру Альт Домен при помощи микрокомпьютера 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 был выключен.