nvidia-oc/scripts/install-service.sh
2026-01-16 04:59:29 -08:00

107 lines
3.9 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SERVICE_FILE="$PROJECT_ROOT/systemd/nvidia-oc.service"
INSTALL_PATH="/etc/systemd/system/nvidia-oc.service"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}NVIDIA OC Service Installation${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Check if running as root
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}Error: This script must be run as root${NC}"
echo -e "${YELLOW}Usage: sudo $0${NC}"
exit 1
fi
# Check if service file exists
if [[ ! -f "$SERVICE_FILE" ]]; then
echo -e "${RED}Error: Service file not found at $SERVICE_FILE${NC}"
exit 1
fi
echo -e "${YELLOW}Step 1/7: Checking prerequisites...${NC}"
# Check if nvidia-oc binary exists
if ! command -v nvidia-oc &> /dev/null; then
echo -e "${YELLOW}Warning: nvidia-oc command not found in PATH${NC}"
echo -e "${YELLOW}You may need to install the package or update ExecStart in the service file${NC}"
fi
# Check session type - X11 required for overclocking
echo -e "${YELLOW}Step 2/7: Checking display server compatibility...${NC}"
SESSION_TYPE="${XDG_SESSION_TYPE:-unknown}"
if [ -d "/usr/share/xsessions" ] && [ "$(ls -A /usr/share/xsessions 2>/dev/null)" ]; then
echo -e "${GREEN}✓ X11 sessions available${NC}"
else
echo -e "${YELLOW}⚠ Note: No X11 sessions found - using nvidia-smi backend${NC}"
echo -e "${YELLOW}nvidia-oc supports two overclocking backends:${NC}"
echo
echo -e "${GREEN} nvidia-settings (X11):${NC} Offset-based control (+150 MHz)"
echo -e "${GREEN} nvidia-smi (Wayland):${NC} Clock locking (absolute frequencies)"
echo
echo -e "${YELLOW}Your system will use nvidia-smi backend (works on Wayland).${NC}"
echo -e "${YELLOW}Both backends provide full overclocking functionality.${NC}"
echo
fi
# Create necessary directories
echo -e "${YELLOW}Step 3/7: Creating system directories...${NC}"
mkdir -p /var/lib/nvidia-oc/static
mkdir -p /etc/nvidia-oc
echo -e "${GREEN}✓ Directories created${NC}"
# Create sudoers configuration
echo -e "${YELLOW}Step 4/7: Creating sudoers configuration...${NC}"
cat <<EOF > /etc/sudoers.d/nvidia-oc
# Allow root to run nvidia-settings as any user (for nvidia-oc service)
# This enables the systemd service to run nvidia-settings as the logged-in
# user to access X server for GPU clock control
root ALL=(ALL) NOPASSWD: /usr/bin/nvidia-settings
EOF
chmod 440 /etc/sudoers.d/nvidia-oc
echo -e "${GREEN}✓ Sudoers configuration created${NC}"
# Copy service file
echo -e "${YELLOW}Step 5/7: Installing service file...${NC}"
cp "$SERVICE_FILE" "$INSTALL_PATH"
chmod 644 "$INSTALL_PATH"
echo -e "${GREEN}✓ Service file installed to $INSTALL_PATH${NC}"
# Reload systemd
echo -e "${YELLOW}Step 6/7: Reloading systemd daemon...${NC}"
systemctl daemon-reload
echo -e "${GREEN}✓ Systemd daemon reloaded${NC}"
# Enable service
echo -e "${YELLOW}Step 7/7: Enabling service...${NC}"
systemctl enable nvidia-oc.service
echo -e "${GREEN}✓ Service enabled${NC}"
echo
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}Installation Complete!${NC}"
echo -e "${BLUE}========================================${NC}"
echo
echo -e "${YELLOW}Service Status:${NC}"
systemctl status nvidia-oc.service --no-pager || true
echo
echo -e "${YELLOW}Next Steps:${NC}"
echo -e " 1. Deploy frontend: ${BLUE}$PROJECT_ROOT/upgrade${NC}"
echo -e " 2. Start service: ${BLUE}sudo systemctl start nvidia-oc${NC}"
echo -e " 3. View logs: ${BLUE}sudo journalctl -u nvidia-oc -f${NC}"
echo -e " 4. Check health: ${BLUE}curl http://localhost:9420/health${NC}"
echo
echo -e "${YELLOW}The service will start automatically on boot.${NC}"