From 3b7f5b1f3418b7ad7a7c03f2af6d8da66f20bcb9 Mon Sep 17 00:00:00 2001 From: Ricardo Pardini Date: Sun, 6 Feb 2022 09:24:13 +0100 Subject: [PATCH] Fix rpi upgrades to kernel and dtbs (#3461) * rpi: fix: flash-kernel fix to ignore kernel 'flavour' for all raspi's - use uppercase RPICFG label, so it shows up on Windows/Mac (FAT requires uppercase) * builddeb: fix indenting of heredocs and shellfmt * rpi: add DTB symlink in Debian/Ubuntu standard location /lib/firmware/$version/device-tree; remove build-time-only hacks - this allows us to remove the most horrible hack - should allow for correctly working DTB upgrades - should NOT impact other families, although a new symlink will be created, nothing uses it. --- config/sources/families/bcm2711.conf | 17 +-- packages/armbian/builddeb | 207 ++++++++++++++------------- 2 files changed, 114 insertions(+), 110 deletions(-) diff --git a/config/sources/families/bcm2711.conf b/config/sources/families/bcm2711.conf index af587aa36..fa3674946 100644 --- a/config/sources/families/bcm2711.conf +++ b/config/sources/families/bcm2711.conf @@ -1,7 +1,7 @@ enable_extension "flash-kernel" export LINUXFAMILY=bcm2711 export ARCH=arm64 -export UEFI_FS_LABEL="rpicfg" # Windows/Mac users will see this if they mount the SD card. Configurable +export UEFI_FS_LABEL="RPICFG" # Windows/Mac users will see this if they mount the SD card. Configurable, but should be uppercase always export SKIP_BOOTSPLASH="yes" # video is init-ed before us export KERNELDIR='linux-rpi' # Avoid sharing a source tree with others, until we know it's safe. export FK__PUBLISHED_KERNEL_VERSION="raspi" # flash kernel (FK) configuration @@ -50,20 +50,13 @@ pre_flash_kernel__symlink_dtb_and_kernel() { display_alert "Preparing DTBs and Kernel..." "bcm2711" "info" mkdir -p "${MOUNT}"/etc/flash-kernel/dtbs - cat <<-EOD >>"${MOUNT}"/etc/flash-kernel/db - # Armbian kernels have a different flavour than expected. - Machine: ${FK__MACHINE_MODEL} + cat <<- EOD >> "${MOUNT}"/etc/flash-kernel/db + # Armbian kernels don't have a 'flavour'. Ignore flavors for all rpi revisions. + Machine: Raspberry Pi * Kernel-Flavors: any EOD - ## @TODO: rpardini: a horrible hack. I'll sort this out together with overlays, later. - local oneDTB dtbBase - for oneDTB in "${MOUNT}"/boot/dtb/broadcom/*.dtb; do - dtbBase=$(basename "${oneDTB}") - cp "${MOUNT}"/boot/dtb/broadcom/"${dtbBase}" "${MOUNT}"/etc/flash-kernel/dtbs/"${dtbBase}" - done - - rm -rf "${MOUNT}"/boot/dtb* || true + ## DTB compatibility has been moved to symlink done in packages/armbian/builddeb # @TODO: rpardini: packaging could maybe already use the correct names? I can't figure out how. ln -s ./Image "${MOUNT}"/boot/vmlinuz diff --git a/packages/armbian/builddeb b/packages/armbian/builddeb index f0fd41b30..9e65ab502 100755 --- a/packages/armbian/builddeb +++ b/packages/armbian/builddeb @@ -68,57 +68,64 @@ create_package() { # Create preinstall and post install script to remove dtb if [ "$3" = "dtb" ]; then - cat >> $pdir/DEBIAN/preinst <> $pdir/DEBIAN/preinst <<- EOT + rm -rf /boot/dtb + rm -rf /boot/dtb-$version + exit 0 + EOT - cat >> $pdir/DEBIAN/postinst < /dev/null || mv dtb-$version dtb -exit 0 -EOT + # for Ubuntu/Debian compatiblity, symlink in /lib/firmware/$version/device-tree + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /boot + ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb + mkdir -p /lib/firmware/$version + [ ! -L /lib/firmware/$version/device-tree ] && ln -s /boot/dtb-$version /lib/firmware/$version/device-tree + exit 0 + EOT - chmod 775 $pdir/DEBIAN/preinst - chmod 775 $pdir/DEBIAN/postinst + cat >> $pdir/DEBIAN/postrm <<- EOT + rm -rf /lib/firmware/$version + EOT + + chmod 775 $pdir/DEBIAN/preinst + chmod 775 $pdir/DEBIAN/postinst + chmod 775 $pdir/DEBIAN/postrm fi # Create postinst prerm script for headers if [ "$3" = "headers" ]; then - # Set the time for all files to the current time. - # And build them for the current architecture. - cat >> $pdir/DEBIAN/postinst << EOT -cd /usr/src/linux-headers-$version -echo "Compiling headers - please wait ..." -NCPU=\$(grep -c 'processor' /proc/cpuinfo) -find -type f -exec touch {} + -yes "" | make oldconfig >/dev/null -make -j\$NCPU -s scripts >/dev/null -make -j\$NCPU -s M=scripts/mod/ >/dev/null -exit 0 -EOT + # Set the time for all files to the current time. + # And build them for the current architecture. + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /usr/src/linux-headers-$version + echo "Compiling headers - please wait ..." + NCPU=\$(grep -c 'processor' /proc/cpuinfo) + find -type f -exec touch {} + + yes "" | make oldconfig >/dev/null + make -j\$NCPU -s scripts >/dev/null + make -j\$NCPU -s M=scripts/mod/ >/dev/null + exit 0 + EOT - # After the configuration and compilation processes, new files - # appear that the package manager does not know anything about. - # Just clear all the files in the target directory. - cat >> $pdir/DEBIAN/prerm << EOT -rm -rf /usr/src/linux-headers-$version -exit 0 -EOT + # After the configuration and compilation processes, new files + # appear that the package manager does not know anything about. + # Just clear all the files in the target directory. + cat >> $pdir/DEBIAN/prerm <<- EOT + rm -rf /usr/src/linux-headers-$version + exit 0 + EOT - chmod 775 $pdir/DEBIAN/postinst - chmod 775 $pdir/DEBIAN/prerm + chmod 775 $pdir/DEBIAN/postinst + chmod 775 $pdir/DEBIAN/prerm fi - # Create the package dpkg-gencontrol -p$pname -P"$pdir" dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. } -deploy_kernel_headers () { +deploy_kernel_headers() { pdir=$1 rm -rf $pdir @@ -137,7 +144,7 @@ deploy_kernel_headers () { { if is_enabled CONFIG_STACK_VALIDATION; then - # echo tools/objtool/objtool + # echo tools/objtool/objtool find tools/objtool -type f -executable fi @@ -152,8 +159,8 @@ deploy_kernel_headers () { echo "info: Build native: Skip headers-debian-byteshift.patch" >&2 elif is_build_on_amd64; then ( - cd $destdir - patch -p1 < /tmp/headers-debian-byteshift.patch + cd $destdir + patch -p1 < /tmp/headers-debian-byteshift.patch ) fi @@ -168,7 +175,7 @@ deploy_kernel_headers () { ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build } -deploy_libc_headers () { +deploy_libc_headers() { pdir=$1 rm -rf $pdir @@ -195,7 +202,7 @@ dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" libc_headers_packagename=linux-libc-dev dbg_packagename=$packagename-dbg -if [ "$ARCH" = "um" ] ; then +if [ "$ARCH" = "um" ]; then packagename=user-mode-linux-$version fi @@ -203,23 +210,24 @@ fi # XXX: have each arch Makefile export a variable of the canonical image install # path instead case $ARCH in -++aarch64|arm64) - image_name=Image - installed_image_path="boot/vmlinuz-$version" - ;; -arm*) - image_name=zImage - installed_image_path="boot/vmlinuz-$version" - ;; -um) - installed_image_path="usr/bin/linux-$version" - ;; -parisc|mips|powerpc) - installed_image_path="boot/vmlinux-$version" - ;; -*) - image_name=vmlinuz - installed_image_path="boot/vmlinuz-$version" + ++aarch64 | arm64) + image_name=Image + installed_image_path="boot/vmlinuz-$version" + ;; + arm*) + image_name=zImage + installed_image_path="boot/vmlinuz-$version" + ;; + um) + installed_image_path="usr/bin/linux-$version" + ;; + parisc | mips | powerpc) + installed_image_path="boot/vmlinux-$version" + ;; + *) + image_name=vmlinuz + installed_image_path="boot/vmlinuz-$version" + ;; esac BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) @@ -234,7 +242,7 @@ mkdir -m 755 -p "$kernel_headers_dir/lib/modules/$version/" mkdir -m 755 -p "$libc_headers_dir/DEBIAN" # Install the kernel -if [ "$ARCH" = "um" ] ; then +if [ "$ARCH" = "um" ]; then mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" $MAKE linux cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" @@ -253,7 +261,7 @@ if is_enabled CONFIG_OF_EARLY_FLATTREE; then fi fi -if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then +if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG; then #mkdir -p "$tmpdir/boot/dtb" INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install fi @@ -262,11 +270,11 @@ if is_enabled CONFIG_MODULES; then INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install rm -f "$tmpdir/lib/modules/$version/build" rm -f "$tmpdir/lib/modules/$version/source" - if [ "$ARCH" = "um" ] ; then + if [ "$ARCH" = "um" ]; then mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" rmdir "$tmpdir/lib/modules/$version" fi - if [ -n "$BUILD_DEBUG" ] ; then + if [ -n "$BUILD_DEBUG" ]; then for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do module=lib/modules/$module mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) @@ -291,22 +299,22 @@ fi # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and # so do we; recent versions of dracut and initramfs-tools will obey this. debhookdir=${KDEB_HOOKDIR:-/etc/kernel} -for script in postinst postrm preinst prerm ; do +for script in postinst postrm preinst prerm; do mkdir -p "$tmpdir$debhookdir/$script.d" - cat < "$tmpdir/DEBIAN/$script" -#!/bin/bash + cat <<- EOF > "$tmpdir/DEBIAN/$script" + #!/bin/bash -set -e + set -e -# Pass maintainer script parameters to hook scripts -export DEB_MAINT_PARAMS="\$*" + # Pass maintainer script parameters to hook scripts + export DEB_MAINT_PARAMS="\$*" -# Tell initramfs builder whether it's wanted -export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) + # Tell initramfs builder whether it's wanted + export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) -test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d -exit 0 -EOF + test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d + exit 0 + EOF chmod 755 "$tmpdir/DEBIAN/$script" done @@ -314,38 +322,38 @@ done ## Create sym link to kernel image ## sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst -cat >> $tmpdir/DEBIAN/postinst << EOT -ln -sf $(basename $installed_image_path) /boot/$image_name 2> /dev/null || mv /$installed_image_path /boot/$image_name -touch /boot/.next -exit 0 +cat >> $tmpdir/DEBIAN/postinst <<- EOT + ln -sf $(basename $installed_image_path) /boot/$image_name 2> /dev/null || mv /$installed_image_path /boot/$image_name + touch /boot/.next + exit 0 EOT ## ## FAT install workaround ## sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst -cat >> $tmpdir/DEBIAN/preinst <> $tmpdir/DEBIAN/preinst <<- EOT + # exit if we are running chroot + if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi -check_and_unmount (){ - boot_device=\$(mountpoint -d /boot) + check_and_unmount (){ + boot_device=\$(mountpoint -d /boot) - for file in /dev/* ; do - CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) - if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then - boot_partition=\$file - break + for file in /dev/* ; do + CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) + if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then + boot_partition=\$file + break + fi + done + bootfstype=\$(blkid -s TYPE -o value \$boot_partition) + if [ "\$bootfstype" = "vfat" ]; then + umount /boot + rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage fi - done - bootfstype=\$(blkid -s TYPE -o value \$boot_partition) - if [ "\$bootfstype" = "vfat" ]; then - umount /boot - rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage - fi -} -mountpoint -q /boot && check_and_unmount -exit 0 + } + mountpoint -q /boot && check_and_unmount + exit 0 EOT create_package "$packagename" "$tmpdir" @@ -360,7 +368,7 @@ if [ "$ARCH" != "um" ]; then create_package $libc_headers_packagename $libc_headers_dir if is_enabled CONFIG_MODULES; then - if is_native ; then + if is_native; then # echo "Skip scripts folder cleaning" >&2 # echo "Skip creating postinst prerm scripts for headers" >&2 deploy_kernel_headers $kernel_headers_dir @@ -368,7 +376,10 @@ if [ "$ARCH" != "um" ]; then else # Clean up the executables that are left over from # cross-compilation for a different host architecture. - (cd $srctree; make M=scripts clean;) + ( + cd $srctree + make M=scripts clean + ) deploy_kernel_headers $kernel_headers_dir create_package $kernel_headers_packagename $kernel_headers_dir "headers" fi @@ -376,7 +387,7 @@ if [ "$ARCH" != "um" ]; then fi -if [ -n "$BUILD_DEBUG" ] ; then +if [ -n "$BUILD_DEBUG" ]; then # Build debug package # Different tools want the image in different locations # perf