From ff92ea3b49a9fe3ba9c89adef4488862d0b8217f Mon Sep 17 00:00:00 2001 From: Vasiliy Stelmachenok Date: Sun, 18 May 2025 19:49:34 +0300 Subject: [PATCH] Use smart NVIDIA module loading on boot This not only saves users from hard choices at boot, but also saves us from a bunch of workarounds to avoid conflicts with Nouveau. Should fix most of the black screen issues when booting ISO (but it's not for sure...) Signed-off-by: Vasiliy Stelmachenok --- .../etc/modprobe.d/nvidia-loader.conf | 6 ++++ .../usr/local/bin/nvidia-module-loader | 35 +++++++++++++++++++ archiso/packages_desktop.x86_64 | 2 +- archiso/pacman.conf | 7 ++-- archiso/profiledef.sh | 1 + 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 archiso/airootfs/etc/modprobe.d/nvidia-loader.conf create mode 100755 archiso/airootfs/usr/local/bin/nvidia-module-loader diff --git a/archiso/airootfs/etc/modprobe.d/nvidia-loader.conf b/archiso/airootfs/etc/modprobe.d/nvidia-loader.conf new file mode 100644 index 0000000..9b7e518 --- /dev/null +++ b/archiso/airootfs/etc/modprobe.d/nvidia-loader.conf @@ -0,0 +1,6 @@ +# Forwards all NVIDIA module load requests to a "smart" loader that selects +# correct version of the module depending on used hardware. +install nvidia /usr/local/bin/nvidia-module-loader +install nvidia_drm /usr/local/bin/nvidia-module-loader +install nvidia_uvm /usr/local/bin/nvidia-module-loader +install nvidia_modeset /usr/local/bin/nvidia-module-loader diff --git a/archiso/airootfs/usr/local/bin/nvidia-module-loader b/archiso/airootfs/usr/local/bin/nvidia-module-loader new file mode 100755 index 0000000..d1558af --- /dev/null +++ b/archiso/airootfs/usr/local/bin/nvidia-module-loader @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Quick pass if one of the modules is already loaded. +if [[ -e /sys/module/nvidia || -e /sys/module/nouveau ]]; then + exit 0 +fi + +# Using "install" in modprobe seems to result in no dependency resolving for +# modules, so we have to manually set the order in which all modules are loaded +# at once. +load_nvidia_modules() { + local pkgname="$1" + + # Load some basic dependencies of nvidia modules + modprobe video + modprobe drm_ttm_helper + modprobe drm_kms_helper + + for module in nvidia nvidia-modeset nvidia-drm nvidia-uvm; do + modprobe --ignore-install "/usr/share/modules/${pkgname}/${module}.ko.zst" + done +} + +# Load compatible version of NVIDIA modules for current hardware +if chwd --list | awk '{ if($2 == "nouveau" || $2 == "nvidia-dkms-390xx" || $2 == "nvidia-dkms-470xx") f=1 } END {exit (f == 1) ? 0 : 1 }'; then + modprobe nouveau +elif chwd --list | awk '{ if($2 == "nvidia-dkms") f=1 } END {exit (f == 1) ? 0 : 1 }'; then + load_nvidia_modules linux-cachyos-nvidia +elif chwd --list | awk '{ if($2 == "nvidia-open-dkms") f=1 } END {exit (f == 1) ? 0 : 1 }'; then + load_nvidia_modules linux-cachyos-nvidia-open +fi + +# Otherwise, do a fallback to nouveau anyway +if [[ ! -e /sys/module/nouveau && ! -e /sys/module/nvidia ]]; then + modprobe nouveau +fi diff --git a/archiso/packages_desktop.x86_64 b/archiso/packages_desktop.x86_64 index da0ebcb..d9ed1ed 100644 --- a/archiso/packages_desktop.x86_64 +++ b/archiso/packages_desktop.x86_64 @@ -79,7 +79,6 @@ libusb-compat libwnck3 linux-atm linux-cachyos -linux-cachyos-nvidia-open linux-cachyos-zfs linux-firmware linux-firmware-marvell @@ -115,6 +114,7 @@ nss-mdns ntfs-3g ntp nvidia-utils +nvidia-module-extractor nvme-cli occt open-iscsi diff --git a/archiso/pacman.conf b/archiso/pacman.conf index ce63856..38df853 100644 --- a/archiso/pacman.conf +++ b/archiso/pacman.conf @@ -73,9 +73,12 @@ LocalFileSigLevel = Optional # The testing repositories are disabled by default. To enable, uncomment the # repo name header and Include lines. You can add preferred servers immediately # after the header, and they will be used before the default mirrors. - [cachyos] -SigLevel = Optional TrustAll +# Yeah, that's dumb, but we have to do it for nvidia-module-extractor hook, +# since mkarchiso doesn't import the keys inside rootfs for cachyos repo before +# creating squashfs. The right solution here would be to find a way to import +# the keys properly. +SigLevel = Never Server = https://mirror.cachyos.org/repo/$arch/$repo #[core-testing] diff --git a/archiso/profiledef.sh b/archiso/profiledef.sh index 75ef41b..863f76c 100644 --- a/archiso/profiledef.sh +++ b/archiso/profiledef.sh @@ -32,4 +32,5 @@ file_permissions=( ["/usr/local/bin/removeun"]="0:0:755" ["/usr/local/bin/removeun-online"]="0:0:755" ["/usr/local/bin/prepare-live-desktop.sh"]="0:0:755" + ["/usr/local/bin/nvidia-module-loader"]="0:0:755" )