우분투 24.04 NVIDIA 드라이버 설치와 오류 해결: nvidia-smi 실패, 검은 화면, Secure Boot MOK

이 글의 핵심

우분투 24.04에서 NVIDIA 드라이버는 ubuntu-drivers나 apt로 설치하는 것이 정석이고, NVIDIA 홈페이지의 .run 설치 파일은 피하는 편이 안전합니다. 이 글은 설치 경로별 차이, open/proprietary 커널 모듈 선택, Secure Boot에서의 MOK 등록을 먼저 설명한 뒤, nvidia-smi 통신 실패·검은 화면과 로그인 루프·dpkg 충돌·커널 업데이트 후 모듈 깨짐·하이브리드 노트북 문제를 증상별로 해결하고, 마지막으로 CUDA 툴킷과의 관계와 완전 삭제 방법을 정리합니다.

우분투에서 NVIDIA 드라이버가 유독 말썽인 이유

우분투를 설치하면 NVIDIA 그래픽카드는 일단 오픈소스 드라이버인 nouveau로 동작합니다. 화면은 나오지만 성능이 낮고, CUDA를 쓸 수 없으며, 최신 GPU에서는 전원 관리나 외부 모니터 출력이 불안정한 경우가 많습니다. 그래서 대부분 NVIDIA의 공식 드라이버로 바꾸게 되는데, 이 과정에서 검은 화면, 로그인 화면 무한 반복, nvidia-smi 오류 같은 문제가 자주 생깁니다.

문제가 잦은 이유는 NVIDIA 드라이버가 일반 프로그램이 아니라 커널 모듈이기 때문입니다. 커널 모듈은 지금 돌고 있는 리눅스 커널 버전에 맞춰 빌드되어야 하고, Secure Boot가 켜져 있으면 서명까지 되어 있어야 로드됩니다. 커널이 업데이트되면 모듈도 다시 맞춰야 하고, 사용자 공간 라이브러리(libnvidia-*)와 커널 모듈의 버전이 정확히 일치해야 합니다. 이 연결 고리 중 하나만 어긋나도 그래픽 스택 전체가 멈춥니다. 아래의 오류들은 거의 전부 이 고리 중 어디가 끊겼는지의 문제입니다.

기준 환경: 우분투 24.04 LTS(Noble Numbat), 기본 GNOME 데스크톱, x86_64. 22.04에서도 대부분의 명령은 같지만 ubuntu-drivers install 대신 ubuntu-drivers autoinstall을 써야 하는 등 세부 차이가 있습니다. 우분투 버전과 에디션 차이가 헷갈린다면 우분투 버전·LTS·에디션 구분을 먼저 보셔도 좋습니다.

이 글에 나오는 드라이버 버전 번호(535, 550, 570 등)는 모두 예시입니다. 우분투 저장소에 올라오는 버전은 시간이 지나면서 바뀌고, GPU 세대마다 지원 범위도 다릅니다. 실제로 설치할 버전은 아래에서 설명하는 ubuntu-drivers가 권장하는 것을 기준으로 정하시기 바랍니다.

설치 전에 확인할 것: GPU 모델과 현재 상태

먼저 시스템이 어떤 GPU를 갖고 있는지, 지금 어떤 드라이버가 쓰이고 있는지 확인합니다.

lspci -nn | grep -Ei 'vga|3d|display'

노트북이라면 Intel이나 AMD 내장 그래픽과 NVIDIA 외장 그래픽이 둘 다 보일 것입니다. 이런 하이브리드 구성은 뒤에서 따로 다룹니다.

현재 로드된 드라이버는 다음 명령으로 봅니다.

lsmod | grep -E 'nouveau|nvidia'

nouveau만 보이면 아직 공식 드라이버가 설치되지 않은 상태이고, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm이 보이면 이미 공식 드라이버가 올라와 있는 상태입니다.

Secure Boot 상태도 미리 확인해 두면 나중에 당황할 일이 줄어듭니다.

mokutil --sb-state

SecureBoot enabled가 나오면 뒤에 나오는 MOK 등록 단계를 거칠 가능성이 있습니다.

마지막으로, 드라이버 작업 전에는 시스템이 최신 상태인지 확인하고 재부팅까지 한 번 해 두는 것이 좋습니다. 커널이 업데이트되었는데 재부팅을 안 한 상태라면, 드라이버 모듈이 새 커널 기준으로 빌드되고 지금 돌고 있는 옛 커널에는 맞지 않아서 첫 재부팅 전까지 헷갈리는 상태가 됩니다.

sudo apt update && sudo apt full-upgrade
sudo reboot

세 가지 설치 경로와 어느 것을 써야 하는지

우분투에서 NVIDIA 드라이버를 설치하는 방법은 크게 세 가지입니다.

경로방법커널 업데이트 대응권장 여부
추가 드라이버 GUI / ubuntu-drivers우분투가 GPU에 맞는 패키지를 골라 설치자동(서명된 모듈 또는 DKMS)가장 권장
apt install nvidia-driver-XXX버전을 직접 지정해 설치자동(DKMS 또는 사전 빌드 모듈)특정 버전이 필요할 때
NVIDIA .run 설치 파일NVIDIA 홈페이지에서 받아 직접 실행수동 관리 필요우분투에서는 비권장

추가 드라이버 화면과 ubuntu-drivers 명령

