From a76fa2e80c2adc04c448ad634bb0c4e95bb1bc05 Mon Sep 17 00:00:00 2001 From: renner <80410025+renner0e@users.noreply.github.com> Date: Sun, 27 Sep 2026 05:34:12 +0000 Subject: [PATCH] refactor: faster kernel installation with a shim (#2926) This is taken from [1]. We were for no good reason regenerating the initramfs here. We can also install the kmods with the kernel in one step so I don't see why we shouldn't just do that. It reduces the amount of time needed to run this script (on my machine) from 49s to 28s. I'm not sure if this is an oversight in rpm-ostree, we could technically use the initramfs that is built during this stage, however, we lose quite a bit of control, which we definitively want to have. Also it should generally be noticable when the v4l2 and xone kmods fail to install. There also haven't been problem regarding that in quite a while. [1] https://github.com/ublue-os/main/commit/5441c76f1f4be8372a8ca9f42c833ba7d4f38f45 --- .../base/02-install-common-kernel-akmods.sh | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/build_scripts/base/02-install-common-kernel-akmods.sh b/build_scripts/base/02-install-common-kernel-akmods.sh index f10cb44a..72bbe9ce 100755 --- a/build_scripts/base/02-install-common-kernel-akmods.sh +++ b/build_scripts/base/02-install-common-kernel-akmods.sh @@ -4,29 +4,52 @@ echo "::group:: ===$(basename "$0")===" set -eoux pipefail -# Remove Existing Kernel -for pkg in kernel kernel{-core,-modules,-modules-core,-modules-extra,-tools-libs,-tools}; do - rpm --erase "${pkg}" --nodeps +KERNEL_PKGS_ORIG=(kernel kernel-{core,modules,modules-core,modules-extra,tools-libs,tools}) + +# removing them all at once is slower +for pkg in "${KERNEL_PKGS_ORIG[@]}"; do + rpm --erase "${pkg}" --nodeps done # cleanup leftovers that are not covered by kernel-* packages for some reason rm -rf /usr/lib/modules -# Install Kernel -dnf5 -y install \ - /tmp/kernel-rpms/kernel-[0-9]*.rpm \ - /tmp/kernel-rpms/kernel-core-*.rpm \ - /tmp/kernel-rpms/kernel-modules-*.rpm +KERNEL_PKGS=( + /tmp/kernel-rpms/kernel-[0-9]*.rpm + /tmp/kernel-rpms/kernel-core-*.rpm + /tmp/kernel-rpms/kernel-modules-*.rpm +) + +KMODS=( + /tmp/rpms/{common,kmods}/*xone*.rpm + /tmp/rpms/{common,kmods}/*v4l2loopback*.rpm +) if [[ "${IMAGE_FLAVOR}" == "dx" ]]; then - dnf -y install /tmp/kernel-rpms/kernel-devel-*.rpm + KERNEL_PKGS+=(/tmp/kernel-rpms/kernel-devel-*.rpm) fi -dnf5 versionlock add kernel kernel-devel kernel-devel-matched kernel-core kernel-modules kernel-modules-core kernel-modules-extra +KERNEL_PKGS_ALL=( "${KERNEL_PKGS[@]}" "${KMODS[@]}" ) -dnf -y install /tmp/rpms/{common,kmods}/*xone*.rpm || true +# shims to bypass kernel install triggering dracut/rpm-ostree +# this is really ugly, skipping scriplets might be not a good idea +cd /usr/lib/kernel/install.d \ +&& mv 05-rpmostree.install 05-rpmostree.install.bak \ +&& mv 50-dracut.install 50-dracut.install.bak \ +&& printf '%s\n' '#!/bin/sh' 'exit 0' > 05-rpmostree.install \ +&& printf '%s\n' '#!/bin/sh' 'exit 0' > 50-dracut.install \ +&& chmod +x 05-rpmostree.install 50-dracut.install -dnf -y install /tmp/rpms/{kmods,common}/*v4l2loopback*.rpm || true +dnf -y install "${KERNEL_PKGS_ALL[@]}" + +# restore original kernel install +mv -f 05-rpmostree.install.bak 05-rpmostree.install \ +&& mv -f 50-dracut.install.bak 50-dracut.install +cd - + +KERNEL_VERSIONLOCK=( "${KERNEL_PKGS_ORIG[@]}" kernel-devel{-matched,} ) + +dnf versionlock add "${KERNEL_VERSIONLOCK[@]}" mkdir -p /etc/pki/akmods/certs ghcurl "https://github.com/ublue-os/akmods/raw/refs/heads/main/certs/public_key.der" --retry 3 -Lo /etc/pki/akmods/certs/akmods-ublue.der