d8dee07213
- 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>
74 lines
3.9 KiB
Bash
Executable File
74 lines
3.9 KiB
Bash
Executable File
#!/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"
|