GUI로 하려면 소프트웨어 & 업데이트 → 추가 드라이버 탭을 엽니다. 목록에 “Using NVIDIA driver metapackage from nvidia-driver-550 (proprietary, tested)” 같은 항목이 나오고, 그중 하나를 고른 뒤 변경 사항 적용을 누르면 됩니다. 항목 옆에 “tested”가 붙은 것은 Canonical이 해당 우분투 릴리스에서 검증한 버전이라는 뜻입니다.

같은 일을 터미널에서 하는 도구가 ubuntu-drivers입니다.

ubuntu-drivers devices

출력에서 recommended가 붙은 줄이 이 시스템에 권장되는 드라이버입니다. 예를 들면 다음과 같은 형태입니다(버전과 목록은 GPU와 시점에 따라 다릅니다).

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002484sv...
vendor   : NVIDIA Corporation
model    : GA104 [GeForce RTX 3070]
driver   : nvidia-driver-550 - distro non-free recommended
driver   : nvidia-driver-550-open - distro non-free
driver   : nvidia-driver-535 - distro non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

권장 드라이버를 그대로 설치하려면 다음 명령이면 됩니다.

sudo ubuntu-drivers install
sudo reboot

특정 버전을 ubuntu-drivers로 지정할 수도 있습니다.

sudo ubuntu-drivers install nvidia:550

ubuntu-drivers를 쓰는 이유는 단순히 편해서만이 아닙니다. 이 도구는 가능한 경우 Canonical이 미리 빌드하고 서명한 커널 모듈 패키지(linux-modules-nvidia-...)를 함께 설치합니다. 이렇게 설치되면 커널 업데이트 때 해당 커널용 모듈도 같이 업데이트되고, Secure Boot 환경에서도 별도 MOK 등록 없이 로드되는 경우가 많습니다. 반대로 그런 패키지가 없는 조합이라면 DKMS로 빌드하는 방식으로 넘어가는데, 이때는 뒤에 나오는 MOK 등록이 필요해집니다.

참고로 우분투 설치 프로그램에서 “그래픽 및 Wi-Fi 하드웨어용 서드파티 소프트웨어 설치”를 체크했다면 설치 시점에 이미 권장 드라이버가 깔려 있을 수 있습니다. 설치 전에 lsmod로 확인하라고 한 이유가 이것입니다.

apt로 버전을 직접 지정하는 경우

특정 CUDA 버전이 요구하는 최소 드라이버가 있거나, 최신 버전에서 문제가 생겨 한 단계 낮은 버전을 쓰고 싶을 때는 패키지 이름을 직접 지정합니다.

sudo apt install nvidia-driver-550

이 방식도 우분투 저장소의 패키지를 쓰므로 apt가 의존성과 업데이트를 관리합니다. 다만 ubuntu-drivers와 달리 서명된 사전 빌드 모듈 패키지를 함께 골라 주지 않으면 DKMS 빌드 경로(nvidia-dkms-550)로 설치되는 경우가 있습니다. 둘 중 무엇으로 설치되었는지는 dkms status로 확인할 수 있습니다. 출력에 nvidia/550.xx, 6.8.0-xx-generic, x86_64: installed 같은 줄이 있으면 DKMS로 빌드된 것입니다.

어떤 버전들이 저장소에 있는지는 다음처럼 확인합니다.

apt list 'nvidia-driver-*' 2>/dev/null | grep -v '^Listing'

NVIDIA .run 설치 파일을 피해야 하는 이유

NVIDIA 홈페이지에서 받는 NVIDIA-Linux-x86_64-XXX.run 파일은 배포판과 무관하게 동작하도록 만든 범용 설치 프로그램입니다. 최신 버전이 우분투 저장소보다 먼저 나온다는 장점은 있지만, 우분투에서는 다음과 같은 이유로 권하지 않습니다.

  • 패키지 관리자 바깥에서 파일을 덮어씁니다. /usr/lib/x86_64-linux-gnu/ 아래의 OpenGL·Vulkan·EGL 라이브러리를 직접 교체하는데, apt는 이 사실을 모릅니다. 나중에 apt로 드라이버나 관련 패키지를 설치하면 같은 경로의 파일이 서로 덮어써지면서 버전이 뒤섞입니다.
  • 커널 업데이트에 약합니다. 설치 중 DKMS 등록을 선택하지 않으면 커널이 바뀔 때마다 모듈이 사라져 재설치해야 합니다. 우분투는 보안 업데이트로 커널이 자주 바뀌므로 어느 날 갑자기 부팅 후 화면이 안 나오는 상황이 생깁니다.
  • 설치 과정 자체가 까다롭습니다. 그래픽 세션이 떠 있는 상태에서는 설치가 거부되고, nouveau도 먼저 내려야 합니다.
  • Secure Boot 서명을 직접 처리해야 합니다. 서명 키를 만들고 등록하는 과정을 수동으로 거쳐야 합니다.

.run 파일을 실행하면 흔히 이런 오류를 만납니다.

ERROR: You appear to be running an X server; please exit X before installing.
ERROR: The Nouveau kernel driver is currently in use by your system.  This driver is incompatible with the NVIDIA driver, and must be disabled before proceeding.

