#!/bin/bash # Настройка путей SOURCE_DIR="$HOME/iso_source" OUTPUT_ISO="$HOME/ARCH_202605.iso" VOLUME_ID="ARCH_202605" TMP_EFI_MNT="/tmp/efi_mnt" echo "=== Старт автоматической сборки гибридного ISO (BIOS + UEFI) ===" # 1. Проверка утилит if ! command -v xorriso &> /dev/null; then echo "Ошибка: xorriso не установлен. Выполните: sudo pacman -S xorriso" exit 1 fi # 2. Безопасный бэкап файлов загрузчика перед операциями, если sdb2 еще примонтирован # Если sdb2 уже размонтирован, скрипт возьмет файлы из структуры копии echo "→ Синхронизация файлов загрузчика..." mkdir -p /tmp/loader_backup/EFI/BOOT mkdir -p /tmp/loader_backup/loader/entries if mountpoint -q ~/new_iso/boot; then cp -r ~/new_iso/boot/EFI /tmp/loader_backup/ cp -r ~/new_iso/boot/loader /tmp/loader_backup/ else if [ -d "$SOURCE_DIR/boot/EFI" ]; then cp -r "$SOURCE_DIR/boot/EFI" /tmp/loader_backup/ cp -r "$SOURCE_DIR/boot/loader" /tmp/loader_backup/ else echo "Критическая ошибка: Файлы UEFI-загрузчика не найдены ни в ~/new_iso/boot, ни в $SOURCE_DIR/boot!" exit 1 fi fi # 3. Генерация EFI-образа для загрузки UEFI echo "→ Подготовка EFI boot image..." rm -f "$SOURCE_DIR/boot/efi.img" dd if=/dev/zero of="$SOURCE_DIR/boot/efi.img" bs=1M count=64 status=none mkfs.vfat -F 16 -n "ARCH_202605" "$SOURCE_DIR/boot/efi.img" > /dev/null # 4. Монтируем efi.img и копируем туда файлы загрузчика systemd-boot mkdir -p /tmp/efi_mnt sudo mount -o loop "$SOURCE_DIR/boot/efi.img" $TMP_EFI_MNT # 5. Проверяем успешность монтирования перед тем, как работать с директорией if mountpoint -q $TMP_EFI_MNT; then echo "→ Наполнение efi.img файлами загрузчика..." sudo mkdir -p $TMP_EFI_MNT/EFI/BOOT sudo mkdir -p $TMP_EFI_MNT/loader/entries # Копируем из гарантированного бэкапа sudo cp /tmp/loader_backup/EFI/BOOT/BOOTX64.EFI $TMP_EFI_MNT/EFI/BOOT/ sudo cp /tmp/loader_backup/loader/loader.conf $TMP_EFI_MNT/loader/ sudo cp /tmp/loader_backup/loader/entries/arch.conf $TMP_EFI_MNT/loader/entries/ sudo umount $TMP_EFI_MNT rmdir $TMP_EFI_MNT rm -rf /tmp/loader_backup else echo "Критическая ошибка: Не удалось примонтировать efi.img!" rmdir $TMP_EFI_MNT exit 1 fi # 6. Безопасная проверка готовности каталога boot перед сборкой ISO # Вместо деструктивного удаления файлов, мы просто проверяем наличие efi.img echo "→ Проверка загрузочной структуры в boot..." if [ ! -f "$SOURCE_DIR/boot/efi.img" ]; then echo "Критическая ошибка: efi.img отсутствует в $SOURCE_DIR/boot/!" exit 1 fi # Чтобы xorriso не затягивал дублирующие папки EFI и loader в корень ISO # (они уже упакованы внутрь efi.img), мы укажем утилите xorriso исключить их # прямо во время сборки на Шаге 7 с помощью флага -hide. # 7. Сборка полноценного гибридного ISO через xorriso echo "→ Запуск xorriso (Сборка гибридного образа)..." xorriso -as mkisofs \ -iso-level 3 \ -full-iso9660-filenames \ -volid "$VOLUME_ID" \ -eltorito-boot boot/syslinux/isolinux.bin \ -eltorito-catalog boot/syslinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin \ -eltorito-alt-boot \ -e boot/efi.img \ -no-emul-boot -isohybrid-gpt-basdat \ -hide EFI \ -hide loader \ -output "$OUTPUT_ISO" \ "$SOURCE_DIR/" if [ $? -eq 0 ]; then echo "=== Сборка успешно завершена! ===" echo "Файл образа: $OUTPUT_ISO" echo "Этот образ готов к записи через Rufus (в режиме DD/ISO) для флешек ИЛИ прямого монтирования в Hyper-V Gen1/Gen2." else echo "=== Ошибка при сборке ISO ===" exit 1 fi