* Fix migration from Barebox GRUB Create GRUB env which defaults to the boot slot we are updating to. This makes sure that the newly installed OS version will be booted on next reboot even if installed on boot slot B.
103 lines
2.9 KiB
Bash
Executable File
103 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -o errexit
|
|
|
|
##
|
|
# Hooks
|
|
|
|
case "$1" in
|
|
install-check)
|
|
if [ "$RAUC_MF_COMPATIBLE" = "$RAUC_SYSTEM_COMPATIBLE" ]; then
|
|
exit 0
|
|
fi
|
|
# Be compatible with hassos OS ID
|
|
# shellcheck disable=SC3060
|
|
rauc_os_compatible=${RAUC_MF_COMPATIBLE/haos-/hassos-}
|
|
if [ "$rauc_os_compatible" = "$RAUC_SYSTEM_COMPATIBLE" ]; then
|
|
exit 0
|
|
fi
|
|
# generic-x86-64: Be compatible with intel-nuc
|
|
# shellcheck disable=SC3060
|
|
rauc_board_compatible=${rauc_os_compatible/generic-x86-64/intel-nuc}
|
|
if [ "${rauc_board_compatible}" = "$RAUC_SYSTEM_COMPATIBLE" ]; then
|
|
exit 0
|
|
fi
|
|
echo "Compatible does not match!" 1>&2
|
|
exit 10
|
|
;;
|
|
slot-install)
|
|
# Use install handlers below
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Handle boot hocks
|
|
if [ "${RAUC_SLOT_CLASS}" = "boot" ]; then
|
|
BOOT_TMP=/tmp/boot-tmp
|
|
BOOT_NEW=/tmp/boot-new
|
|
BOOT_MNT=/mnt/boot
|
|
|
|
mkdir -p "${BOOT_TMP}"
|
|
mkdir -p "${BOOT_NEW}"
|
|
|
|
# Mount boot
|
|
if ! systemctl -q is-active mnt-boot.mount; then
|
|
systemctl start mnt-boot.mount
|
|
fi
|
|
mount "${RAUC_IMAGE_NAME}" "${BOOT_NEW}"
|
|
|
|
# Backup boot config
|
|
cp -f "${BOOT_MNT}"/*.txt "${BOOT_TMP}/"
|
|
|
|
# Update
|
|
cp -rf "${BOOT_NEW}"/* "${BOOT_MNT}/"
|
|
|
|
# If grubenv is missing, initialize with boot order which will try the right
|
|
# boot slot
|
|
if [ -d "${BOOT_NEW}"/EFI/BOOT/ ] && [ ! -f "${BOOT_NEW}"/EFI/BOOT/grubenv ]; then
|
|
cp -f "${BOOT_NEW}/EFI/BOOT/grubenv-${RAUC_SLOT_BOOTNAME}" "${BOOT_NEW}"/EFI/BOOT/grubenv
|
|
fi
|
|
|
|
# Restore boot config
|
|
cp -f "${BOOT_TMP}"/*.txt "${BOOT_MNT}/"
|
|
|
|
umount "${BOOT_NEW}"
|
|
rm -rf "${BOOT_TMP}" "${BOOT_NEW}"
|
|
fi
|
|
|
|
# Handle spl install
|
|
if [ "${RAUC_SLOT_CLASS}" = "spl" ]; then
|
|
DEVICE_CHILD="$(findfs LABEL="hassos-boot")"
|
|
DEVICE_ROOT="/dev/$(lsblk -no pkname "${DEVICE_CHILD}")"
|
|
PART_TABLE="$(sfdisk -lqJ "${DEVICE_ROOT}")"
|
|
PART_LABEL="$(echo "${PART_TABLE}" | jq -r '.partitiontable.label')"
|
|
FLAGS=""
|
|
|
|
if dd oflag=direct if=/dev/null 2> /dev/null; then
|
|
FLAGS="oflag=direct"
|
|
fi
|
|
|
|
if [ "${PART_LABEL}" = "gpt" ]; then
|
|
dd if="${RAUC_IMAGE_NAME}" of="${DEVICE_ROOT}" conv=notrunc ${FLAGS} bs=512 seek=2 skip=2
|
|
else
|
|
dd if="${RAUC_IMAGE_NAME}" of="${DEVICE_ROOT}" conv=notrunc ${FLAGS} bs=1 count=440
|
|
dd if="${RAUC_IMAGE_NAME}" of="${DEVICE_ROOT}" conv=notrunc ${FLAGS} bs=512 seek=1 skip=1
|
|
fi
|
|
|
|
# Flash to eMMC boot partition if necessary
|
|
if [ "$RAUC_SYSTEM_COMPATIBLE" = "haos-odroid-xu4" ] && [ -b "${DEVICE_ROOT}boot0" ]; then
|
|
echo "Updating eMMC boot partition"
|
|
echo 0 > /sys/block/"$(basename "${DEVICE_ROOT}boot0")"/force_ro
|
|
dd if="${RAUC_IMAGE_NAME}" of="${DEVICE_ROOT}boot0" conv=notrunc ${FLAGS} bs=512 skip=1 count=2047
|
|
echo 1 > /sys/block/"$(basename "${DEVICE_ROOT}boot0")"/force_ro
|
|
fi
|
|
fi
|
|
|
|
##
|
|
# Fixups
|
|
|
|
|
|
exit 0
|