#!/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