이 오류들을 넘기기 위해 디스플레이 매니저를 끄고, nouveau를 블랙리스트하고, 재부팅한 뒤 TTY에서 설치하는 절차가 인터넷에 많이 돌아다닙니다. 동작은 하지만, 그렇게까지 해야 할 이유가 있는지 먼저 생각해 보는 편이 좋습니다. 저장소에 아직 없는 아주 새로운 GPU를 지원해야 하는 등 분명한 이유가 없다면 저장소 패키지를 쓰는 것이 장기적으로 훨씬 덜 피곤합니다. 이미 .run으로 설치했다면, apt 드라이버로 옮기기 전에 반드시 sudo nvidia-uninstall로 먼저 제거해야 합니다.

open 모듈, proprietary 모듈, server 변형 중 무엇을 고를까

ubuntu-drivers devices 출력을 보면 같은 버전에 nvidia-driver-550, nvidia-driver-550-open, nvidia-driver-550-server, nvidia-driver-550-server-open 같은 여러 변형이 있습니다. 이름이 비슷해서 헷갈리지만 의미는 명확합니다.

-open 패키지는 커널 모듈 부분이 NVIDIA가 공개한 오픈소스 커널 모듈(open GPU kernel modules)로 되어 있다는 뜻입니다. 이름과 달리 드라이버 전체가 오픈소스가 되는 것은 아니고, 사용자 공간 라이브러리(OpenGL, CUDA 등)는 여전히 NVIDIA의 비공개 바이너리입니다. nouveau와도 다른 것입니다.

open 커널 모듈은 GPU 내부의 GSP(GPU System Processor) 펌웨어에 의존하기 때문에 Turing 세대 이상(GeForce GTX 16 시리즈, RTX 20 시리즈 이후)에서만 동작합니다. GTX 10 시리즈(Pascal)나 그 이전 GPU에 -open 패키지를 설치하면 모듈이 GPU를 인식하지 못해 드라이버가 올라오지 않습니다. 반대로 최근 세대 GPU 중에는 open 모듈만 지원하는 경우도 있어서, NVIDIA는 새 GPU에 open 모듈을 기본으로 권장하는 방향으로 옮겨 가고 있습니다. 어느 쪽을 써야 할지 모르겠다면 ubuntu-drivers devices가 recommended로 표시한 쪽을 따르는 것이 가장 확실합니다.

-server 패키지는 데이터센터·서버용 브랜치입니다. 일반 데스크톱 패키지와 같은 드라이버 계열이지만 지원 기간이 길고 업데이트 정책이 보수적이며, 주로 GPU 서버나 헤드리스 연산 노드에 씁니다. 화면을 띄우는 데스크톱이라면 일반 패키지를, 화면 출력 없이 CUDA만 돌리는 서버라면 server 변형을 고려하면 됩니다. 서버에서는 그래픽 관련 패키지를 빼고 연산용만 설치하는 옵션도 있습니다.

sudo ubuntu-drivers install --gpgpu

--gpgpu 옵션은 서버용(연산용) 드라이버를 대상으로 동작합니다. 이 경우 nvidia-smi가 포함된 nvidia-utils-XXX-server 패키지가 따로 필요할 수 있습니다.

Secure Boot와 MOK 등록: 파란 화면에서 무엇을 눌러야 하나

Secure Boot가 켜진 PC는 서명되지 않은 커널 모듈의 로드를 거부합니다. DKMS로 빌드되는 NVIDIA 모듈은 설치하는 시점에 내 컴퓨터에서 빌드되므로, 우분투는 이를 서명하기 위해 기기 고유의 키(MOK, Machine Owner Key)를 만들고 펌웨어에 등록하는 절차를 밟습니다.

설치 중에 터미널이나 GUI에 Secure Boot 관련 안내와 함께 비밀번호를 정하라는 창이 뜹니다. 여기서 정하는 비밀번호는 재부팅 직후 한 번만 쓰는 임시 비밀번호입니다. 우분투 로그인 비밀번호와 같을 필요는 없지만, 재부팅 후 영문 키보드 배치로 입력해야 하므로 단순한 영문·숫자로 정하는 편이 안전합니다.

재부팅하면 우분투 로고 대신 파란 배경의 Perform MOK management 화면이 나타납니다. 순서는 다음과 같습니다.

  1. Enroll MOK를 선택합니다.
  2. Continue를 선택합니다(키 내용을 보려면 View key).
  3. “Enroll the key(s)?”에 Yes를 선택합니다.
  4. 설치할 때 정한 비밀번호를 입력합니다.
  5. Reboot를 선택합니다.

이 화면은 몇 초 동안 아무 키도 누르지 않으면 그냥 넘어가 버립니다. MOK 화면을 놓치면 키가 등록되지 않고, NVIDIA 모듈은 로드가 거부됩니다. 이 경우 시스템은 nouveau나 기본 프레임버퍼로 부팅되거나, 설정에 따라 검은 화면이 됩니다. 수동으로 모듈을 올려 보면 다음 오류가 나옵니다.

sudo modprobe nvidia
modprobe: ERROR: could not insert 'nvidia': Key was rejected by service

MOK 화면을 놓쳤다면 키 등록을 다시 요청하면 됩니다. 우분투가 DKMS 서명용으로 만든 키는 보통 /var/lib/shim-signed/mok/MOK.der에 있습니다.

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
sudo reboot

명령을 실행하면 다시 임시 비밀번호를 묻고, 재부팅 시 파란 MOK 화면이 다시 나타납니다. 이번에는 놓치지 않도록 재부팅 직후 화면을 지켜보면 됩니다. 키가 제대로 등록되었는지는 다음으로 확인합니다.

