#!/bin/sh set -e TMP_DIR="" TMP_IMAGE="" IMAGE_SIZE=${IMAGE_SIZE:-0} MEGABYTE=$((1024 * 1024)) BOOT_MOUNT="" LOOP="" NAME="$(basename "$0")" # Define these environment variables to override mkfs options SECTOR_SIZE=${SECTOR_SIZE:-512} ROOT_DIR_ENTRIES=${ROOT_DIR_ENTRIES:-256} # Add 64k to the size calculation to reserve some space for the FAT, # directory entries and rounding up files to cluster sizes. FAT_OVERHEAD=${FAT_OVERHEAD:-64} cleanup() { unmount_image if [ -d "${TMP_DIR}" ]; then rm -rf "${TMP_DIR}" fi } die() { echo "$@" >&2 exit 1 } createfs() { size_mb="$1" image="$2" volume_label="BOOT" if [ -n "${SECTORS_PER_CLUSTER}" ]; then SECTORS_PER_CLUSTER="-s ${SECTORS_PER_CLUSTER}" fi if [ -n "${FAT_SIZE}" ]; then fat_size="-F ${FAT_SIZE}" fi sectors=$((size_mb * MEGABYTE / SECTOR_SIZE)) sectors=$((sectors / 2)) /sbin/mkfs.fat -C -f 1 \ ${SECTORS_PER_CLUSTER} -n "${volume_label}" \ ${fat_size} \ -S "${SECTOR_SIZE}" -r "${ROOT_DIR_ENTRIES}" "${image}" ${sectors} || \ die "Failed to create FAT filesystem" } mountfs() { image="$1" LOOP=$(losetup -f) losetup "${LOOP}" "${image}" [ -e "${LOOP}" ] || die "Failed to create loop device ${LOOP}" BOOT_MOUNT=$(mktemp -d) mount "${LOOP}" "${BOOT_MOUNT}" [ -d "${BOOT_MOUNT}" ] || die "Failed to mount bootfs @ ${BOOT_MOUNT}" echo "Mounted ${LOOP} @ ${BOOT_MOUNT}" } unmount_image() { if [ -d "${BOOT_MOUNT}" ]; then umount "${BOOT_MOUNT}" > /dev/null 2>&1 || true rmdir "${BOOT_MOUNT}" BOOT_MOUNT="" fi if [ -n "${LOOP}" ]; then losetup -d "${LOOP}" LOOP="" fi } createstaging() { source_dir="$1" staging="$2" board="$3" mkdir -p "${staging}" || die "Failed to create ${staging}" cp -r "${source_dir}/"* "${staging}" # Remove files for previous hardware version if [ "${board}" = "pi4" ] || [ "${board}" = "pi400" ] || [ "${board}" = "cm4" ]; then ( cd "${staging}" rm -f kernel.img kernel7.img bootcode.bin rm -f start.elf fixup.dat start_cd.elf fixup_cd.dat start_db.elf fixup_db.dat start_x.elf fixup_x.dat rm -f start4cd.elf fixup4cd.dat rm -f start4db.elf fixup4db.dat rm -f bcm2708* bcm2709* bcm2710* rm -f bootcode.bin ) fi if [ "${ARCH}" = 32 ]; then rm -f "${staging}/kernel8.img" elif [ "${ARCH}" = 64 ]; then rm -f "${staging}/kernel7l.img" fi if [ "${board}" = pi400 ]; then rm -f "${staging}/start4x.elf" rm -f "${staging}/fixup4x.dat" fi # Estimate the size of the image in KBs content="${TMP_DIR}/content.tar" echo "$(cd "${staging}"; ls -R)" tar -cf "${content}" "${staging}" > /dev/null 2>&1 if [ "${IMAGE_SIZE}" = 0 ]; then IMAGE_SIZE=$(stat --printf "%s" "${content}") IMAGE_SIZE=$(((IMAGE_SIZE + 1023) / 1024)) rm -f "${content}" # Add a little padding for FAT etc and convert to megabytes IMAGE_SIZE=$((IMAGE_SIZE + FAT_OVERHEAD)) IMAGE_SIZE=$(((IMAGE_SIZE + 1023) / 1024)) fi echo "Using IMAGE_SIZE of ${IMAGE_SIZE}" if [ "${IMAGE_SIZE}" -gt 20 ]; then echo "Warning: Large image size detected. Try removing unused files." fi } checkDependencies() { if [ ! -f /sbin/mkfs.fat ]; then die "mkfs.fat is required. Run this script on Linux" fi } usage() { cat <