diff --git a/files/scripts/cachyos-kernel.sh b/files/scripts/cachyos-kernel.sh index e2d5ea4..66bd1cc 100644 --- a/files/scripts/cachyos-kernel.sh +++ b/files/scripts/cachyos-kernel.sh @@ -19,23 +19,59 @@ KERNEL_PACKAGES=( kernel-cachyos-lto-modules ) +# Disable kernel-install hooks so they don't trigger inside the container +# build environment. The initramfs will be generated explicitly below. pushd /usr/lib/kernel/install.d 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 popd +# Erase stock Fedora kernel RPMs from the package database for pkg in kernel kernel-core kernel-modules kernel-modules-core; do rpm --erase "$pkg" --nodeps || true done -CURRENT_MODULES=$(ls /usr/lib/modules | head -n1) -if [ -n "$CURRENT_MODULES" ]; then - rm -rf "/usr/lib/modules/$CURRENT_MODULES" -fi +# Remove ALL existing kernel module directories. The original script used +# `head -n1` which only removed the first entry — on Kinoite's base image +# there are typically two kernel versions, leaving an orphaned module +# directory that confuses rpm-ostree/bootc at deploy time. +for KVER in $(ls /usr/lib/modules 2>/dev/null); do + rm -rf "/usr/lib/modules/$KVER" +done dnf5 -y install "${KERNEL_PACKAGES[@]}" dnf5 versionlock add "${KERNEL_PACKAGES[@]}" || true +# Identify the newly installed CachyOS kernel version +NEW_KVER=$(ls /usr/lib/modules | head -n1) + +# Ensure vmlinuz is at the path expected by rpm-ostree and bootc for boot +# entry generation. Some COPR kernel RPMs only install vmlinuz to /boot and +# not to /usr/lib/modules//vmlinuz; copy it over if missing. +if [ ! -f "/usr/lib/modules/${NEW_KVER}/vmlinuz" ]; then + if [ -f "/boot/vmlinuz-${NEW_KVER}" ]; then + cp "/boot/vmlinuz-${NEW_KVER}" "/usr/lib/modules/${NEW_KVER}/vmlinuz" + else + echo "ERROR: vmlinuz not found for kernel ${NEW_KVER}" >&2 + exit 1 + fi +fi + +# Generate the initramfs inside the container image so that rpm-ostree and +# bootc can use it directly at deploy time. Without this step, Kinoite boots +# with no initramfs and hits a dracut emergency shell (the "wall of errors"). +# --no-hostonly : include all drivers, not just the CI build host's hardware +# --add ostree : include the ostree dracut module for atomic deployments +dracut \ + --reproducible \ + --no-hostonly \ + --add "ostree" \ + --force \ + "/usr/lib/modules/${NEW_KVER}/initrd" \ + "${NEW_KVER}" + +# Atomic images manage /boot via the bootloader layer; clear any kernel +# files the RPM dropped there. rm -rf /boot/* diff --git a/recipes/common/fedora-packages.yml b/recipes/common/fedora-packages.yml index d7f197c..4c7526d 100644 --- a/recipes/common/fedora-packages.yml +++ b/recipes/common/fedora-packages.yml @@ -28,7 +28,6 @@ modules: - alacritty - ripgrep - fd-find - - realtime-setup - zoxide - fzf