mokutil --test-key /var/lib/shim-signed/mok/MOK.der

is already enrolled가 나오면 등록된 상태입니다.

Secure Boot를 BIOS에서 꺼 버리는 방법도 있고 실제로 그렇게 안내하는 글이 많습니다. 다만 Windows와 듀얼 부팅하는 경우 BitLocker가 복구 키를 요구할 수 있고, 일부 게임의 안티치트나 회사 보안 정책이 Secure Boot를 요구하기도 합니다. MOK 등록은 한 번만 하면 이후 드라이버 업데이트에도 같은 키가 쓰이므로, 가능하면 Secure Boot를 유지한 채 MOK를 등록하는 쪽을 권합니다.

nouveau는 직접 블랙리스트하지 않아도 된다

인터넷의 오래된 설치 안내에는 /etc/modprobe.d/blacklist-nouveau.conf를 만들고 update-initramfs를 실행하라는 단계가 거의 빠짐없이 들어 있습니다. 이 단계는 .run 설치 파일을 쓸 때 필요한 것입니다. 우분투 저장소의 NVIDIA 드라이버 패키지는 설치될 때 nouveau를 블랙리스트하는 설정 파일을 직접 함께 설치하고 initramfs도 갱신합니다.

grep -r nouveau /lib/modprobe.d/ /etc/modprobe.d/ 2>/dev/null

패키지로 설치했다면 이 출력에 blacklist nouveau가 들어 있는 NVIDIA 관련 파일이 보일 것입니다. 수동으로 블랙리스트 파일을 또 만들 필요는 없고, 오히려 나중에 NVIDIA 드라이버를 지우고 nouveau로 돌아가려 할 때 수동으로 만든 파일이 남아 있으면 nouveau까지 막혀 화면이 저해상도 기본 모드로만 나오는 원인이 됩니다. 드라이버를 지운 뒤 화면이 이상하다면 /etc/modprobe.d/ 아래에 직접 만든 nouveau 블랙리스트 파일이 남아 있는지 확인해 보세요.

설치가 제대로 됐는지 확인하는 방법

재부팅 후 가장 먼저 해 볼 명령은 nvidia-smi입니다.

nvidia-smi

정상이라면 다음과 비슷한 표가 나옵니다.

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.xx.xx              Driver Version: 550.xx.xx      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
...

표의 위쪽에서 드라이버 버전을, 아래쪽 프로세스 목록에서 gnome-shell이나 Xorg가 GPU를 쓰고 있는지 볼 수 있습니다. 데스크톱이 실제로 NVIDIA로 렌더링되고 있는지 확인하려면 다음 명령도 유용합니다.

sudo apt install mesa-utils
glxinfo -B | grep -E 'OpenGL vendor|OpenGL renderer'

OpenGL vendor string: NVIDIA Corporation이 나오면 NVIDIA 드라이버로 렌더링하고 있는 것입니다. 하이브리드 노트북에서는 기본값이 내장 그래픽이라 여기서 Intel이나 AMD가 나오는 것이 정상일 수 있습니다.

커널 모듈 수준에서 확인하고 싶다면 다음 파일을 봅니다.

cat /proc/driver/nvidia/version

이 파일이 존재하고 버전이 찍혀 있으면 커널 모듈이 로드된 상태입니다. 커널 모듈 버전과 nvidia-smi가 보여 주는 라이브러리 버전이 다르면 뒤에 나오는 “Driver/library version mismatch” 상황입니다.

nvidia-smi가 드라이버와 통신하지 못한다는 오류

가장 많이 검색되는 오류는 이것입니다.

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

이 메시지는 nvidia-smi 프로그램(사용자 공간)은 설치되어 있는데, 커널 모듈이 로드되어 있지 않다는 뜻입니다. 원인은 몇 가지로 좁혀지므로 순서대로 확인합니다.

  1. 설치 후 재부팅을 안 했다. 가장 흔한 경우입니다. 설치 직후에는 nouveau가 아직 메모리에 올라가 있어서 NVIDIA 모듈이 들어갈 수 없습니다. 재부팅부터 합니다.

  2. Secure Boot에서 모듈이 거부되었다. 위에서 본 Key was rejected by service 오류가 나오는지 확인합니다.

sudo modprobe nvidia
sudo dmesg | grep -iE 'nvidia|secure|lockdown' | tail -20

이 경우 MOK 재등록 절차를 따릅니다.

  1. 지금 커널에 맞는 모듈이 없다. 커널 업데이트 후 DKMS 빌드가 실패했거나, 커널 헤더가 없어 빌드가 아예 시도되지 않았을 때입니다.
uname -r
dkms status

dkms status 출력에 uname -r과 같은 커널 버전으로 installed라고 찍힌 줄이 없다면 현재 커널용 모듈이 없는 것입니다. 해결 방법은 아래 “커널 업데이트 후 드라이버가 사라졌을 때”에서 설명합니다.

  1. 드라이버가 실제로 설치되지 않았다. nvidia-utils만 남아 있고 드라이버 본체가 지워졌거나, 설치 중 오류로 중단된 경우입니다.
dpkg -l | grep -E 'nvidia-(driver|dkms|kernel|utils)|linux-modules-nvidia'

