From 88f4d62fe95f57fb56a90a767bc36dd9470f3b05 Mon Sep 17 00:00:00 2001 From: "Mariya T." <235426764+sigreturn@users.noreply.github.com> Date: Mon, 29 Dec 2025 23:41:46 -0500 Subject: [PATCH 1/2] fix: update nvidia driver installation for packaging changes --- archinstall/lib/hardware.py | 21 ++++++++++----------- archinstall/lib/models/profile.py | 11 +++++++++-- archinstall/lib/profile/profiles_handler.py | 20 ++++++++++++++++---- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/archinstall/lib/hardware.py b/archinstall/lib/hardware.py index 3e675f32b4..46442d03b1 100644 --- a/archinstall/lib/hardware.py +++ b/archinstall/lib/hardware.py @@ -43,7 +43,7 @@ class GfxPackage(Enum): LibvaMesaDriver = 'libva-mesa-driver' LibvaNvidiaDriver = 'libva-nvidia-driver' Mesa = 'mesa' - NvidiaDkms = 'nvidia-dkms' + NvidiaOpen = 'nvidia-open' NvidiaOpenDkms = 'nvidia-open-dkms' VulkanIntel = 'vulkan-intel' VulkanRadeon = 'vulkan-radeon' @@ -61,12 +61,18 @@ class GfxDriver(Enum): IntelOpenSource = 'Intel (open-source)' NvidiaOpenKernel = 'Nvidia (open kernel module for newer GPUs, Turing+)' NvidiaOpenSource = 'Nvidia (open-source nouveau driver)' - NvidiaProprietary = 'Nvidia (proprietary)' VMOpenSource = 'VirtualBox (open-source)' + def has_dkms_variant(self) -> bool: + match self: + case GfxDriver.NvidiaOpenKernel: + return True + case _: + return False + def is_nvidia(self) -> bool: match self: - case GfxDriver.NvidiaProprietary | GfxDriver.NvidiaOpenSource | GfxDriver.NvidiaOpenKernel: + case GfxDriver.NvidiaOpenKernel: return True case _: return False @@ -114,8 +120,7 @@ def gfx_packages(self) -> list[GfxPackage]: ] case GfxDriver.NvidiaOpenKernel: packages += [ - GfxPackage.NvidiaOpenDkms, - GfxPackage.Dkms, + GfxPackage.NvidiaOpen, GfxPackage.LibvaNvidiaDriver, ] case GfxDriver.NvidiaOpenSource: @@ -125,12 +130,6 @@ def gfx_packages(self) -> list[GfxPackage]: GfxPackage.LibvaMesaDriver, GfxPackage.VulkanNouveau, ] - case GfxDriver.NvidiaProprietary: - packages += [ - GfxPackage.NvidiaDkms, - GfxPackage.Dkms, - GfxPackage.LibvaNvidiaDriver, - ] case GfxDriver.VMOpenSource: packages += [ GfxPackage.Mesa, diff --git a/archinstall/lib/models/profile.py b/archinstall/lib/models/profile.py index 80cbde7a19..3352fc0557 100644 --- a/archinstall/lib/models/profile.py +++ b/archinstall/lib/models/profile.py @@ -28,7 +28,7 @@ def json(self) -> _ProfileConfigurationSerialization: return { 'profile': profile_handler.to_json(self.profile), - 'gfx_driver': self.gfx_driver.value if self.gfx_driver else None, + 'gfx_driver': self.gfx_driver.name if self.gfx_driver else None, 'greeter': self.greeter.value if self.greeter else None, } @@ -40,8 +40,15 @@ def parse_arg(cls, arg: _ProfileConfigurationSerialization) -> 'ProfileConfigura greeter = arg.get('greeter', None) gfx_driver = arg.get('gfx_driver', None) + _gfx_driver: GfxDriver | None = None + if gfx_driver: + try: + _gfx_driver = GfxDriver(gfx_driver) + except Exception: + _gfx_driver = GfxDriver[gfx_driver] + return ProfileConfiguration( profile, - GfxDriver(gfx_driver) if gfx_driver else None, + _gfx_driver if _gfx_driver else None, GreeterType(greeter) if greeter else None, ) diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index 96ce476aba..c8841b104d 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -13,7 +13,7 @@ from archinstall.lib.translationhandler import tr from ...default_profiles.profile import GreeterType, Profile -from ..hardware import GfxDriver +from ..hardware import GfxDriver, GfxPackage from ..models.profile import ProfileConfiguration from ..networking import fetch_data_from_url, list_interfaces from ..output import debug, error, info @@ -229,12 +229,24 @@ def install_greeter(self, install_session: 'Installer', greeter: GreeterType) -> def install_gfx_driver(self, install_session: 'Installer', driver: GfxDriver) -> None: debug(f'Installing GFX driver: {driver.value}') - if driver in [GfxDriver.NvidiaOpenKernel, GfxDriver.NvidiaProprietary]: + driver_pkgs = driver.gfx_packages() + # All non-standard kernel packages have a '-' in their name. + # ex: 'linux-zen' and 'linux-lts' + are_dkms_needed = any('-' in s for s in install_session.kernels) + + if driver.has_dkms_variant() and are_dkms_needed: + debug(f'A non-standard kernel was selected, installing DKMS variant of {driver.value}') + + install_session.add_additional_packages(GfxPackage.Dkms.value) + headers = [f'{kernel}-headers' for kernel in install_session.kernels] - # Fixes https://github.com/archlinux/archinstall/issues/585 install_session.add_additional_packages(headers) - driver_pkgs = driver.gfx_packages() + match driver: + case GfxDriver.NvidiaOpenKernel: + driver_pkgs.remove(GfxPackage.NvidiaOpen) + driver_pkgs.append(GfxPackage.NvidiaOpenDkms) + pkg_names = [p.value for p in driver_pkgs] install_session.add_additional_packages(pkg_names) From cfdeffd2fdad43095f59bf1b82657b416bf6c3b4 Mon Sep 17 00:00:00 2001 From: "Mariya T." <235426764+sigreturn@users.noreply.github.com> Date: Mon, 29 Dec 2025 23:56:53 -0500 Subject: [PATCH 2/2] fix: backwards compatability for older nvidia configs --- archinstall/lib/models/profile.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/archinstall/lib/models/profile.py b/archinstall/lib/models/profile.py index 3352fc0557..68904cc21f 100644 --- a/archinstall/lib/models/profile.py +++ b/archinstall/lib/models/profile.py @@ -42,13 +42,20 @@ def parse_arg(cls, arg: _ProfileConfigurationSerialization) -> 'ProfileConfigura _gfx_driver: GfxDriver | None = None if gfx_driver: - try: - _gfx_driver = GfxDriver(gfx_driver) - except Exception: - _gfx_driver = GfxDriver[gfx_driver] + # Note: This is for backwards compatability with older configs. + # We fall back to the open-source nouveau driver here because if + # we end up installing the open kernel modules on a machine with pre-Turing + # hardware, the user will end up with a broken install (unresponsive black screen). + if gfx_driver == 'Nvidia (proprietary)': + _gfx_driver = GfxDriver.NvidiaOpenSource + else: + try: + _gfx_driver = GfxDriver(gfx_driver) + except Exception: + _gfx_driver = GfxDriver[gfx_driver] return ProfileConfiguration( profile, - _gfx_driver if _gfx_driver else None, + _gfx_driver, GreeterType(greeter) if greeter else None, )