Chimera Linux q66, musl에서 NVIDIA 독점 드라이버 구동 방식 공개
q66는 glibc용 NVIDIA 드라이버를 musl에서 실행하기 위해 gcompat와 patchelf로 ELF 의존성을 손보고, ifunc·초기 실행 TLS 지원을 보완한 musl 패치와 재귀 뮤텍스 호환 shim을 적용했습니다. 580·620 드라이버 변경안은 아직 Draft PR입니다. q66는 GTX 980 Ti에서 580을 시험했으며, 620과 AArch64 결과는 다른 사람에게서 받은 작동 보고라고 밝혔습니다.

Chimera Linux의 패키지 저장소 cports에는 q66가 올린 NVIDIA 580·620 드라이버 변경안이 있으며, 2026년 11월 6일 현재 Draft 상태입니다. q66의 기술 글은 드라이버 설치보다 glibc를 기준으로 만들어진 NVIDIA 사용자 공간 라이브러리를 musl 환경에서 실행하기 위해 어떤 호환 작업을 했는지 설명합니다. 직접 시험한 그래픽카드는 GTX 980 Ti입니다.
NVIDIA 독점 드라이버는 커널 쪽 구성요소와 제조사가 제공하는 사용자 공간 라이브러리로 작동합니다. 이 라이브러리가 glibc를 기준으로 만들어져 musl 기반 배포판에서 호환 문제가 생깁니다. 오픈소스 대안으로 Nouveau와 NVK가 있지만, 카드 세대에 따라 지원 범위와 성능이 달라 독점 드라이버가 필요한 경우도 있습니다.
Chimera는 Mesa와 NVIDIA의 OpenGL 구현체를 함께 사용할 수 있도록 GLVND를 도입했습니다. 애플리케이션은 GLVND가 제공하는 공통 OpenGL 라이브러리에 호출을 보내고, GLVND가 이를 Mesa나 NVIDIA 드라이버로 전달합니다. Chimera는 2026년 11월 5일 GLVND로 전환했습니다. GLVND를 도입하려면 Mesa도 GLVND에 맞춰 다시 빌드해야 합니다. 이로써 OpenGL 구현체를 연결하는 경로가 마련됐지만, glibc용 바이너리를 musl에서 실행하는 문제는 별도의 호환 작업으로 남았습니다.
q66는 NVIDIA의 .run 아카이브에서 드라이버 파일을 가져와 패키지에 배치하고 gcompat와 patchelf를 활용했습니다. gcompat는 glibc 프로그램을 musl 환경에서 실행할 수 있도록 동적 로더와 호환 심볼을 제공하는 계층입니다. 당시 gcompat의 최신 정식 태그에는 드라이버가 요구하는 심볼이 부족해 최신 Git 버전이 필요했습니다. 드라이버 구성 파일 상당수는 자체 인터프리터를 지정하지 않는 공유 라이브러리여서, gcompat 로더를 적용하는 것만으로는 필요한 의존성과 심볼을 연결할 수 없었습니다. q66는 patchelf로 ELF 의존성을 손봐 glibc 동적 로더에 대한 참조와 불필요한 라이브러리 의존성을 제거하고, libc 참조를 musl의 libc로 바꾸며 gcompat 심볼 라이브러리를 연결했습니다. 아카이브에 포함된 오픈소스 구성요소는 별도 패키지로 빌드해 호환 shim을 적용할 범위를 줄였습니다.
의존성을 정리한 뒤에도 GNU ifunc 재배치 오류가 남았습니다. ifunc는 실행 시점의 조건에 따라 사용할 함수 구현을 고르는 방식입니다. 드라이버 라이브러리에는 musl이 기본으로 처리하지 않는 R_X86_64_IRELATIVE 재배치가 들어 있었습니다. q66는 Alpaquita Linux의 musl 패치 중 필요한 ifunc 처리 부분과 AArch64용 대응 부분을 가져와 musl-nvidia 패키지에 적용했습니다.
다음 문제는 스레드 로컬 저장소(TLS)였습니다. 드라이버의 libnvidia-glcore와 libnvidia-tls는 초기 실행 TLS 모델을 사용합니다. 이 모델은 스레드 포인터에서 고정된 위치의 TLS 공간을 기대합니다. OpenGL 구현체는 보통 애플리케이션이 시작된 뒤 dlopen으로 불러오는데, musl에서는 이때 필요한 TLS 공간을 배치하지 못해 오류가 발생했습니다. q66는 동적 링커를 고쳐 dlopen 과정에서 라이브러리의 DF_STATIC_TLS 표시를 확인하고, 필요한 TLS 이미지가 미리 남겨 둔 공간에 들어갈 경우 정적 TLS로 배치하게 했습니다. 따라서 모든 프로세스에 드라이버 라이브러리를 미리 적재하지 않고도 해당 라이브러리를 불러올 때 조건을 확인할 수 있습니다.
라이브러리가 로드된 뒤에도 그래픽 프로그램이 멈췄습니다. q66는 스택을 추적해 NVIDIA 라이브러리 안에서 재귀 뮤텍스를 잠그려다 대기 상태에 빠지는 것을 확인했습니다. glibc는 정적 초기화 값에 재귀 뮤텍스 유형을 기록하지만, musl은 같은 방식의 정적 초기화를 지원하지 않습니다. q66는 pthread_mutex_lock, pthread_mutex_timedlock, pthread_mutex_trylock 호출을 가로채 정적 초기화 뮤텍스에 남은 glibc 형식의 유형 값을 musl 구조에 맞게 옮긴 뒤 원래 잠금 함수를 부르는 libnvcompat shim을 추가했습니다. 이 수정으로 ELF 의존성 오류를 없앤 뒤에도 남아 있던 그래픽 실행 정지 문제가 해결됐습니다.
q66는 GTX 980 Ti에서 580 레거시 드라이버를 시험했습니다. cports 변경안의 댓글에는 580 드라이버에서 OpenGL과 Vulkan이 작동한다고 적었고, CKMS 커널 모듈 빌드는 별도의 apk 버그 때문에 실패한다고 설명했습니다. RTX 3070 Ti에서 620 드라이버가 작동했다는 결과와 AArch64에서 부분적으로 작동했다는 결과는 q66가 다른 사람에게서 받은 보고입니다. q66는 패키징을 더 다듬고 시험을 늘려야 한다고 밝혔으며, 저장소의 변경안은 Draft로 남아 있습니다.