{"id":175,"date":"2026-07-03T09:22:47","date_gmt":"2026-07-03T16:22:47","guid":{"rendered":"https:\/\/andylittle.us\/?page_id=175"},"modified":"2026-07-03T09:22:47","modified_gmt":"2026-07-03T16:22:47","slug":"installing-the-nvidia-t600-driver-with-prime-render-offload-on-debian-12-dell-precision-3571","status":"publish","type":"page","link":"https:\/\/andylittle.us\/?page_id=175","title":{"rendered":"Installing the NVIDIA T600 Driver with PRIME Render Offload on Debian 12 (Dell Precision 3571)"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This guide walks through installing the proprietary NVIDIA driver on a Dell Precision 3571 (or any similar Optimus laptop with an NVIDIA T600 \/ Turing-class dGPU and Intel integrated graphics) running Debian 12 \u201cBookworm.\u201d The goal is a proper&nbsp;<strong>PRIME render offload<\/strong>&nbsp;setup: the Intel iGPU drives the desktop for good battery life, and the NVIDIA GPU stays parked until you explicitly hand it a workload (CUDA, Blender, NVENC, 3D, etc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It also documents the specific mistakes that commonly break this install, so you can avoid them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Applies to:<\/strong>&nbsp;Debian 12 (Bookworm), Optimus laptops with Intel iGPU + NVIDIA dGPU. Examples use an NVIDIA T600 Laptop GPU (Turing,&nbsp;<code>TU117<\/code>) at PCI address&nbsp;<code>01:00.0<\/code>. Adjust the PCI address to match your hardware (find it with&nbsp;<code>lspci | grep -i nvidia<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Before you start: know your starting state<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before installing anything, confirm what the system is actually running. This avoids fighting a half-configured driver. Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lspci -k -s 01:00.0            # which kernel driver is bound to the GPU?\nlsmod | grep -E 'nvidia|nouveau'   # which modules are loaded right now?\ndpkg -l | grep -i nvidia      # any NVIDIA packages already installed?\nls -la \/etc\/X11\/xorg.conf     # is there a leftover X config? (there should NOT be)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On a fresh system you will typically see the open-source&nbsp;<code>nouveau<\/code>&nbsp;driver bound to the card, no NVIDIA packages installed, and no&nbsp;<code>\/etc\/X11\/xorg.conf<\/code>. That is the clean baseline this guide assumes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If&nbsp;<code>\/etc\/X11\/xorg.conf<\/code>&nbsp;exists, deal with it first.<\/strong>&nbsp;A stale X config \u2014 usually left behind by a previous&nbsp;<code>nvidia-xconfig<\/code>&nbsp;run \u2014 is the single most common reason a \u201cclean\u201d reinstall still produces a black screen. Move it out of the way:&nbsp;<code>sudo mv \/etc\/X11\/xorg.conf \/etc\/X11\/xorg.conf.bak<\/code>. On a PRIME\/Optimus laptop you want&nbsp;<strong>no<\/strong>&nbsp;hand-written&nbsp;<code>xorg.conf<\/code>&nbsp;at all.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Enable the&nbsp;<code>non-free<\/code>&nbsp;repositories<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The NVIDIA driver lives in Debian\u2019s&nbsp;<code>non-free<\/code>&nbsp;component. Check your sources:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/apt\/sources.list<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each Bookworm line should include&nbsp;<code>contrib non-free non-free-firmware<\/code>. For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>deb http:\/\/deb.debian.org\/debian\/ bookworm main contrib non-free non-free-firmware\ndeb http:\/\/security.debian.org\/debian-security bookworm-security main contrib non-free non-free-firmware\ndeb http:\/\/deb.debian.org\/debian\/ bookworm-updates main contrib non-free non-free-firmware<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If your system uses the newer deb822 format instead, you\u2019ll have a&nbsp;<code>.sources<\/code>&nbsp;file under&nbsp;<code>\/etc\/apt\/sources.list.d\/<\/code>; add&nbsp;<code>contrib non-free non-free-firmware<\/code>&nbsp;to its&nbsp;<code>Components:<\/code>&nbsp;line rather than editing&nbsp;<code>sources.list<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Install kernel headers and the driver<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The kernel headers are not optional. Without them, DKMS has nothing to build the NVIDIA kernel module against, and the install will&nbsp;<em>silently<\/em>&nbsp;do nothing \u2014 you\u2019ll reboot and still be on nouveau with no obvious error. Install the headers first, then the driver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install linux-headers-amd64\nsudo apt install nvidia-driver mesa-utils<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The&nbsp;<code>nvidia-driver<\/code>&nbsp;metapackage pulls in&nbsp;<code>nvidia-kernel-dkms<\/code>&nbsp;and builds the module during installation.&nbsp;<code>mesa-utils<\/code>&nbsp;gives you&nbsp;<code>glxinfo<\/code>&nbsp;for verification later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Watch the two messages that appear during install<\/strong>&nbsp;\u2014 both are normal and neither is an error. They\u2019re explained next.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u201cConflicting nouveau kernel module loaded\u201d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The installer warns that nouveau is currently loaded and conflicts with the NVIDIA module. This is expected: nouveau is driving the card in your&nbsp;<em>running<\/em>&nbsp;session and can\u2019t be swapped out live. The install adds a modprobe blacklist for nouveau; the switch happens on reboot. Just acknowledge the dialog and let the install finish.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DKMS builds for the current kernel and may \u201cskip\u201d an old one<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you recently ran a system upgrade, you may have more than one kernel installed. DKMS builds the module for your current\/newest kernel and may report skipping an older one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Building for 6.1.0-XX-amd64 6.1.0-YY-amd64\nModule build for kernel 6.1.0-XX-amd64 was skipped since the\nkernel headers for this kernel do not seem to be installed.\nBuilding initial module for 6.1.0-YY-amd64<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is fine. The module is built for the kernel you\u2019ll actually boot (the newest one). The skipped kernel is just an older fallback entry in GRUB. If you want to silence the skip \u2014 for example to keep the fallback kernel bootable with NVIDIA \u2014 install headers for that specific version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install linux-headers-6.1.0-XX-amd64   # optional; replace with the skipped version<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2014 Reboot and verify<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo reboot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the machine comes back up to a normal desktop (no black screen), the Intel-drives-the-display half is already working. Now confirm the driver swap and the offload behavior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lsmod | grep -E 'nvidia|nouveau'   # want nvidia* loaded, nouveau ABSENT\nnvidia-smi                          # want the GPU listed with its driver version\nglxinfo | grep \"OpenGL renderer\"    # want Intel here (desktop on the iGPU = correct)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The desktop renderer reporting Intel is the goal, not a failure.<\/strong>&nbsp;Your everyday desktop should render on the iGPU for battery life. The NVIDIA GPU only comes into play when you explicitly offload to it (next step).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now prove the NVIDIA GPU wakes on demand:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep \"OpenGL renderer\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This one should report the NVIDIA T600. If it does, PRIME render offload is working end to end.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2014 Using the GPU (offload invocation)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To run any application on the NVIDIA GPU, prefix it with the two offload environment variables:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia &lt;application&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example, to launch a game or a 3D app on the dGPU while everything else stays on Intel. For convenience you can wrap this in a small shell alias or a&nbsp;<code>prime-run<\/code>-style helper script.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5 \u2014 Suspend\/resume and power tuning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Debian\u2019s NVIDIA package ships&nbsp;<code>\/etc\/modprobe.d\/nvidia-options.conf<\/code>&nbsp;with several power-management options present but commented out. Two of them matter on a laptop. Open the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/modprobe.d\/nvidia-options.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Uncomment these two lines (remove the leading&nbsp;<code>#<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>options nvidia-current NVreg_PreserveVideoMemoryAllocations=1\noptions nvidia-current NVreg_EnableS0ixPowerManagement=1<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\">Option<\/th><th class=\"has-text-align-left\" data-align=\"left\">What it does<\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>NVreg_PreserveVideoMemoryAllocations=1<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Saves the GPU\u2019s VRAM contents to system RAM on suspend and restores them on resume. Prevents corrupted output or a hung GPU after waking \u2014 essential on a laptop that suspends frequently. Also what makes the&nbsp;<code>nvidia-suspend<\/code>&nbsp;\/&nbsp;<code>nvidia-hibernate<\/code>&nbsp;\/&nbsp;<code>nvidia-resume<\/code>&nbsp;services function.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>NVreg_EnableS0ixPowerManagement=1<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Integrates the driver with the modern s2idle \/ s0ix low-power standby path used by current Intel laptops (including Alder Lake\u2013based machines like the Precision 3571), rather than assuming legacy deep S3 sleep.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rebuild the initramfs and reboot so the options take effect:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo update-initramfs -u\nsudo reboot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After the reboot, test a suspend\/resume cycle and confirm the display comes back cleanly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl suspend\n# wake the machine, confirm the screen restores correctly<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Optional \u2014 Fully power down the dGPU when idle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You may notice the NVIDIA GPU stays in a low but non-zero power state even when nothing is offloaded to it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/sys\/bus\/pci\/devices\/0000:01:00.0\/power\/runtime_status   # may read \"active\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To have the driver cut power to the GPU entirely (D3cold) when idle, add the aggressive dynamic power-management option as a&nbsp;<strong>separate, deliberate change<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo 'options nvidia \"NVreg_DynamicPowerManagement=0x02\"' | sudo tee \/etc\/modprobe.d\/nvidia-pm.conf\nsudo update-initramfs -u\nsudo reboot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After rebooting, re-check&nbsp;<code>runtime_status<\/code>&nbsp;(you want&nbsp;<code>suspended<\/code>)&nbsp;<strong>and re-test&nbsp;<code>systemctl suspend<\/code><\/strong>. D3cold is the one setting most likely to interfere with clean suspend\/resume or dGPU wake on some configurations. If anything misbehaves, simply remove the file (<code>sudo rm \/etc\/modprobe.d\/nvidia-pm.conf<\/code>), rebuild the initramfs, and reboot to revert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change one power option at a time and re-test suspend after each. It\u2019s the only reliable way to know which knob caused a regression.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pitfalls \u2014 what&nbsp;<em>not<\/em>&nbsp;to do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are the specific mistakes that break an otherwise-simple install on Optimus laptops:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\">Don\u2019t<\/th><th class=\"has-text-align-left\" data-align=\"left\">Why it breaks things<\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>nvidia-xconfig<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Generates an&nbsp;<code>\/etc\/X11\/xorg.conf<\/code>&nbsp;that hard-pins X to the NVIDIA driver as the primary display. On an Optimus laptop the panel is wired to the Intel iGPU, so this causes a black screen or forces the dGPU to render the entire desktop (killing battery). Worse, the file&nbsp;<em>persists after you purge the driver<\/em>, so the system stays broken even after removal. Never run it on this class of hardware.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>apt install nvidia-driver-full<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">That package name is an Ubuntu-ism \u2014 it does not exist in Debian\u2019s repositories. In Debian the package is simply&nbsp;<code>nvidia-driver<\/code>. Mixing a real metapackage with a nonexistent one leaves a partial, confusing state.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Skipping&nbsp;<code>linux-headers-amd64<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Without matching kernel headers, DKMS can\u2019t build the kernel module and the install quietly no-ops. You reboot and you\u2019re still on nouveau, with no obvious error to point at.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Hand-writing an&nbsp;<code>xorg.conf<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">On a PRIME\/Optimus setup, modern X auto-detects correctly. A manual config almost always fights the offload arrangement. Keep it absent.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Reference \u2014 working configuration summary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th class=\"has-text-align-left\" data-align=\"left\">Item<\/th><th class=\"has-text-align-left\" data-align=\"left\">Value<\/th><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Hardware<\/td><td class=\"has-text-align-left\" data-align=\"left\">Dell Precision 3571, Intel iGPU + NVIDIA T600 Laptop GPU (Turing, TU117)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">OS<\/td><td class=\"has-text-align-left\" data-align=\"left\">Debian 12 (Bookworm)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Driver<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>nvidia-driver<\/code>&nbsp;(Bookworm&nbsp;<code>non-free<\/code>), DKMS-built against&nbsp;<code>linux-headers-amd64<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Mode<\/td><td class=\"has-text-align-left\" data-align=\"left\">PRIME render offload \u2014 Intel drives the desktop, NVIDIA on demand<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Offload invocation<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia &lt;app&gt;<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Power options (<code>\/etc\/modprobe.d\/nvidia-options.conf<\/code>)<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>NVreg_PreserveVideoMemoryAllocations=1<\/code>,&nbsp;<code>NVreg_EnableS0ixPowerManagement=1<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Optional dGPU power-down<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>NVreg_DynamicPowerManagement=0x02<\/code>&nbsp;(D3cold), added separately and suspend-tested<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Quick verification checklist<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># After the full setup, all of these should hold:\nlsmod | grep nouveau        # (empty)  -&gt; nouveau blacklisted\nnvidia-smi                  # lists the T600 + driver version\nglxinfo | grep renderer     # Intel    -&gt; desktop on iGPU\n__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep renderer   # T600\nsystemctl suspend           # resumes cleanly<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Credit:<\/strong>&nbsp;This guide was written by&nbsp;<strong>Claude<\/strong>, an AI assistant made by Anthropic, based on a hands-on troubleshooting session working through this exact setup step by step. If you republish or adapt it, a link back is appreciated.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This guide walks through installing the proprietary NVIDIA driver on a Dell Precision 3571 (or any similar Optimus laptop with an NVIDIA T600 \/ Turing-class dGPU and Intel integrated graphics) running Debian 12 \u201cBookworm.\u201d The goal is a proper&nbsp;PRIME render offload&nbsp;setup: the Intel iGPU drives the desktop for good battery life, and the NVIDIA GPU [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-175","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/pages\/175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/andylittle.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=175"}],"version-history":[{"count":1,"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/pages\/175\/revisions"}],"predecessor-version":[{"id":176,"href":"https:\/\/andylittle.us\/index.php?rest_route=\/wp\/v2\/pages\/175\/revisions\/176"}],"wp:attachment":[{"href":"https:\/\/andylittle.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}