Currently the only board supporting GPT partition table and SPL is the ASUS Tinker board. Its Rockchip boot loader is stored at LBA 0x40 (64) which is well past the last LBA of a regular GPT partition table which is at LBA 33). Therefor a custom GPT main partition table location (via sgdisk -j, --adjust-main-table=sector) is not necessary. Technically we could copy anything after LBA 34 from the SPL image, but since we don't support a board which needs that space for its SPL let's stick with the well aligned Rockchip start at LBA 64. Note: To preserve the layout we still add the SPL size to the regular offset. Technically we could start the boot partition at LBA 16384, but this would mean a different partition table compared to before and different offset of subsequent partitions compared to other GPT platforms.
137 lines
4.1 KiB
Bash
Executable File
137 lines
4.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -o errexit
|
|
|
|
install_boot() {
|
|
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}/" || true
|
|
|
|
# Update
|
|
cp -rf "${BOOT_NEW}"/* "${BOOT_MNT}/"
|
|
|
|
# Restore boot config
|
|
cp -f "${BOOT_TMP}"/*.txt "${BOOT_MNT}/" || true
|
|
|
|
umount "${BOOT_NEW}"
|
|
rm -rf "${BOOT_TMP}" "${BOOT_NEW}"
|
|
}
|
|
|
|
install_spl() {
|
|
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=64 skip=64
|
|
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
|
|
}
|
|
|
|
check_grubenv() {
|
|
BOOT_MNT=/mnt/boot
|
|
|
|
# Mount boot
|
|
if ! systemctl -q is-active mnt-boot.mount; then
|
|
systemctl start mnt-boot.mount
|
|
fi
|
|
|
|
# If GRUB is installed, check if GRUB environment has been currupted
|
|
if command -v grub-editenv > /dev/null; then
|
|
if ! grub-editenv "${BOOT_MNT}/EFI/BOOT/grubenv" list > /dev/null; then
|
|
echo "GRUB environment seems to be corrupted. Recreating a new environment."
|
|
grub-editenv "${BOOT_MNT}"/EFI/BOOT/grubenv create
|
|
fi
|
|
fi
|
|
}
|
|
|
|
post_install_kernel() {
|
|
BOOT_MNT=/mnt/boot
|
|
|
|
# Mount boot
|
|
if ! systemctl -q is-active mnt-boot.mount; then
|
|
systemctl start mnt-boot.mount
|
|
fi
|
|
|
|
# OS 7 -> 8 upgrade path:
|
|
# If grub is installed, and the current system lacks GRUB environment
|
|
# manipulation tools, manually create a grubenv for the right boot slot
|
|
if [ -f "${BOOT_MNT}"/EFI/BOOT/grub.cfg ] && ! command -v grub-editenv > /dev/null; then
|
|
cp -f "${BOOT_MNT}/EFI/BOOT/grubenv-${RAUC_SLOT_BOOTNAME}" "${BOOT_MNT}"/EFI/BOOT/grubenv
|
|
echo "Copied default GRUB environment grubenv-${RAUC_SLOT_BOOTNAME} as grubenv."
|
|
fi
|
|
}
|
|
|
|
##
|
|
# Hooks
|
|
|
|
case "$1" in
|
|
install-check)
|
|
if [ "$RAUC_MF_COMPATIBLE" = "$RAUC_SYSTEM_COMPATIBLE" ]; then
|
|
# Check if GRUB env has been corrupted. This is only problematic
|
|
# with OS 8, where compatible matches.
|
|
check_grubenv
|
|
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)
|
|
if [ "${RAUC_SLOT_CLASS}" = "boot" ]; then
|
|
install_boot
|
|
elif [ "${RAUC_SLOT_CLASS}" = "spl" ]; then
|
|
install_spl
|
|
fi
|
|
;;
|
|
slot-post-install)
|
|
if [ "${RAUC_SLOT_CLASS}" = "kernel" ]; then
|
|
post_install_kernel
|
|
fi
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|