목록의 각 줄 앞 상태가 ii가 아니라 iU, iF, rc 같은 값이면 설치가 완료되지 않았거나 제거된 상태입니다.

비슷하지만 원인이 다른 오류도 있습니다.

Failed to initialize NVML: Driver/library version mismatch

이 오류는 커널 모듈은 올라와 있지만, apt 업데이트로 사용자 공간 라이브러리만 새 버전으로 바뀌고 커널 모듈은 메모리에 옛 버전이 남아 있을 때 나옵니다. 자동 업데이트(unattended-upgrades)가 백그라운드에서 드라이버 패키지를 올린 직후에 자주 보입니다. 재부팅하면 해결됩니다. 재부팅할 수 없는 서버라면 GPU를 쓰는 프로세스를 모두 종료한 뒤 nvidia_uvm, nvidia_drm, nvidia_modeset, nvidia 모듈을 순서대로 내렸다가 다시 올리는 방법도 있지만, 데스크톱에서는 그래픽 세션이 모듈을 잡고 있어 사실상 재부팅이 유일한 방법입니다.

nvidia-smi 자체가 없다는 메시지도 있습니다.

Command 'nvidia-smi' not found, but can be installed with:
sudo apt install nvidia-utils-550

이건 드라이버가 아니라 유틸리티 패키지만 없는 것입니다. 다만 안내대로 nvidia-utils만 덜렁 설치하는 것은 좋지 않습니다. 설치된 드라이버와 버전이 다른 유틸리티를 설치하면 위의 version mismatch를 만들기 쉽습니다. 드라이버 본체가 설치되어 있는지 먼저 확인하고, 없다면 ubuntu-drivers install로 드라이버 전체를 설치하세요.

설치 후 검은 화면이나 로그인 루프가 생겼을 때

드라이버를 설치하고 재부팅했더니 화면이 검은 채로 멈추거나, 로그인 화면에서 비밀번호를 입력하면 잠깐 검어졌다가 다시 로그인 화면으로 돌아오는 증상이 있습니다. 후자를 흔히 로그인 루프라고 부릅니다. 대개 그래픽 세션이 NVIDIA 드라이버를 쓰려다 실패해서 생기며, 침착하게 텍스트 콘솔로 들어가면 복구할 수 있습니다.

TTY로 들어가기

그래픽 화면과 별개로 리눅스는 텍스트 콘솔(TTY)을 제공합니다. 검은 화면이나 로그인 화면에서 Ctrl+Alt+F3을 누르면 텍스트 로그인 프롬프트가 나옵니다. 반응이 없으면 F4, F5도 시도해 봅니다. 사용자 이름과 비밀번호로 로그인합니다(비밀번호는 입력해도 화면에 표시되지 않습니다).

여기서 먼저 원인을 확인할 수 있습니다.

nvidia-smi
journalctl -b -u gdm --no-pager | tail -50
cat ~/.local/share/xorg/Xorg.0.log 2>/dev/null | grep -E '\(EE\)' 

로그인 루프의 원인 중에는 드라이버와 무관하게 홈 디렉터리의 ~/.Xauthority 소유권이 root로 바뀌었거나 디스크가 가득 찬 경우도 있습니다. df -h로 디스크 여유 공간을 함께 확인해 볼 만합니다.

TTY조차 안 될 때: 복구 모드와 nomodeset

Ctrl+Alt+F3도 반응이 없다면 GRUB 메뉴를 이용합니다. 부팅 시 BIOS 로고가 사라지는 순간 Esc(UEFI) 또는 Shift(레거시 BIOS)를 누르면 GRUB 메뉴가 나옵니다. 두 가지 방법이 있습니다.

  • Advanced options for Ubuntu → (recovery mode) 항목으로 부팅한 뒤 root 셸을 선택합니다. 이 셸에서는 파일시스템이 읽기 전용이므로 mount -o remount,rw /를 먼저 실행해야 패키지를 지울 수 있습니다. 네트워크가 필요하면 복구 메뉴의 network 항목을 먼저 실행합니다.
  • 일반 우분투 항목에서 e를 눌러 부팅 명령을 편집하고, linux로 시작하는 줄 끝의 quiet splash 뒤에 nomodeset을 붙인 뒤 Ctrl+X로 부팅합니다. 이 옵션은 커널의 그래픽 모드 설정을 끄므로 저해상도로라도 화면이 나오고, 그 상태에서 터미널을 열어 작업할 수 있습니다. 이 변경은 이번 부팅에만 적용됩니다.

드라이버를 지우고 nouveau로 돌아가기

원인을 당장 찾기 어렵다면 일단 NVIDIA 드라이버를 완전히 지우고 nouveau로 돌아가서 데스크톱을 살리는 것이 먼저입니다.

sudo apt purge '^nvidia-.*' '^libnvidia-.*'
sudo apt autoremove --purge
sudo reboot

작은따옴표는 반드시 붙여야 합니다. 따옴표가 없으면 셸이 현재 디렉터리의 파일 이름으로 패턴을 먼저 해석해 엉뚱한 결과가 나올 수 있습니다. 패턴이 넓기 때문에 apt가 제거 목록을 보여 줄 때 한 번 훑어보고 진행하는 습관을 들이는 것이 좋습니다. 사전 빌드 모듈로 설치되어 있었다면 linux-modules-nvidia-... 패키지도 함께 정리됩니다.

