From b35f58abb8f66c7506a4d2a18bc270ecdfd9dbee Mon Sep 17 00:00:00 2001 From: oxmc7769 Date: Wed, 23 Apr 2025 04:24:06 -0700 Subject: [PATCH] Adjust iso --- export-image/mk-iso.sh | 137 +++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/export-image/mk-iso.sh b/export-image/mk-iso.sh index bff0e88..1551560 100755 --- a/export-image/mk-iso.sh +++ b/export-image/mk-iso.sh @@ -1,92 +1,69 @@ #!/bin/bash -e -ISO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.iso" - -unmount_image "${ISO_FILE}" - -rm -f "${ISO_FILE}" -rm -rf "${ROOTFS_DIR}" -mkdir -p "${ROOTFS_DIR}" - +IMG_NAME="${IMG_FILENAME}${IMG_SUFFIX}" +IMG_FILE="${STAGE_WORK_DIR}/${IMG_NAME}.img" +MOUNT_DIR="${ROOTFS_DIR}" BOOT_SIZE=$((512 * 1024 * 1024)) -RECOVERY_SIZE=$((256 * 1024 * 1024)) # 256MB recovery partition -ROOT_SIZE=$(du -x --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot/firmware --block-size=1 | cut -f 1) - +RECOVERY_SIZE=$((256 * 1024 * 1024)) ALIGN=$((4 * 1024 * 1024)) -ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)" +unmount_image "${IMG_FILE}" +rm -f "${IMG_FILE}" +rm -rf "${MOUNT_DIR}" +mkdir -p "${MOUNT_DIR}" + +# Calculate rootfs size +ROOT_SIZE=$(du -x --apparent-size -s "${EXPORT_ROOTFS_DIR}" --exclude var/cache/apt/archives --exclude boot/firmware --block-size=1 | cut -f 1) +ROOT_MARGIN="$(echo "($ROOT_SIZE * 0.2 + 200 * 1024 * 1024) / 1" | bc)" BOOT_PART_START=$((ALIGN)) BOOT_PART_SIZE=$(((BOOT_SIZE + ALIGN - 1) / ALIGN * ALIGN)) - ROOT_PART_START=$((BOOT_PART_START + BOOT_PART_SIZE)) ROOT_PART_SIZE=$(((ROOT_SIZE + ROOT_MARGIN + ALIGN - 1) / ALIGN * ALIGN)) - RECOVERY_PART_START=$((ROOT_PART_START + ROOT_PART_SIZE)) RECOVERY_PART_SIZE=$(((RECOVERY_SIZE + ALIGN - 1) / ALIGN * ALIGN)) - IMG_SIZE=$((RECOVERY_PART_START + RECOVERY_PART_SIZE)) -truncate -s "${IMG_SIZE}" "${ISO_FILE}" +# Create raw image +truncate -s "${IMG_SIZE}" "${IMG_FILE}" +parted --script "${IMG_FILE}" mklabel msdos +parted --script "${IMG_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))" +parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))" +parted --script "${IMG_FILE}" unit B mkpart primary ext4 "${RECOVERY_PART_START}" "$((RECOVERY_PART_START + RECOVERY_PART_SIZE - 1))" -parted --script "${ISO_FILE}" mklabel msdos -parted --script "${ISO_FILE}" unit B mkpart primary fat32 "${BOOT_PART_START}" "$((BOOT_PART_START + BOOT_PART_SIZE - 1))" -parted --script "${ISO_FILE}" unit B mkpart primary ext4 "${ROOT_PART_START}" "$((ROOT_PART_START + ROOT_PART_SIZE - 1))" -parted --script "${ISO_FILE}" unit B mkpart primary ext4 "${RECOVERY_PART_START}" "$((RECOVERY_PART_START + RECOVERY_PART_SIZE - 1))" - -echo "Creating loop device..." +# Create loop device cnt=0 -until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$ISO_FILE")"; do - if [ $cnt -lt 5 ]; then - cnt=$((cnt + 1)) - echo "Error in losetup. Retrying..." - sleep 5 - else - echo "ERROR: losetup failed; exiting" - exit 1 - fi +until ensure_next_loopdev && LOOP_DEV="$(losetup --show --find --partscan "$IMG_FILE")"; do + ((cnt++)) + if [ $cnt -ge 5 ]; then echo "ERROR: losetup failed"; exit 1; fi + echo "Retrying losetup..."; sleep 5 done - ensure_loopdev_partitions "$LOOP_DEV" + BOOT_DEV="${LOOP_DEV}p1" ROOT_DEV="${LOOP_DEV}p2" RECOVERY_DEV="${LOOP_DEV}p3" -ROOT_FEATURES="^huge_file" -for FEATURE in 64bit; do - if grep -q "$FEATURE" /etc/mke2fs.conf; then - ROOT_FEATURES="^$FEATURE,$ROOT_FEATURES" - fi -done +# Format partitions +FAT_SIZE=$([ "$BOOT_SIZE" -lt 134742016 ] && echo 16 || echo 32) +mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 "$BOOT_DEV" +mkfs.ext4 -L rootfs -O "^64bit,^huge_file" "$ROOT_DEV" +mkfs.ext4 -L recovery "$RECOVERY_DEV" -if [ "$BOOT_SIZE" -lt 134742016 ]; then - FAT_SIZE=16 -else - FAT_SIZE=32 -fi +# Mount and copy rootfs +mount "$ROOT_DEV" "$MOUNT_DIR" -t ext4 +mkdir -p "${MOUNT_DIR}/boot" +mount "$BOOT_DEV" "${MOUNT_DIR}/boot" -t vfat +rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware --exclude /boot/overlays "${EXPORT_ROOTFS_DIR}/" "${MOUNT_DIR}/" -mkdosfs -n bootfs -F "$FAT_SIZE" -s 4 -v "$BOOT_DEV" > /dev/null -mkfs.ext4 -L rootfs -O "$ROOT_FEATURES" "$ROOT_DEV" > /dev/null -mkfs.ext4 -L recovery "$RECOVERY_DEV" > /dev/null +# Recovery partition +mkdir -p "${MOUNT_DIR}/recovery" +mount "$RECOVERY_DEV" "${MOUNT_DIR}/recovery" -t ext4 +# Optionally copy recovery tools +# cp recovery-tools/recovery.sh "${MOUNT_DIR}/recovery/" -mount -v "$ROOT_DEV" "${ROOTFS_DIR}" -t ext4 -mkdir -p "${ROOTFS_DIR}/boot" -mount -v "$BOOT_DEV" "${ROOTFS_DIR}/boot" -t vfat - -rsync -aHAXx --exclude /var/cache/apt/archives --exclude /boot/firmware --exclude /boot/overlays "${EXPORT_ROOTFS_DIR}/" "${ROOTFS_DIR}/" -#rsync -rtx "${EXPORT_ROOTFS_DIR}/boot/firmware/" "${ROOTFS_DIR}/boot/firmware/" - -# Optionally mount and populate the recovery partition -mkdir -p "${ROOTFS_DIR}/recovery" -mount -v "$RECOVERY_DEV" "${ROOTFS_DIR}/recovery" -t ext4 - -# (Optional) Example: copy recovery script -# cp recovery-tools/recovery.sh "${ROOTFS_DIR}/recovery/" - -# Create bootable ISO with GRUB -echo "Creating bootable ISO..." -mkdir -p "${ROOTFS_DIR}/boot/grub" - -cat > "${ROOTFS_DIR}/boot/grub/grub.cfg" < "${MOUNT_DIR}/boot/grub/grub.cfg" <