From ab12663f64e47022f3e13dce6c5b17dcd7692f9b Mon Sep 17 00:00:00 2001 From: Robert Sturla Date: Thu, 8 Aug 2024 00:17:49 +0100 Subject: [PATCH] feat: build nvidia open source kernel module (#220) Co-authored-by: Kyle Gospodnetich --- .github/workflows/reusable-build.yml | 1 + Containerfile.nvidia | 2 +- Containerfile.nvidia-open | 63 ++++++++++++++++++++++++++++ build-kmod-nvidia.sh | 6 ++- 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 Containerfile.nvidia-open diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml index 82948e7d..31c07e5b 100644 --- a/.github/workflows/reusable-build.yml +++ b/.github/workflows/reusable-build.yml @@ -38,6 +38,7 @@ jobs: - common - extra - nvidia + - nvidia-open - zfs exclude: - fedora_version: 39 diff --git a/Containerfile.nvidia b/Containerfile.nvidia index 2107eaf7..6569f72a 100644 --- a/Containerfile.nvidia +++ b/Containerfile.nvidia @@ -48,7 +48,7 @@ RUN --mount=type=cache,dst=/var/cache/dnf \ ; else \ export KERNEL_NAME="kernel-surface" \ ; fi && \ - /tmp/build-kmod-nvidia.sh 550 && \ + /tmp/build-kmod-nvidia.sh kernel && \ /tmp/dual-sign.sh && \ for RPM in $(find /var/cache/akmods/ -type f -name \*.rpm); do \ cp "${RPM}" /var/cache/rpms/kmods/; \ diff --git a/Containerfile.nvidia-open b/Containerfile.nvidia-open new file mode 100644 index 00000000..71f008de --- /dev/null +++ b/Containerfile.nvidia-open @@ -0,0 +1,63 @@ +### +### Containerfile.nvidia - used to build ONLY NVIDIA kmods +### + +ARG FEDORA_MAJOR_VERSION="${FEDORA_MAJOR_VERSION:-40}" +ARG KERNEL_FLAVOR="${KERNEL_FLAVOR:-main}" +ARG KERNEL_IMAGE="${KERNEL_IMAGE:-${KERNEL_FLAVOR}-kernel}" +ARG KERNEL_ORG="${KERNEL_ORG:-ublue-os}" +ARG KERNEL_BASE="ghcr.io/${KERNEL_ORG}/${KERNEL_IMAGE}:${FEDORA_MAJOR_VERSION}" +ARG BUILDER_IMAGE="${BUILDER_IMAGE:-quay.io/fedora/fedora}" +ARG BUILDER_BASE="${BUILDER_IMAGE}:${FEDORA_MAJOR_VERSION}" +FROM ${KERNEL_BASE} AS kernel_cache +FROM ${BUILDER_BASE} AS builder + +ARG FEDORA_MAJOR_VERSION="${FEDORA_MAJOR_VERSION:-40}" +ARG KERNEL_FLAVOR="${KERNEL_FLAVOR:-main}" +ARG RPMFUSION_MIRROR="" +ARG DUAL_SIGN="true" + +COPY build*.sh dual-sign*.sh /tmp/ +COPY certs /tmp/certs + +# cached kernel rpms +COPY --from=kernel_cache /tmp/rpms /tmp/kernel_cache + +# files for nvidia +COPY ublue-os-nvidia-addons.spec /tmp/ublue-os-nvidia-addons/ublue-os-nvidia-addons.spec +COPY ublue-os-ucore-nvidia.spec /tmp/ublue-os-ucore-nvidia/ublue-os-ucore-nvidia.spec +COPY files/etc/sway/environment /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/environment +COPY files/usr/lib/systemd/system/ublue-nvctk-cdi.service /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/ublue-nvctk-cdi.service +COPY files/usr/lib/systemd/system/ublue-nvctk-cdi.service /tmp/ublue-os-ucore-nvidia/rpmbuild/SOURCES/ublue-nvctk-cdi.service +COPY files/usr/lib/systemd/system-preset/70-ublue-nvctk-cdi.preset /tmp/ublue-os-nvidia-addons/rpmbuild/SOURCES/70-ublue-nvctk-cdi.preset +COPY files/usr/lib/systemd/system-preset/70-ublue-nvctk-cdi.preset /tmp/ublue-os-ucore-nvidia/rpmbuild/SOURCES/70-ublue-nvctk-cdi.preset + + +RUN --mount=type=cache,dst=/var/cache/dnf \ + /tmp/build-prep.sh && \ + if [[ "${KERNEL_FLAVOR}" =~ "coreos" ]]; then \ + /tmp/build-ublue-os-ucore-nvidia.sh && \ + cp /tmp/ublue-os-ucore-nvidia/rpmbuild/RPMS/noarch/ublue-os-ucore-nvidia*.rpm \ + /var/cache/rpms/ucore/ \ + ; fi && \ + /tmp/build-ublue-os-nvidia-addons.sh && \ + cp /tmp/ublue-os-nvidia-addons/rpmbuild/RPMS/noarch/ublue-os-nvidia-addons*.rpm \ + /var/cache/rpms/ublue-os/ && \ + if grep -qv "surface" <<< "${KERNEL_FLAVOR}"; then \ + export KERNEL_NAME="kernel" \ + ; else \ + export KERNEL_NAME="kernel-surface" \ + ; fi && \ + /tmp/build-kmod-nvidia.sh kernel-open && \ + /tmp/dual-sign.sh && \ + for RPM in $(find /var/cache/akmods/ -type f -name \*.rpm); do \ + cp "${RPM}" /var/cache/rpms/kmods/; \ + done && \ + for RPM in $(find /root/rpmbuild/RPMS/"$(uname -m)"/ -type f -name \*.rpm); do \ + cp "${RPM}" /var/cache/rpms/kmods/; \ + done && \ + find /var/cache/rpms + +FROM scratch + +COPY --from=builder /var/cache/rpms /rpms diff --git a/build-kmod-nvidia.sh b/build-kmod-nvidia.sh index 79f1e112..64f50fc1 100755 --- a/build-kmod-nvidia.sh +++ b/build-kmod-nvidia.sh @@ -3,6 +3,7 @@ set -oeux pipefail RELEASE="$(rpm -E '%fedora.%_arch')" +KERNEL_MODULE_TYPE="${1:-kernel}" cd /tmp @@ -20,12 +21,15 @@ rpm -qa |grep nvidia KERNEL_VERSION="$(rpm -q "${KERNEL_NAME}" --queryformat '%{VERSION}-%{RELEASE}.%{ARCH}')" NVIDIA_AKMOD_VERSION="$(basename "$(rpm -q "akmod-nvidia" --queryformat '%{VERSION}-%{RELEASE}')" ".fc${RELEASE%%.*}")" +sed -i "s/^MODULE_VARIANT=.*/MODULE_VARIANT=$KERNEL_MODULE_TYPE/" /etc/nvidia/kernel.conf akmods --force --kernels "${KERNEL_VERSION}" --kmod "nvidia" modinfo /usr/lib/modules/${KERNEL_VERSION}/extra/nvidia/nvidia{,-drm,-modeset,-peermem,-uvm}.ko.xz > /dev/null || \ (cat /var/cache/akmods/nvidia/${NVIDIA_AKMOD_VERSION}-for-${KERNEL_VERSION}.failed.log && exit 1) +# View license information +modinfo -l /usr/lib/modules/${KERNEL_VERSION}/extra/nvidia/nvidia{,-drm,-modeset,-peermem,-uvm}.ko.xz # create a directory for later copying of resulting nvidia specific artifacts mkdir -p /var/cache/rpms/kmods/nvidia @@ -33,7 +37,7 @@ mkdir -p /var/cache/rpms/kmods/nvidia cat < /var/cache/rpms/kmods/nvidia-vars KERNEL_VERSION=${KERNEL_VERSION} +KERNEL_MODULE_TYPE=${KERNEL_MODULE_TYPE} RELEASE=${RELEASE} NVIDIA_AKMOD_VERSION=${NVIDIA_AKMOD_VERSION} EOF -