데스크톱이 살아난 뒤에는 다른 버전(보통 ubuntu-drivers devices가 권장하는 버전, 또는 그 바로 아래 버전)을 다시 설치해 봅니다. 최신 버전을 직접 지정해 설치했다가 문제가 생긴 경우라면 권장 버전으로 돌아가는 것만으로 해결되는 일이 많습니다.

dpkg 충돌과 의존성 오류

드라이버 설치 중 apt가 다음과 같은 오류를 내며 멈추는 경우가 있습니다.

dpkg: error processing archive /var/cache/apt/archives/libnvidia-compute-550_550.xx-0ubuntu1_amd64.deb (--unpack):
 trying to overwrite '/usr/lib/x86_64-linux-gnu/libnvidia-ml.so', which is also in package libnvidia-compute-535 535.xx-0ubuntu1
Errors were encountered while processing:
E: Sub-process /usr/bin/dpkg returned an error code (1)

또는 이런 형태입니다.

The following packages have unmet dependencies:
 nvidia-driver-550 : Depends: libnvidia-gl-550 (= 550.xx-0ubuntu1) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

이런 충돌은 대부분 출처가 다른 NVIDIA 패키지가 섞여서 생깁니다. 대표적인 경우는 다음과 같습니다.

  • 우분투 저장소의 드라이버를 쓰다가 NVIDIA의 CUDA 저장소를 추가하고 cuda 패키지를 설치한 경우. cuda 메타패키지는 NVIDIA 저장소의 드라이버를 같이 끌어오는데, 패키지 이름은 비슷해도 버전과 파일 구성이 달라 충돌합니다.
  • graphics-drivers PPA를 추가했다가 일부만 업데이트된 경우.
  • 이전 버전 패키지가 rc(설정 파일만 남음) 상태로 남아 있거나 일부가 hold 되어 있는 경우.
  • .run으로 설치한 파일이 남아 있는 상태에서 apt 패키지를 설치한 경우.

해결의 기본은 꼬인 것을 전부 걷어 내고 한 출처로 다시 설치하는 것입니다.

sudo apt --fix-broken install
sudo apt purge '^nvidia-.*' '^libnvidia-.*' '^cuda-drivers.*'
sudo apt autoremove --purge
apt-mark showhold

apt-mark showhold에 NVIDIA 관련 패키지가 보이면 sudo apt-mark unhold <패키지>로 풀어 줍니다. CUDA 저장소를 추가했던 경우에는 그 저장소에서 드라이버를 받지 않도록 하는 것이 핵심입니다. 드라이버는 우분투 저장소에서, CUDA 툴킷은 NVIDIA 저장소에서 cuda-toolkit 패키지로 따로 받는 구성이 충돌이 가장 적습니다(뒤의 CUDA 절 참고). .run으로 설치했던 흔적이 있다면 sudo nvidia-uninstall도 실행합니다.

정리가 끝나면 sudo ubuntu-drivers install로 다시 설치하고 재부팅합니다. apt 관련 기본 명령이 익숙하지 않다면 우분투 필수 명령어 정리의 패키지 관리 부분이 도움이 됩니다.

커널 업데이트 후 드라이버가 사라졌을 때

잘 쓰던 시스템이 업데이트 후 재부팅했더니 해상도가 낮아지고 nvidia-smi가 통신 실패 오류를 내는 경우가 있습니다. 새 커널로 부팅했는데 그 커널용 NVIDIA 모듈이 준비되지 않은 상황입니다.

DKMS 방식이라면 커널 패키지가 설치될 때 DKMS가 자동으로 모듈을 다시 빌드하도록 되어 있습니다. 이 빌드가 실패하는 대표적인 이유는 두 가지입니다. 첫째, 새 커널의 헤더 패키지(linux-headers-...)가 설치되지 않았습니다. 메타패키지(linux-generic 또는 linux-generic-hwe-24.04)를 통해 커널을 받으면 헤더도 함께 오지만, 커널 이미지만 따로 설치했다면 헤더가 빠질 수 있습니다. 둘째, 드라이버 버전이 너무 오래되어 새 커널의 내부 API 변경을 따라가지 못해 컴파일 자체가 실패합니다.

현재 상태부터 확인합니다.

uname -r
dkms status
ls /usr/src/ | grep -E 'linux-headers|nvidia'

헤더가 없다면 설치하고 DKMS 빌드를 다시 돌립니다.

sudo apt install linux-headers-$(uname -r)
sudo dkms autoinstall
sudo reboot

빌드 중 오류가 나면 DKMS가 로그 위치를 알려 줍니다. 보통 /var/lib/dkms/nvidia/<버전>/build/make.log에 컴파일 오류가 남습니다. 여기서 커널 함수 관련 컴파일 오류가 보인다면 드라이버 버전이 새 커널을 지원하지 않는 것이므로, 더 새로운 드라이버 버전으로 올리는 것이 해결책입니다.

급하게 일해야 한다면 일단 이전 커널로 부팅하는 방법도 있습니다. GRUB 메뉴의 Advanced options for Ubuntu에서 이전 버전 커널을 고르면, 그 커널용 모듈은 이미 빌드되어 있으므로 정상적으로 동작합니다. 우분투는 기본적으로 직전 커널을 하나 이상 남겨 두기 때문에 가능한 방법입니다.

