sbc-images/create-image.sh

107 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -x
if [[ "$(id -u)" -ne 0 ]]; then
>&2 echo "$0: please run this script as root"
exit 1
fi
KICKSTART_BASE="Rocky"
TODAY="$(TZ='UTC' date +%Y.%m.%d)"
KICKSTART_FILE="${KICKSTART_BASE}.ks"
APPLIANCE_NAME="${KICKSTART_BASE}-$(source <(grep VERSION_ID /etc/os-release) && awk -F '.' '{print $1}' <<< $VERSION_ID)-$(uname -m)-minimal-${TODAY}"
IMAGE_NAME="${APPLIANCE_NAME}.raw"
COMMANDS_TO_CHECK=('appliance-creator' 'hdparm' '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
if [[ -n "$1" ]]; then
GUSER="^$1"
if ! grep $GUSER /etc/shadow > /dev/null; then
>&2 echo "$0: ERROR: unable to find user '$1'"
exit 1
fi
fi
function create_new_image {
UBOOT_MAX_SIZE='64'
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}")
# 1 MiB = 2048 * (1 block/sector (512 bytes))
UEFI_SECTORS="$(( $(fdisk -l "${LOOPBACK_01}" | grep "${LOOPBACK_01}p1" | awk '{print $4}') + 2048 ))"
BOOT_SECTORS="$(( $(fdisk -l "${LOOPBACK_01}" | grep "${LOOPBACK_01}p2" | awk '{print $4}') + 4096 ))"
cat << EOF | fdisk "${LOOPBACK_02}"
g
n
1
65536
+${UEFI_SECTORS}
n
2
+${BOOT_SECTORS}
n
3
w
EOF
sync; sync; sync; sync;
sleep 10
hdparm -z "${LOOPBACK_02}"
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p3" of="${LOOPBACK_02}p3"
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p2" of="${LOOPBACK_02}p2"
dd bs=4M conv=sync status=progress if="${LOOPBACK_01}p1" of="${LOOPBACK_02}p1"
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
}
script -q -c "appliance-creator \
--config ${KICKSTART_FILE} \
--name ${APPLIANCE_NAME} \
--format raw \
--outdir ${PWD} \
--no-compress \
--debug \
--cache /root/cache \
--verbose" | tee "${APPLIANCE_NAME}.log" || exit 1
# the script command creates a file called typescript
rm -vf typescript
if [[ -d "${APPLIANCE_NAME}" ]]; then
pushd "${APPLIANCE_NAME}" || exit 1
mv "../${APPLIANCE_NAME}.log" .
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