🔒 Repository is read-only – file editing is disabled.

PaganLinux/fix-iso-hybrid.sh main

147 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
#!/bin/bash
# =============================================================================
# fix-iso-hybrid.sh – naprawa gotowego ISO Pagan Linux pod zapis na pendrive
# =============================================================================
# OBJAW: balenaEtcher przy próbie zapisu zgłasza:
#     "Missing partition table" / "This image looks like not bootable image"
#
# PRZYCZYNA: ISO zostało zbudowane bez isohdpfx.bin (na hoście buildera nie
# było syslinux) → obraz NIE jest hybrydowy: sektor 0 to same zera, brak MBR
# i tablicy partycji. Takie ISO nadaje się tylko na płytę CD/DVD, a po zapisie
# na USB przez balenaEtcher nie bootuje.
#
# ROZWIĄZANIE: ten skrypt DOKŁADA do gotowego ISO hybrydowy MBR (isohybrid)
# + tablicę partycji MBR/GPT, odtwarzając oba wpisy El Torito (BIOS isolinux
# i UEFI grub). ISO nie jest przebudowywane – operacja trwa kilka minut
# (kopiowanie ~1,4 GB danych). Oryginał zostaje nietknięty.
#
# WYMAGANIA: xorriso + isohdpfx.bin z pakietu syslinux. Jeśli pakietu nie ma:
#     EndeavourOS/Arch:   sudo pacman -S syslinux
#     Debian/Ubuntu:      sudo apt install syslinux
#     Fedora:             sudo dnf install syslinux
#
# UŻYCIE:
#     ./fix-iso-hybrid.sh pagan-build/output/Pagan-Linux-0.0.2Loki-none.iso
#     ./fix-iso-hybrid.sh /ścieżka/do/iso                # wiele plików naraz
#     ISOHDPFX_BIN=/ścieżka/isohdpfx.bin ./fix-iso-hybrid.sh obraz.iso
# =============================================================================
set -euo pipefail

# Katalogi, w których dystrybucje trzymają pliki syslinux (isolinux.bin itd.)
SYSLINUX_DIRS=(
    /usr/lib/syslinux/bios
    /usr/lib/syslinux
    /usr/lib/syslinux/modules/bios
    /usr/share/syslinux
    /usr/lib/ISOLINUX
    /usr/lib/syslinux/mbr
)

RED=$'\033[0;31m'; GREEN=$'\033[0;32m'; YELLOW=$'\033[1;33m'
BOLD=$'\033[1m'; NC=$'\033[0m'

die() { echo -e "${RED}[BŁĄD]${NC} $*" >&2; exit 1; }
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[UWAGA]${NC} $*" >&2; }

usage() {
    cat <<'EOF'
Użycie: fix-iso-hybrid.sh OBRAZ.ISO [OBRAZ2.ISO ...]

Dodaje hybrydowy MBR (isohybrid) i tablicę partycji do gotowego ISO Pagan Linux,
żeby balenaEtcher/Rufus zaakceptowały obraz i pendrive bootował (BIOS + UEFI).

Opcje:
  ISOHDPFX_BIN=/ścieżka/isohdpfx.bin   – wskaż MBR ręcznie (jeśli nie w domyślnych
                                        katalogach syslinux)

Efekt: obok każdego OBRAZ.ISO powstaje OBRAZ-hybrid.iso (oryginał bez zmian).
EOF
    exit 0
}

# --- szukaj isohdpfx.bin -----------------------------------------------------
find_isohdpfx() {
    local d
    [[ -n "${ISOHDPFX_BIN:-}" && -f "${ISOHDPFX_BIN}" ]] && { echo "${ISOHDPFX_BIN}"; return 0; }
    for d in "${SYSLINUX_DIRS[@]}"; do
        if [[ -f "$d/isohdpfx.bin" ]]; then
            echo "$d/isohdpfx.bin"
            return 0
        fi
    done
    return 1
}

# --- czy ISO jest już hybrydowe? (MBR 55AA + aktywny wpis partycji) ----------
iso_is_hybrid() {
    local file="$1" sig flag
    [[ -s "$file" ]] || return 1
    sig=$(dd if="$file" bs=1 skip=510 count=2 2>/dev/null | od -An -tx1 | tr -d ' \n')
    [[ "$sig" == "55aa" ]] || return 1
    flag=$(dd if="$file" bs=1 skip=446 count=1 2>/dev/null | od -An -tx1 | tr -d ' \n')
    [[ -n "$flag" && "$flag" != "00" ]]
}

command -v xorriso >/dev/null 2>&1 || die "Brak xorriso – zainstaluj: EndeavourOS/Arch: 'sudo pacman -S xorriso' | Debian/Ubuntu: 'sudo apt install xorriso'"

[[ $# -ge 1 ]] || usage

MBR=""
MBR=$(find_isohdpfx) || {
    warn "Nie znaleziono isohdpfx.bin – próbuję zainstalować syslinux..."
    if command -v pacman &>/dev/null; then
        pacman -Sy --noconfirm --needed syslinux
    elif command -v apt-get &>/dev/null; then
        apt-get update
        apt-get install -y isolinux syslinux-common syslinux-utils
    elif command -v dnf &>/dev/null; then
        dnf install -y syslinux
    fi
    MBR=$(find_isohdpfx) || die "Nie udało się pozyskać isohdpfx.bin (MBR isohybrid). Zainstaluj syslinux ręcznie: EndeavourOS/Arch: 'sudo pacman -S syslinux' | Debian/Ubuntu: 'sudo apt install isolinux syslinux-common syslinux-utils' | Fedora: 'sudo dnf install syslinux'"
}
info "Używam MBR isohybrid: $MBR"

rc=0
for ISO in "$@"; do
    echo ""
    if [[ ! -f "$ISO" ]]; then
        warn "Pominięto (brak pliku): $ISO"
        continue
    fi
    if iso_is_hybrid "$ISO"; then
        info "ISO jest już hybrydowe, pomijam: $ISO"
        continue
    fi

    OUT="${ISO%.iso}-hybrid.iso"
    [[ "$ISO" == "$OUT" ]] && OUT="${ISO}.hybrid.iso"

    info "Przetwarzam: $ISO"
    info "Tworzę:     $OUT  (to potrwa – kopiowanie obrazu...)"

    if ! xorriso -indev "$ISO" -outdev "$OUT" \
            -boot_image any replay \
            -boot_image isolinux system_area="$MBR" \
            -boot_image isolinux partition_entry=gpt_basdat; then
        warn "xorriso nie przetworzył: $ISO"
        rc=1
        continue
    fi

    if iso_is_hybrid "$OUT"; then
        info "✓ Gotowe: $OUT"
        info "  MBR + tablica partycji dodane, wpisy El Torito (BIOS isolinux + UEFI) zachowane."
    else
        warn "Nie udało się zweryfikować hybrydy w: $OUT – sprawdź ręcznie (fdisk -l)"
        rc=1
    fi
done

echo ""
if [[ $rc -eq 0 ]]; then
    info "Skończono. Wskaż balenaEtcher plik *-hybrid.iso (nie oryginał)."
else
    warn "Skończono z problemami (szczegóły wyżej)."
fi
exit $rc