ubuntu-drivers로 설치해 사전 빌드 모듈(linux-modules-nvidia-...)을 쓰고 있다면 커널과 모듈이 같은 업데이트로 함께 배포되므로 이런 문제가 상대적으로 드뭅니다. 커널 업데이트 때마다 문제가 반복된다면 드라이버를 지우고 ubuntu-drivers install로 다시 설치해 사전 빌드 모듈 경로로 옮기는 것을 고려해 볼 만합니다.

하이브리드 그래픽 노트북: prime-select와 nvidia-prime

내장 그래픽과 NVIDIA 외장 그래픽을 함께 가진 노트북(NVIDIA Optimus)은 데스크톱과 동작 방식이 다릅니다. 노트북 화면은 보통 내장 그래픽에 물려 있고, NVIDIA GPU는 필요할 때만 렌더링을 맡아 결과를 내장 그래픽으로 넘깁니다. 우분투는 이 전환을 nvidia-prime 패키지의 prime-select 명령으로 관리하며, NVIDIA 드라이버를 설치하면 함께 설치됩니다.

prime-select query

출력은 nvidia, on-demand, intel 중 하나입니다.

모드동작적합한 경우
on-demand기본은 내장 그래픽, 요청한 앱만 NVIDIA로 실행배터리와 성능의 균형, 우분투 기본값
nvidia항상 NVIDIA로 렌더링외부 모니터가 NVIDIA 출력 단자에 연결된 경우, 성능 우선
intelNVIDIA GPU를 꺼서 전력 절약배터리 우선, GPU를 전혀 안 쓸 때

intel이라는 이름은 역사적인 것으로, 내장 그래픽이 AMD인 노트북에서도 같은 이름을 씁니다. 모드를 바꾼 뒤에는 로그아웃이 아니라 재부팅해야 확실히 적용됩니다.

sudo prime-select on-demand
sudo reboot

on-demand 모드에서 특정 앱을 NVIDIA로 실행하려면 GNOME 앱 목록에서 아이콘을 오른쪽 클릭해 외장 그래픽 카드로 실행(Launch using Discrete Graphics Card)을 고르거나, 터미널에서 환경 변수를 붙여 실행합니다.

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo -B | grep 'OpenGL renderer'

이 출력에 NVIDIA GPU 이름이 나오면 오프로드가 동작하는 것입니다. Vulkan 앱이라면 __NV_PRIME_RENDER_OFFLOAD=1만으로 충분한 경우가 많습니다. CUDA 프로그램은 이 모드와 관계없이 NVIDIA GPU를 직접 쓰므로, on-demand에서도 nvidia-smi와 CUDA 작업은 그대로 됩니다.

노트북에서 흔한 증상으로는 외부 모니터가 인식되지 않는 문제가 있습니다. HDMI나 USB-C 단자가 NVIDIA GPU에 직접 연결된 모델이 많아서, NVIDIA 드라이버가 제대로 올라와 있지 않거나 intel 모드로 GPU를 꺼 두었다면 외부 모니터가 나오지 않습니다. 이때는 on-demand나 nvidia 모드로 바꿔 봅니다. BIOS에 “Hybrid / Discrete” 그래픽 설정이 있는 노트북이라면 그 설정도 결과에 영향을 줍니다. 씽크패드 계열의 구체적인 사례는 씽크패드 우분투 개발 환경 설정에서 다룹니다.

Wayland와 Xorg: NVIDIA에서 무엇이 달라지나

우분투 24.04의 GNOME은 기본적으로 Wayland 세션을 씁니다. 예전에는 NVIDIA 드라이버를 설치하면 GDM이 자동으로 Xorg 세션만 보여 주는 경우가 많았지만, 최근 드라이버와 우분투 24.04 조합에서는 NVIDIA에서도 Wayland 세션이 제공되는 경우가 많습니다. 지금 어떤 세션인지는 다음으로 확인합니다.

echo $XDG_SESSION_TYPE

wayland 또는 x11이 나옵니다. NVIDIA에서 Wayland를 쓰려면 커널 모드 설정(nvidia-drm.modeset=1)이 켜져 있어야 하는데, 우분투 패키지는 이를 기본 설정으로 넣어 둡니다. 확인은 다음과 같습니다.

sudo cat /sys/module/nvidia_drm/parameters/modeset

Y가 나오면 켜져 있는 것입니다.

Wayland 세션에서 화면 깜빡임, 특정 앱의 렌더링 깨짐, 화면 공유 문제, 절전 후 복귀 시 화면 깨짐 등이 생긴다면 Xorg 세션으로 바꿔 보는 것이 가장 빠른 확인 방법입니다. 로그인 화면에서 사용자 이름을 고른 뒤 오른쪽 아래 톱니바퀴 아이콘을 눌러 Ubuntu on Xorg를 선택하고 로그인하면 됩니다. 톱니바퀴가 아예 보이지 않으면 GDM이 이미 한쪽 세션만 허용하고 있는 상태입니다. Wayland를 아예 끄고 싶다면 /etc/gdm3/custom.conf에서 #WaylandEnable=false 줄의 주석을 풀고 재부팅합니다.

반대로 Xorg에서만 되는 기능도 있습니다. nvidia-settings의 많은 항목(오버클럭, 팬 제어, 일부 디스플레이 설정)은 Xorg 세션에서만 동작하고, Wayland에서는 화면에 일부 항목만 보입니다.

CUDA 툴킷은 드라이버와 별개다

