🔒 Repository is read-only – file editing is disabled.
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