Pratham Patel
2d2ee0a676
Since Kickstart no longer has the '--start' and '--end' options for the
partition command, we need to do this manually.
3e655d4c5d
Why do we need to do this at all? Well, because some SoCs read U-Boot
from the boot media at a particular offset. Normally, the first
partition starts at 2048 (with fdisk) or at 8192 (if using Kickstart)
which means that something from the first partition will be erased, or
data written here will eventually overwrite U-Boot if U-Boot is greater
than 2MiB.
Looking at the biggest file in 'uboot-images-armv8' package, the biggest
file is ~12 MiB so the double of closest 2's exponent results in 32MiB.
80 lines
2.6 KiB
Bash
Executable File
80 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -x
|
|
KICKSTART_BASE="Rocky"
|
|
TODAY="$(TZ='UTC' date +%Y.%m.%d)"
|
|
KICKSTART_FILE="${KICKSTART_BASE}.ks"
|
|
APPLIANCE_NAME="${KICKSTART_BASE}-$(dnf config-manager --dump-variables | grep releasever | awk '{print $3}')-$(uname -m)-minimal-${TODAY}"
|
|
IMAGE_NAME="${APPLIANCE_NAME}.raw"
|
|
COMMANDS_TO_CHECK=('appliance-creator' 'shasum' 'zstd')
|
|
|
|
for COMMAND in "${COMMANDS_TO_CHECK[@]}"; do
|
|
if ! command -v "${COMMAND}" > /dev/null; then
|
|
>&2 echo "$0: ERROR: unable to find command '${COMMAND}' in PATH"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
function create_new_image {
|
|
UBOOT_MAX_SIZE='32'
|
|
EFI_END=$(( 512 + UBOOT_MAX_SIZE ))
|
|
BOOT_START=$(( EFI_END + 1 ))
|
|
BOOT_END=$(( BOOT_START + 1024 ))
|
|
ROOT_START=$(( BOOT_END + 1 ))
|
|
IMAGE_SIZE=$(( $(stat -c '%s' "${IMAGE_NAME}") / 1024 / 1024 ))
|
|
NEW_IMAGE_NAME="${IMAGE_NAME}.new"
|
|
truncate -s "$(( IMAGE_SIZE + UBOOT_MAX_SIZE ))"MiB "${NEW_IMAGE_NAME}"
|
|
|
|
LOOPBACK_01=$(losetup -f -P --show "${IMAGE_NAME}")
|
|
LOOPBACK_02=$(losetup -f -P --show "${NEW_IMAGE_NAME}")
|
|
|
|
parted -s "${LOOPBACK_02}" mklabel gpt
|
|
parted -s "${LOOPBACK_02}" mkpart efi fat32 "${UBOOT_MAX_SIZE}"MiB "${EFI_END}"MiB
|
|
parted -s "${LOOPBACK_02}" mkpart boot ext4 "${BOOT_START}"MiB "${BOOT_END}"MiB
|
|
parted -s "${LOOPBACK_02}" mkpart root ext4 "${ROOT_START}"MiB 100%
|
|
parted -s "${LOOPBACK_02}" set 1 boot on
|
|
sync; sync; sync; sync;
|
|
sleep 10
|
|
hdparm -z "${LOOPBACK_02}"
|
|
|
|
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p1" if="${LOOPBACK_02}p1"
|
|
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p2" if="${LOOPBACK_02}p2"
|
|
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p3" if="${LOOPBACK_02}p3"
|
|
sync; sync; sync; sync;
|
|
sleep 10
|
|
|
|
losetup -d "${LOOPBACK_02}"
|
|
losetup -d "${LOOPBACK_01}"
|
|
mv "${NEW_IMAGE_NAME}" "${IMAGE_NAME}"
|
|
sync; sync; sync; sync;
|
|
sleep 10
|
|
}
|
|
|
|
appliance-creator \
|
|
--config "${KICKSTART_FILE}" \
|
|
--name "${APPLIANCE_NAME}" \
|
|
--format raw \
|
|
--outdir "${PWD}" \
|
|
--no-compress \
|
|
--debug \
|
|
--cache /root/cache \
|
|
--verbose 2>&1 | tee "${APPLIANCE_NAME}.log" || exit 1
|
|
|
|
if [[ -d "${APPLIANCE_NAME}" ]]; then
|
|
pushd "${APPLIANCE_NAME}" || exit 1
|
|
mv "${APPLIANCE_NAME}-sda.raw" "${IMAGE_NAME}"
|
|
create_new_image
|
|
zstd --compress -9 "${IMAGE_NAME}"
|
|
sha512sum -- *.raw* > SHA512SUMS
|
|
sha256sum -- *.raw* > SHA256SUMS
|
|
popd || exit 0
|
|
else
|
|
>&2 echo "$0: ERROR: unable to find the appliance output directory"
|
|
>&2 echo "$0: ${APPLIANCE_NAME}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "$1" ]]; then
|
|
chown "$1":"$1" -vR "${APPLIANCE_NAME}"
|
|
fi
|