Files
zuevav d8dee07213 feat(iso): образ Bridge&Join на основе Debian 13 netinst
- deploy/iso/build-iso.sh: пересборка официального netinst (xorriso, загрузочные записи
  BIOS и UEFI сохраняются), пункт по умолчанию «Установить Bridge&Join», текстовый установщик
- preseed.cfg: русская локаль, Москва, DHCP, SSH и пакеты для bj; спрашиваются только
  пароли, диск и подтверждение стирания
- bj-firstboot: при первой загрузке на экране сервера спрашивает ключ продукта и запускает
  bj-installer; адрес первичной настройки и код остаются на экране входа

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 00:48:56 +03:00

74 lines
3.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Сборка образа ISO Bridge&Join на основе официального Debian 13 netinst.
#
# deploy/iso/build-iso.sh <debian-13.x-amd64-netinst.iso> <bj-installer> <версия> [канал] [выходной.iso]
#
# В образ добавляются: файл ответов установщику (preseed.cfg), bj-installer и служба первой загрузки.
# Загрузочное меню BIOS (isolinux) и UEFI (grub) по умолчанию запускает установку с этими ответами.
# Загрузочные записи исходного образа сохраняются (xorriso -boot_image any replay).
# Нужен xorriso. Проверка исходного образа — по SHA256SUMS с cdimage.debian.org.
set -eu
SRC=${1:?исходный debian-13.x-amd64-netinst.iso}
INSTALLER=${2:?файл bj-installer}
VERSION=${3:?версия образа, например 2026.10.1}
CHANNEL=${4:-stable}
OUT=${5:-bj-debian13-$VERSION.iso}
HERE=$(cd "$(dirname "$0")" && pwd)
command -v xorriso >/dev/null || { echo "нужен xorriso: apt-get install xorriso"; exit 1; }
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
mkdir -p "$WORK/bj" "$WORK/preseed" "$WORK/isolinux" "$WORK/grub"
cp "$HERE/preseed.cfg" "$WORK/preseed/bj.cfg"
install -m 0755 "$INSTALLER" "$WORK/bj/bj-installer"
install -m 0755 "$HERE/bj-firstboot" "$WORK/bj/bj-firstboot"
cp "$HERE/bj-firstboot.service" "$WORK/bj/bj-firstboot.service"
echo "$CHANNEL" > "$WORK/bj/channel"
echo "$VERSION" > "$WORK/bj/version"
BOOT="auto=true priority=high preseed/file=/cdrom/preseed/bj.cfg language=ru country=RU locale=ru_RU.UTF-8 keyboard-configuration/xkb-keymap=ru"
# BIOS: пункт по умолчанию в isolinux
xorriso -osirrox on -indev "$SRC" -extract /isolinux/txt.cfg "$WORK/isolinux/txt.orig" >/dev/null 2>&1
KERNEL=$(awk '/^\s*kernel/{print $2; exit}' "$WORK/isolinux/txt.orig")
INITRD=$(grep -o 'initrd=[^ ]*' "$WORK/isolinux/txt.orig" | head -1 | cut -d= -f2)
{
echo "default bj"
echo "label bj"
echo " menu label ^Установить Bridge&Join $VERSION (Debian 13)"
echo " menu default"
echo " kernel $KERNEL"
echo " append vga=788 initrd=$INITRD $BOOT --- quiet"
sed '/menu default/d;/^default /d' "$WORK/isolinux/txt.orig"
} > "$WORK/isolinux/txt.cfg"
xorriso -osirrox on -indev "$SRC" -extract /isolinux/isolinux.cfg "$WORK/isolinux/isolinux.cfg" >/dev/null 2>&1
sed -i 's/^timeout .*/timeout 100/; s/^prompt .*/prompt 0/' "$WORK/isolinux/isolinux.cfg"
grep -q '^timeout' "$WORK/isolinux/isolinux.cfg" || echo "timeout 100" >> "$WORK/isolinux/isolinux.cfg"
# UEFI: первый пункт в grub
xorriso -osirrox on -indev "$SRC" -extract /boot/grub/grub.cfg "$WORK/grub/grub.orig" >/dev/null 2>&1
# текстовый установщик (без gtk), как в BIOS: установка идёт без графической среды
LINUX=$(awk '/^\s*linux\s/ && $2 !~ /gtk/ {print $2; exit}' "$WORK/grub/grub.orig")
INITRDG=$(awk '/^\s*initrd\s/ && $2 !~ /gtk/ {print $2; exit}' "$WORK/grub/grub.orig")
{
echo "set default=0"
echo "set timeout=10"
echo "menuentry --hotkey=i 'Установить Bridge&Join $VERSION (Debian 13)' {"
echo " set background_color=black"
echo " linux $LINUX vga=788 $BOOT --- quiet"
echo " initrd $INITRDG"
echo "}"
sed '/^set default/d;/^set timeout/d' "$WORK/grub/grub.orig"
} > "$WORK/grub/grub.cfg"
rm -f "$OUT"
xorriso -indev "$SRC" -outdev "$OUT" -boot_image any replay \
-volid "BJ_DEBIAN13" \
-map "$WORK/preseed" /preseed \
-map "$WORK/bj" /bj \
-map "$WORK/isolinux/txt.cfg" /isolinux/txt.cfg \
-map "$WORK/isolinux/isolinux.cfg" /isolinux/isolinux.cfg \
-map "$WORK/grub/grub.cfg" /boot/grub/grub.cfg \
-end >/dev/null 2>"$WORK/xorriso.log" || { cat "$WORK/xorriso.log"; exit 1; }
echo "Образ собран: $OUT ($(du -h "$OUT" | cut -f1)), канал обновлений $CHANNEL"