Ubuntu 26.04 강좌 / 패키지 제거·보류·의존성 오류 해결하기

Ubuntu 패키지 문제는 삭제·보류·잠금·의존성 오류를 구분해 해결합니다. 먼저 상태와 제안 목록을 조회하고, 모의 실행으로 영향을 확인한 뒤 필요한 조치만 적용해야 합니다.

삭제 명령의 범위 구분하기

작업 영향
remove 프로그램 제거; 일부 시스템 설정은 남을 수 있음
purge 패키지의 관리 대상 설정도 제거; 홈의 모든 데이터 삭제를 뜻하지 않음
autoremove 자동 설치 표시이며 더 필요 없다고 판단된 의존성 제거
hold 특정 패키지의 자동 변경을 보류; 보안 업데이트도 막을 수 있음

실습은 업무에 쓰지 않는 hello로 진행합니다. 기존에 설치되어 있었는지 기록하고, 설치하지 않은 경우 앞선 APT 설치 절차를 이용합니다. 커널·네트워크·로그인 패키지를 삭제 연습 대상으로 삼지 않습니다.

삭제 전 모의 실행과 목록 읽기

apt-get -s remove hello
apt-get -s purge hello
apt-get -s autoremove

각 결과에서 지워질 패키지를 비교합니다. 예상과 다른 드라이버·서비스가 포함되면 실제 실행하지 않습니다. 동의한 범위에서만 sudo apt remove hello처럼 적용하고, -y로 확인 단계를 생략하지 않습니다.

보류 확인과 원상 복구

(
set -eu
if [ "$(dpkg-query -W -f='${Status}' hello 2>/dev/null)" != "install ok installed" ]; then
    printf 'Install the nonessential hello lab package first.\n' >&2
    exit 1
fi
was_held=$(apt-mark showhold | grep -x hello || true)
sudo apt-mark hold hello
apt-mark showhold
if [ "$was_held" != hello ]; then
    sudo apt-mark unhold hello
fi
apt-mark showhold
)

설치된 hello의 기존 보류 여부를 먼저 저장하고 이번에 새로 보류한 경우만 해제합니다. 원래 보류되어 있었다면 그대로 남깁니다. 해제는 업데이트 설치와 다르며, 실패하면 출력과 실제 보류 상태를 다시 조사합니다. 다른 패키지의 보류도 유지하고 장기 보류에는 이유·검토일·보안 영향을 기록합니다.

잠금 오류는 실행 중인 작업부터 확인하기

systemctl status apt-daily.service apt-daily-upgrade.service --no-pager
ps -eo pid,etime,args | grep -E "[a]pt|[d]pkg|[u]nattended"

다른 업데이트가 정상 진행 중이면 기다립니다. 잠금 파일을 지우거나 패키지 프로세스를 무작정 강제 종료하면 데이터베이스 작업을 망가뜨릴 수 있습니다. 서비스가 비활성이라는 출력만으로 잠금이 고아 상태라고 결론 내리지 말고 관련 프로세스와 로그를 함께 확인합니다.

미완료 설정과 의존성 복구

sudo dpkg --audit
apt-get -s --fix-broken install

중단된 설치의 패키지 설정이 남았다면 작업 로그와 백업을 확인한 뒤 sudo dpkg --configure -a를 사용할 수 있습니다. 이 명령은 설치 스크립트를 실행하며 서비스가 바뀔 수 있습니다. 깨진 의존성의 모의 실행에서 필요한 설치·삭제만 제안하는지 읽고 sudo apt-get --fix-broken install 적용 여부를 판단합니다.

오류가 저장소의 지원 종료·잘못된 버전 혼합에서 왔다면 의존성 명령을 반복하기보다 출처를 고칩니다. 끝나면 sudo dpkg --audit, sudo apt-get check와 해당 서비스의 실제 동작을 확인합니다. 패키지 검사 성공과 앱 데이터 복구 성공은 다른 결과입니다.

공식 패키지 관리 문서에서 제거와 의존성 처리의 기본 동작을 확인할 수 있습니다.