NVIDIA 드라이버를 설치하고 nvidia-smi를 실행하면 오른쪽 위에 CUDA Version: 12.4 같은 값이 보입니다. 이것을 보고 CUDA 12.4가 설치되었다고 생각하기 쉽지만 그렇지 않습니다. 이 값은 현재 드라이버가 지원하는 가장 높은 CUDA 버전을 의미할 뿐이고, CUDA 툴킷(컴파일러 nvcc, 헤더, 개발용 라이브러리)은 설치되어 있지 않을 수 있습니다.

그래서 드라이버만 설치한 상태에서 nvcc를 실행하면 다음처럼 나옵니다.

Command 'nvcc' not found, but can be installed with:
sudo apt install nvidia-cuda-toolkit

관계를 정리하면 다음과 같습니다.

  • 드라이버: 커널 모듈과 libcuda.so(CUDA 드라이버 API)를 제공합니다. GPU를 쓰는 모든 것의 바닥입니다.
  • CUDA 툴킷: nvcc, CUDA 런타임 라이브러리, cuBLAS 같은 라이브러리를 제공합니다. CUDA 코드를 직접 컴파일할 때 필요합니다.
  • 호환 규칙: 툴킷 버전은 드라이버가 지원하는 최대 CUDA 버전 이하여야 합니다. 드라이버가 12.4까지 지원하면 12.4 이하 툴킷으로 빌드한 프로그램은 돌아가지만, 그보다 새 툴킷으로 빌드한 프로그램은 오류를 냅니다.

PyTorch나 TensorFlow를 pip로 설치해 쓰는 경우라면 CUDA 툴킷을 따로 설치하지 않아도 되는 경우가 많습니다. 이들 패키지는 필요한 CUDA 런타임 라이브러리를 wheel 안에 포함하거나 pip 의존성으로 함께 받기 때문에, 호스트에는 충분히 새로운 드라이버만 있으면 됩니다. 툴킷이 필요한 것은 CUDA 코드를 직접 컴파일하거나, 소스에서 확장 모듈을 빌드하는 라이브러리를 설치할 때입니다.

툴킷을 설치하는 방법은 두 가지입니다.

  • 우분투 저장소의 nvidia-cuda-toolkit: sudo apt install nvidia-cuda-toolkit 한 줄로 끝나지만, 버전이 우분투 릴리스 시점에 고정되어 있어 최신 버전이 아닙니다.
  • NVIDIA CUDA 저장소: NVIDIA 공식 다운로드 페이지에서 Ubuntu 24.04용 저장소 설정(deb network 방식)을 따른 뒤 cuda-toolkit-12-x 같은 패키지를 설치합니다. 이때 cuda 메타패키지가 아니라 cuda-toolkit 계열을 설치해야 합니다. cuda 메타패키지는 드라이버까지 함께 설치하려 해서, 우분투 저장소로 설치한 드라이버와 앞에서 본 dpkg 충돌을 일으킵니다.

NVIDIA 저장소로 설치한 툴킷은 /usr/local/cuda-12.x/에 들어가며, nvcc를 쓰려면 PATH를 추가해야 합니다.

echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
nvcc --version

드라이버를 완전히 지우고 처음부터 다시 하기

여러 방법을 시도하다 상태가 꼬였거나, NVIDIA GPU를 빼고 다른 그래픽카드로 바꾸는 경우 드라이버를 깨끗이 지우는 절차입니다. 이미 위에서 몇 번 나왔지만 빠짐없이 정리하면 다음과 같습니다.

# 1. .run 설치 파일로 설치한 적이 있다면 먼저 그것부터
sudo nvidia-uninstall

# 2. apt로 설치된 NVIDIA 패키지 전부 제거
sudo apt purge '^nvidia-.*' '^libnvidia-.*' '^cuda-drivers.*'
sudo apt autoremove --purge

# 3. 남은 흔적 확인
dpkg -l | grep -i nvidia
dkms status
ls /etc/modprobe.d/ | grep -iE 'nvidia|nouveau'

# 4. 재부팅
sudo reboot

nvidia-uninstall은 .run으로 설치한 적이 없으면 명령 자체가 없으므로 “command not found”가 나와도 괜찮습니다. 3번에서 dpkg -l 결과에 rc 상태로 남은 패키지가 있으면 설정 파일까지 지우기 위해 그 이름으로 다시 apt purge를 실행합니다. /etc/modprobe.d/에 직접 만든 nouveau 블랙리스트 파일이 있다면 지우고 sudo update-initramfs -u를 실행해야 nouveau가 다시 로드됩니다. CUDA 툴킷도 지우려면 sudo apt purge '^cuda-.*'를 추가로 실행하고, ~/.bashrc에 넣은 PATH 줄도 정리합니다.

재부팅 후 lsmod | grep nouveau에 nouveau가 보이면 원래 상태로 돌아온 것입니다. 여기서 다시 설치를 시도한다면 가장 단순한 경로인 sudo ubuntu-drivers install 한 줄부터 시작하는 것을 권합니다. 드라이버 설치처럼 시스템을 건드리는 작업 전에 Timeshift 같은 도구로 스냅샷을 만들어 두는 방법은 우분투 설치 후 개발자가 처음 할 일에서 설명합니다. 스냅샷이 있으면 위의 복구 절차 대부분을 건너뛰고 설치 전 상태로 바로 돌아갈 수 있습니다.