#!/bin/sh # Сборка образа ISO Bridge&Join на основе официального Debian 13 netinst. # # deploy/iso/build-iso.sh <версия> [канал] [выходной.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"