arch-hyperland/install-scripts/nvidia.sh

130 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
#=============================================================================
# NVIDIA Configuration Script
# Configures NVIDIA drivers for Hyprland
#=============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/lib.sh"
init_installer
print_header "NVIDIA Driver Configuration"
# Detect NVIDIA GPU
if ! lspci | grep -qi nvidia; then
echo -e "${WARN} No NVIDIA GPU detected. Skipping..."
exit 0
fi
echo -e "${INFO} NVIDIA GPU detected. Installing drivers..."
# Determine driver package based on GPU
gpu_info=$(lspci | grep -i nvidia | head -1)
echo -e "${NOTE} GPU: $gpu_info"
# Package list
nvidia_pkgs=(
linux-headers
nvidia-dkms
nvidia-utils
lib32-nvidia-utils
nvidia-settings
libva-nvidia-driver
egl-wayland
)
# Install packages
echo -e "\n${NOTE} Installing NVIDIA packages..."
for pkg in "${nvidia_pkgs[@]}"; do
install_pkg "$pkg" || true
done
# Create modprobe configuration
echo -e "\n${NOTE} Configuring kernel modules..."
sudo mkdir -p /etc/modprobe.d
# Main NVIDIA configuration
cat << 'EOF' | sudo tee /etc/modprobe.d/nvidia.conf > /dev/null
# Enable DRM kernel mode setting
options nvidia_drm modeset=1 fbdev=1
# Preserve video memory for suspend/hibernate
options nvidia NVreg_PreserveVideoMemoryAllocations=1
# Disable GSP firmware (may help with some issues)
# options nvidia NVreg_EnableGpuFirmware=0
EOF
# Blacklist nouveau
cat << 'EOF' | sudo tee /etc/modprobe.d/blacklist-nouveau.conf > /dev/null
# Blacklist nouveau (open source NVIDIA driver)
blacklist nouveau
options nouveau modeset=0
EOF
echo -e "${OK} Kernel module configuration created"
# Configure mkinitcpio
echo -e "\n${NOTE} Updating mkinitcpio configuration..."
if [[ -f /etc/mkinitcpio.conf ]]; then
# Backup original
sudo cp /etc/mkinitcpio.conf /etc/mkinitcpio.conf.backup
# Add nvidia modules if not present
if ! grep -q "nvidia nvidia_modeset nvidia_uvm nvidia_drm" /etc/mkinitcpio.conf; then
sudo sed -i 's/MODULES=(\(.*\))/MODULES=(\1 nvidia nvidia_modeset nvidia_uvm nvidia_drm)/' /etc/mkinitcpio.conf
# Clean up double spaces
sudo sed -i 's/MODULES=( /MODULES=(/' /etc/mkinitcpio.conf
fi
fi
# Regenerate initramfs
echo -e "${NOTE} Regenerating initramfs..."
sudo mkinitcpio -P
# Enable NVIDIA services for suspend/hibernate
echo -e "\n${NOTE} Enabling NVIDIA power management services..."
sudo systemctl enable nvidia-suspend.service 2>/dev/null || true
sudo systemctl enable nvidia-hibernate.service 2>/dev/null || true
sudo systemctl enable nvidia-resume.service 2>/dev/null || true
# Create environment variables file for Hyprland
echo -e "\n${NOTE} Creating Hyprland environment configuration..."
mkdir -p "$HOME/.config/hypr"
cat << 'EOF' > "$HOME/.config/hypr/nvidia.conf"
# NVIDIA Environment Variables for Hyprland
# Source this in your hyprland.conf: source = ~/.config/hypr/nvidia.conf
env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = GBM_BACKEND,nvidia-drm
# Cursor fix
env = WLR_NO_HARDWARE_CURSORS,1
# Force GBM as buffer backend
env = __GL_GSYNC_ALLOWED,1
env = __GL_VRR_ALLOWED,1
# Use Wayland where possible
env = QT_QPA_PLATFORM,wayland;xcb
env = GDK_BACKEND,wayland,x11
env = SDL_VIDEODRIVER,wayland
env = CLUTTER_BACKEND,wayland
env = XDG_SESSION_TYPE,wayland
env = XDG_CURRENT_DESKTOP,Hyprland
# Firefox Wayland
env = MOZ_ENABLE_WAYLAND,1
EOF
echo -e "${OK} NVIDIA configuration complete!"
echo -e "${NOTE} Environment file created: ~/.config/hypr/nvidia.conf"
echo -e "${WARN} Please reboot your system for changes to take effect."