Compare commits
3 Commits
44b2ce8a99
...
dd6261aa33
Author | SHA1 | Date |
---|---|---|
|
dd6261aa33 | |
|
821ea84ea7 | |
|
7e5a83ba28 |
|
@ -65,6 +65,7 @@ pipeline {
|
|||
'firmware.img.zst',
|
||||
'rootfs.squashfs',
|
||||
'sdcard.img.zst',
|
||||
'update.tar.zst',
|
||||
].join(','))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,10 +7,8 @@ BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/qemu/post-image
|
|||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/aarch64-virt/linux.config"
|
||||
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_AIMEEOS_PATH)/kernel/config"
|
||||
BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
|
||||
# BR2_PACKAGE_BUSYBOX is not set
|
||||
# BR2_TARGET_ROOTFS_TAR is not set
|
||||
AIMEEOS=y
|
||||
AIMEEOS_DEFAULT_ROOTFLAGS="systemd.mask=serial-getty@ttyAMA0 systemd.debug_shell systemd.default_debug_tty=ttyAMA0"
|
||||
BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot configfile echo efi_gop fat gzio linux loadenv minicmd normal part_gpt probe regexp squash4 terminfo test zstd"
|
||||
|
|
|
@ -10,7 +10,6 @@ BR2_LINUX_KERNEL=y
|
|||
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,ac69f097e1fba94502cbd36278db204120a37943)/linux-ac69f097e1fba94502cbd36278db204120a37943.tar.gz"
|
||||
BR2_LINUX_KERNEL_DEFCONFIG="bcm2709"
|
||||
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_AIMEEOS_PATH)/kernel/config"
|
||||
BR2_LINUX_KERNEL_ZSTD=y
|
||||
BR2_LINUX_KERNEL_DTS_SUPPORT=y
|
||||
BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2710-rpi-3-b broadcom/bcm2710-rpi-3-b-plus broadcom/bcm2710-rpi-cm3"
|
||||
|
@ -23,7 +22,6 @@ BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI=y
|
|||
BR2_PACKAGE_RPI_FIRMWARE_CMDLINE_FILE="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/raspberrypi3/cmdline.txt"
|
||||
BR2_PACKAGE_RPI_FIRMWARE_CONFIG_FILE="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/raspberrypi3/config.txt"
|
||||
# BR2_TARGET_ROOTFS_TAR is not set
|
||||
BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot configfile echo efi_gop fat gzio linux loadenv minicmd normal part_gpt probe regexp squash4 terminfo test zstd"
|
||||
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="rpi_3_32b"
|
||||
BR2_PACKAGE_HOST_KMOD_XZ=y
|
||||
AIMEEOS=y
|
||||
|
|
35
external.mk
35
external.mk
|
@ -1,5 +1,7 @@
|
|||
ifeq ($(AIMEEOS),y)
|
||||
|
||||
BR2_TOOLCHAIN_BUILDROOT_VENDOR = "aimeeos"
|
||||
|
||||
# Disable the default fstab
|
||||
SKELETON_INIT_SYSTEMD_ROOT_RO_OR_RW =
|
||||
# Disable the default var.mount
|
||||
|
@ -7,14 +9,43 @@ SKELETON_INIT_SYSTEMD_ROOTFS_PRE_CMD_HOOKS =
|
|||
|
||||
# Enable required kernel options for Aimee OS storage
|
||||
define AIMEEOS_LINUX_CONFIG_FIXUPS
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_BTRFS_FS)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_BLK_DEV_INITRD)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_BTRFS_FS)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_EFI)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_MSDOS_FS)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NLS_CODEPAGE_437)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NLS_ISO8859_1)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_NLS_UTF8)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_SQUASHFS)
|
||||
$(call KCONFIG_ENABLE_OPT,CONFIG_VFAT_FS)
|
||||
endef
|
||||
LINUX_KCONFIG_FIXUP_CMDS += $(AIMEEOS_LINUX_CONFIG_FIXUPS)
|
||||
|
||||
# Generate the initramfs image after building the target
|
||||
BR2_ROOTFS_POST_BUILD_SCRIPT += $(BR2_EXTERNAL_AIMEEOS_PATH)/boot/mkinitramfs.sh
|
||||
|
||||
# Ensure the requisite GRUB2 modules are selected
|
||||
define AIMEEOS_GRUB2_MODULES
|
||||
boot
|
||||
configfile
|
||||
echo
|
||||
efi_gop
|
||||
fat
|
||||
gzio
|
||||
linux
|
||||
loadenv
|
||||
minicmd
|
||||
normal
|
||||
part_gpt
|
||||
probe
|
||||
regexp
|
||||
squash4
|
||||
terminfo
|
||||
test
|
||||
zstd
|
||||
endef
|
||||
BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI += $(AIMEEOS_GRUB2_MODULES)
|
||||
|
||||
# Overwrite the grub.cfg provided by Buildroot with our own.
|
||||
define AIMEEOS_GRUB2_INSTALL_IMAGES_CMDS
|
||||
$(foreach tuple, $(GRUB2_TUPLES-y), \
|
||||
|
@ -45,6 +76,8 @@ $(BR2_EXTERNAL_AIMEEOS_PATH)/boot/grub2/gen-grub-cfg.sh $(AIMEEOS_KERNEL_FILENAM
|
|||
endef
|
||||
LINUX_TARGET_FINALIZE_HOOKS += AIMEEOS_GEN_GRUB_CFG
|
||||
|
||||
BR2_ROOTFS_POST_IMAGE_SCRIPT += $(BR2_EXTERNAL_AIMEEOS_PATH)/update/make-package.sh
|
||||
|
||||
endif
|
||||
|
||||
include $(sort $(wildcard $(BR2_EXTERNAL_AIMEEOS_PATH)/package/*/*.mk))
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
CONFIG_EFI=y
|
||||
CONFIG_SQUASHFS=y
|
|
@ -0,0 +1,10 @@
|
|||
[Match]
|
||||
Type=ether
|
||||
Name=en* eth*
|
||||
|
||||
[Network]
|
||||
DHCP=true
|
||||
|
||||
[DHCPv4]
|
||||
ClientIdentifier=mac
|
||||
UseDomain=true
|
|
@ -6,3 +6,5 @@ config BR2_PACKAGE_AIMEE_OS_UTILS
|
|||
select BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT
|
||||
select BR2_PACKAGE_UTIL_LINUX_PARTX
|
||||
select BR2_PACKAGE_UTIL_LINUX_SWITCH_ROOT
|
||||
select BR2_PACKAGE_WGET
|
||||
select BR2_TARGET_GRUB2_INSTALL_TOOLS
|
||||
|
|
|
@ -12,10 +12,20 @@ AIMEE_OS_UTILS_DEPENDENCIES = \
|
|||
|
||||
AIMEE_OS_UTILS_SOURCE =
|
||||
|
||||
define AIMEE_OS_UTILS_INSTALL_TARGET_CMDS
|
||||
$(INSTALL) -D -m u=rwx,go=rx \
|
||||
$(AIMEE_OS_UTILS_PKGDIR)/system-update.sh \
|
||||
$(TARGET_DIR)/usr/sbin/system-update
|
||||
mkdir -p $(TARGET_DIR)/boot/efi
|
||||
endef
|
||||
|
||||
define AIMEE_OS_UTILS_INSTALL_INIT_SYSTEMD
|
||||
$(INSTALL) -D -m u=rw,go=r \
|
||||
$(AIMEE_OS_UTILS_PKGDIR)/var.mount \
|
||||
$(TARGET_DIR)/usr/lib/systemd/system/var.mount
|
||||
$(INSTALL) -D -m u=rw,go=r \
|
||||
$(AIMEE_OS_UTILS_PKGDIR)/90-default.network \
|
||||
$(TARGET_DIR)/usr/lib/systemd/network/90-default.network
|
||||
endef
|
||||
|
||||
$(eval $(generic-package))
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
#!/bin/sh
|
||||
# vim: set sw=4 ts=4 sts=4 et :
|
||||
|
||||
cleanup() {
|
||||
cd /
|
||||
if [ -n "${workdir}" ] && [ "${workdir}" != / ]; then
|
||||
rm -rf "${workdir}"
|
||||
fi
|
||||
unset workdir
|
||||
}
|
||||
|
||||
die() {
|
||||
rc=$?
|
||||
if [ $rc -eq 0 ]; then
|
||||
rc=1
|
||||
fi
|
||||
error "$@"
|
||||
exit $rc
|
||||
}
|
||||
|
||||
error() {
|
||||
if [ $# -eq 1 ]; then
|
||||
echo "$1" >&2
|
||||
elif [ $# -gt 1 ]; then
|
||||
printf "$@" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
extract_update() {
|
||||
zstd -dc update.tar.zstd | tar -x \
|
||||
|| die 'Could not extract update source'
|
||||
sha256sum -c digests \
|
||||
|| die 'Invalid update source: checksum mismatch'
|
||||
}
|
||||
|
||||
fetch_update() {
|
||||
wget -O update.tar.zstd "$1"
|
||||
}
|
||||
|
||||
get_root() {
|
||||
set -- $(cat /proc/cmdline)
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
root=*)
|
||||
_root=${1#root=}
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
echo $(findfs "${_root}")
|
||||
}
|
||||
|
||||
get_partlabel() {
|
||||
blkid -o value -s PARTLABEL "$1"
|
||||
}
|
||||
|
||||
help() {
|
||||
usage
|
||||
}
|
||||
|
||||
info() {
|
||||
if [ $# -eq 1 ]; then
|
||||
echo "$1" >&2
|
||||
elif [ $# -gt 1 ]; then
|
||||
printf "$@" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
usage() {
|
||||
printf 'usage: %s source_url\n' "${0##*/}"
|
||||
}
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--help)
|
||||
help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
if [ -z "${source_url}" ]; then
|
||||
source_url="$1"
|
||||
else
|
||||
usage >&2
|
||||
exit 2
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ -z "${source_url}" ]; then
|
||||
usage >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
root=$(get_root)
|
||||
partlabel=$(get_partlabel "${root}")
|
||||
|
||||
case "${partlabel}" in
|
||||
rootfs-a)
|
||||
newpartlabel=rootfs-b
|
||||
;;
|
||||
rootfs-b)
|
||||
newpartlabel=rootfs-a
|
||||
;;
|
||||
*)
|
||||
die \
|
||||
'Unsupported system configuration: invalid rootfs partition label: %s\n' \
|
||||
"${partlabel}" >&2
|
||||
esac
|
||||
newroot=$(findfs PARTLABEL="${newpartlabel}")
|
||||
if [ -z "${newroot}" ]; then
|
||||
die 'Could not find partition with label %s\n' "${partlabel}"
|
||||
fi
|
||||
info 'Current rootfs: %s (%s)\n' "${partlabel}" "${root}"
|
||||
info 'New rootfs: %s (%s)\n' "${newpartlabel}" "${newroot}"
|
||||
|
||||
trap cleanup INT TERM QUIT EXIT
|
||||
workdir=$(mktemp -d)
|
||||
cd "${workdir}"
|
||||
|
||||
fetch_update "${source_url}" || die 'Failed to fetch update source'
|
||||
extract_update || die 'Failed to extact update source'
|
||||
./install "${newroot}" || die 'Error installing system update'
|
||||
|
||||
printf 'Do you want to reboot now? [y/N] '
|
||||
read confirm
|
||||
case "${confirm}" in
|
||||
[yY]|[yY][eE][sS])
|
||||
systemctl reboot
|
||||
;;
|
||||
*)
|
||||
info 'A reboot is required to complete the update'
|
||||
;;
|
||||
esac
|
|
@ -0,0 +1,101 @@
|
|||
#!/bin/sh
|
||||
# vim: set sw=4 ts=4 sts=4 et :
|
||||
|
||||
EFIMOUNT=/boot/efi
|
||||
GRUBENV=${EFIMOUNT}/EFI/BOOT/grubenv
|
||||
|
||||
die() {
|
||||
rc=$?
|
||||
if [ $rc -eq 0 ]; then
|
||||
rc=1
|
||||
fi
|
||||
error "$@"
|
||||
exit $rc
|
||||
}
|
||||
|
||||
error() {
|
||||
printf 'ERROR: '
|
||||
info "$@"
|
||||
}
|
||||
|
||||
get_partuuid() {
|
||||
blkid -o value -s PARTUUID "$1"
|
||||
}
|
||||
|
||||
info() {
|
||||
if [ $# -eq 1 ]; then
|
||||
echo "$1" >&2
|
||||
elif [ $# -gt 1 ]; then
|
||||
printf "$@" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
set_default_boot() {
|
||||
_rc=0
|
||||
mkdir -p newroot || return
|
||||
mount -oro "$1" newroot || return
|
||||
_partuuid=$(get_partuuid "$1")
|
||||
_id=id-${_partuuid}
|
||||
printf 'Setting default boot entry to %s\n' "${_id}"
|
||||
grub-editenv "${GRUBENV}" set "default=${_id}" || rc=$?
|
||||
umount newroot
|
||||
return $rc
|
||||
}
|
||||
|
||||
warn() {
|
||||
printf 'WARNING: '
|
||||
info "$@"
|
||||
}
|
||||
|
||||
write_firmware() {
|
||||
_rc=0
|
||||
_esp=$(findfs PARTLABEL='EFI System Partition')
|
||||
if [ -z "${_esp}" ]; then
|
||||
error 'Could not identify EFI System Partition'
|
||||
return 1
|
||||
fi
|
||||
if ! mountpoint -q "${EFIMOUNT}"; then
|
||||
mount -o ro "${_esp}" "${EFIMOUNT}" \
|
||||
|| warn 'Failed to mount EFI System Partition'
|
||||
fi
|
||||
if [ -f "${GRUBENV}" ]; then
|
||||
info 'Saving current GRUB environment ...'
|
||||
cp "${GRUBENV}" grubenv \
|
||||
|| warn 'Failed to save GRUB environment'
|
||||
fi
|
||||
if mountpoint -q "${EFIMOUNT}"; then
|
||||
umount "${EFIMOUNT}" || return
|
||||
fi
|
||||
info 'Writing firmware image to EFI System Partition (%s) ...\n' "${_esp}"
|
||||
dd if=firmware.img of="${_esp}" bs=1M || _rc=$?
|
||||
if [ $_rc -eq 0 ]; then
|
||||
mount -orw "${_esp}" "${EFIMOUNT}" || rc=$?
|
||||
fi
|
||||
if [ $_rc -eq 0 ]; then
|
||||
if [ -f grubenv ]; then
|
||||
printf 'Restoring GRUB environment ...\n'
|
||||
cp grubenv "${GRUBENV}" || _rc=$?
|
||||
fi
|
||||
fi
|
||||
return $_rc
|
||||
}
|
||||
|
||||
write_rootfs() {
|
||||
printf 'Writing rootfs image to %s ...\n' "$1"
|
||||
dd if=rootfs.squashfs of="$1" bs=1M
|
||||
}
|
||||
|
||||
rc=0
|
||||
newroot="$1"
|
||||
|
||||
write_rootfs "${newroot}" || die 'Failed to write new rootfs image to disk'
|
||||
write_firmware || die 'Failed to write new firmware image to disk'
|
||||
if ! set_default_boot "${newroot}"; then
|
||||
rc=$?
|
||||
error 'Failed to set default boot option'
|
||||
fi
|
||||
|
||||
if [ $rc -eq 0 ]; then
|
||||
info 'Successfully installed update'
|
||||
fi
|
||||
exit $rc
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/sh
|
||||
# vim: set sw=4 ts=4 sts=4 et :
|
||||
|
||||
UPDATE_PACKAGE=update.tar.zstd
|
||||
SRCDIR=$(realpath "${0%/*}")
|
||||
|
||||
cd "${BINARIES_DIR}"
|
||||
printf 'Creating %s/%s\n' "${BINARIES_DIR}" "${UPDATE_PACKAGE}" >&2
|
||||
sha256sum firmware.img > digests || exit
|
||||
sha256sum rootfs.squashfs >> digests || exit
|
||||
cp -u "${SRCDIR}"/install-update.sh install || exit
|
||||
tar -c --zstd -f "${UPDATE_PACKAGE}" \
|
||||
digests \
|
||||
firmware.img \
|
||||
rootfs.squashfs \
|
||||
install \
|
||||
|| exit
|
Loading…
Reference in New Issue