우분투 의존성 문제 해결 (dpkg: error processing archive)
우분투 CUDA 업데이트 중 의존성 지옥 탈출기
우분투를 사용하다 보면 apt upgrade 중에 패키지 의존성이 꼬이는 경험을 종종 하게 된다. 최근에는 CUDA 관련 패키지를 업데이트하다가 의존성 오류가 발생했다. 보통은 apt --fix-broken install 명령어 한 방이면 해결되는데, 이번엔 상황이 좀 달랐다.
기존에 설치된 패키지(libcusparse-dev-12-3)와 새로 설치하려는 패키지(cuda-nvcc-12-3 등)가 같은 경로의 파일을 덮어쓰려다 충돌이 난 것이다.
증상: apt upgrade 실패
Bash
vividian@TP-P14s-G4:~$ sudo apt upgrade
...
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
의존성이 안 맞다고 해서 시키는 대로 고쳐보려 했다.
Bash
vividian@TP-P14s-G4:~$ sudo apt --fix-broken install
...
dpkg: error processing archive /var/cache/apt/archives/cuda-nvcc-12-3_12.3.107-1_amd64.deb (--unpack):
trying to overwrite '/usr/local/cuda-12.3/include', which is also in package libcusparse-dev-12-3 12.2.0.103-1
...
Errors were encountered while processing:
/var/cache/apt/archives/cuda-nvcc-12-3_12.3.107-1_amd64.deb
...
결과는 실패. 에러 메시지를 자세히 보면 trying to overwrite ... which is also in package ... 라고 뜬다. 즉, 서로 다른 패키지가 같은 파일을 건드리고 있어 충돌이 난 것이다.
해결: dpkg –force-overwrite (강제 덮어쓰기)
이럴 땐 dpkg의 --force-overwrite 옵션을 사용하여 강제로 파일을 덮어써서 설치를 진행하면 해결할 수 있다. 충돌 나는 패키지(.deb 파일)들의 경로를 확인하고 하나씩 강제 설치해 주자.
경로는 위 에러 로그의 /var/cache/apt/archives/... 부분을 참고하면 된다.
1. cuda-nvcc 강제 설치
Bash
sudo dpkg -i --force-overwrite /var/cache/apt/archives/cuda-nvcc-12-3_12.3.107-1_amd64.deb
2. cuda-nvrtc 강제 설치
Bash
sudo dpkg -i --force-overwrite /var/cache/apt/archives/cuda-nvrtc-12-3_12.3.107-1_amd64.deb
3. libcurand 강제 설치
Bash
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libcurand-12-3_10.3.4.107-1_amd64.deb
4. cuda-nvrtc-dev 강제 설치
Bash
sudo dpkg -i --force-overwrite /var/cache/apt/archives/cuda-nvrtc-dev-12-3_12.3.107-1_amd64.deb
5. libcurand-dev 강제 설치
Bash
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libcurand-dev-12-3_10.3.4.107-1_amd64.deb
(※ 패키지 버전이나 파일명은 시스템 환경에 따라 다를 수 있으니, 본인의 에러 로그에 뜬 경로를 복사해서 사용해야 한다.)
마무리 확인
강제 설치를 모두 마친 후, 다시 업데이트 명령어를 실행해 본다.
Bash
vividian@TP-P14s-G4:~$ sudo apt upgrade
...
vividian@TP-P14s-G4:~$ sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
더 이상 에러 없이 깔끔하게 완료된 것을 확인할 수 있다. 파일 충돌로 인한 의존성 문제는 과감하게 --force-overwrite로 해결하자.