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] 5441c76f1f
This commit is contained in:
renner 2026-09-27 05:34:12 +00:00 committed by GitHub
parent 69d181f306
commit a76fa2e80c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,29 +4,52 @@ echo "::group:: ===$(basename "$0")==="
set -eoux pipefail set -eoux pipefail
# Remove Existing Kernel KERNEL_PKGS_ORIG=(kernel kernel-{core,modules,modules-core,modules-extra,tools-libs,tools})
for pkg in kernel kernel{-core,-modules,-modules-core,-modules-extra,-tools-libs,-tools}; do
rpm --erase "${pkg}" --nodeps # removing them all at once is slower
for pkg in "${KERNEL_PKGS_ORIG[@]}"; do
rpm --erase "${pkg}" --nodeps
done done
# cleanup leftovers that are not covered by kernel-* packages for some reason # cleanup leftovers that are not covered by kernel-* packages for some reason
rm -rf /usr/lib/modules rm -rf /usr/lib/modules
# Install Kernel KERNEL_PKGS=(
dnf5 -y install \ /tmp/kernel-rpms/kernel-[0-9]*.rpm
/tmp/kernel-rpms/kernel-[0-9]*.rpm \ /tmp/kernel-rpms/kernel-core-*.rpm
/tmp/kernel-rpms/kernel-core-*.rpm \ /tmp/kernel-rpms/kernel-modules-*.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 if [[ "${IMAGE_FLAVOR}" == "dx" ]]; then
dnf -y install /tmp/kernel-rpms/kernel-devel-*.rpm KERNEL_PKGS+=(/tmp/kernel-rpms/kernel-devel-*.rpm)
fi 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 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 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