소개
Ubuntu 소프트웨어는 일반적으로 패키지 형태로 제공됩니다. 저장소에는 패키지 파일과 함께 이름, 버전, 의존성, 다운로드 위치를 설명하는 메타데이터가 게시됩니다. apt는 저장소를 사용하고 의존성을 해결하며, dpkg는 더 낮은 수준에서 설치된 .deb 패키지 데이터베이스를 관리합니다.
이 실습에서는 메타데이터를 업데이트하고, 설치 전에 패키지를 검색하며, 설치된 패키지를 검사하고 제거한 다음, 재현 가능한 로컬 .deb 패키지를 설치합니다. 모든 변경 사항은 실습 전용 패키지를 사용하며, 터미널 기록이 아니라 패키지 상태를 통해 결과를 확인할 수 있습니다.
패키지 상태와 저장소 확인
이 단계에서는 저장소 구성, 사용 가능한 메타데이터, 설치된 패키지 상태를 구분해 봅니다.
활성화된 저장소 정의를 확인합니다. 최신 Ubuntu 이미지에서는 .list 또는 .sources 파일을 사용할 수 있습니다. 다음 읽기 전용 파이프라인은 두 위치를 모두 검색합니다. grep -R은 재귀적으로 검색하고, -h는 원본 파일 이름을 표시하지 않으며, -s는 존재하지 않는 파일에 대한 메시지를 숨기고, -E는 그룹화된 패턴을 활성화합니다. head는 일치하는 줄을 최대 12 개까지만 표시합니다.
grep -RhsE '^(deb |Types:|URIs:|Suites:)' /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null | head -n 12
Bash 가 설치되어 있는지 dpkg에 확인합니다. -W는 패키지 레코드를 선택하고, -f는 출력 형식을 지정합니다. ${Package}, ${Version}, ${db:Status-Status}는 셸 변수가 아니라 dpkg 필드입니다. 형식 지정 문자열이 작은따옴표 안에 있기 때문입니다.
dpkg-query -W -f='package=${Package} version=${Version} status=${db:Status-Status}\n' bash
dpkg-query는 로컬 설치 상태를 읽습니다. 반면 apt-cache policy는 설치된 버전과 구성된 저장소에서 확인되는 버전을 비교합니다.
apt-cache policy bash
설치 상태를 안정적으로 기록합니다.
mkdir -p /home/labex/project/package-lab
dpkg-query -W -f='${Package} ${db:Status-Status}\n' bash > /home/labex/project/package-lab/bash-state.txt
cat /home/labex/project/package-lab/bash-state.txt
저장소 메타데이터 새로 고침
이 단계에서는 패키지 인덱스를 새로 고치고 apt update가 변경하는 내용을 확인합니다.
다음 명령을 실행합니다.
sudo apt update
이 명령은 최신 저장소 메타데이터를 다운로드합니다. 설치된 모든 패키지를 최신 버전으로 업그레이드하는 명령은 아닙니다. 설치된 패키지를 업그레이드하려면 별도의 작업인 apt upgrade를 사용해야 합니다.
메타데이터 캐시 디렉터리를 확인합니다.
ls -ld /var/lib/apt/lists
find /var/lib/apt/lists -maxdepth 1 -type f | head
일반 메타데이터 파일이 몇 개 있는지 기록합니다.
find /var/lib/apt/lists -maxdepth 1 -type f | wc -l | tr -d ' ' > /home/labex/project/package-lab/index-file-count.txt
cat /home/labex/project/package-lab/index-file-count.txt
저장소 패키지 검색, 검사 및 설치
이 단계에서는 패키지를 설치하기 전에 먼저 내용을 확인합니다.
트리 형태로 디렉터리를 표시하는 유틸리티의 패키지 이름과 설명을 검색합니다.
apt search '^tree$'
패키지 메타데이터를 확인합니다.
apt show tree
의존성을 처리하면서 패키지를 설치합니다. sudo는 필요한 관리자 권한을 제공하며, -y는 이미 검토한 설치 요청에 자동으로 yes라고 응답합니다.
sudo apt install -y tree
패키지 상태와 명령 검색 경로를 모두 확인한 다음 명령을 실행합니다.
dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' tree | tee /home/labex/project/package-lab/tree-installed.txt
command -v tree
tree -L 1 /home/labex/project/package-lab
패키지가 제공하는 파일 경로를 나열합니다.
dpkg -L tree | head
패키지 제거 및 결과 확인
이 단계에서는 실습에 사용한 저장소 패키지를 제거하고 관련된 정리 작업의 차이를 살펴봅니다.
tree를 제거합니다.
sudo apt remove -y tree
remove는 패키지가 설치한 프로그램을 삭제하지만 패키지 구성 파일은 남길 수 있습니다. purge는 패키지가 소유한 구성 파일까지 제거합니다. autoremove는 자동으로 설치되었지만 더 이상 필요하지 않은 의존성을 제거합니다. 실제 호스트에서는 실행 전에 제거 대상 목록을 반드시 검토해야 합니다.
시스템을 변경하지 않고 의존성 정리가 수행할 작업을 미리 확인합니다. --dry-run 옵션은 계산만 수행하고 아무것도 제거하지 않습니다.
sudo apt autoremove --dry-run | tee /home/labex/project/package-lab/autoremove-preview.txt
공유 호스트나 운영 호스트에서는 --dry-run 없이 apt autoremove를 실행하기 전에 제안된 작업을 반드시 검토하세요.
현재 Bash 세션이 명령의 이전 경로를 기억하고 있을 수 있습니다. 명령 위치 캐시를 지운 다음 명령이 사라졌는지 확인하고 패키지 데이터베이스 상태를 기록합니다.
hash -r
command -v tree || echo "tree command is unavailable"
dpkg-query -W -f='${db:Status-Status}\n' tree 2>/dev/null || echo "not-installed" | tee /home/labex/project/package-lab/tree-removed.txt
dpkg 가 잔여 레코드를 유지하는지와 관계없이 일관된 상태 표식을 기록합니다.
if dpkg-query -W -f='${db:Status-Status}' tree 2>/dev/null | grep -qx installed; then echo "still-installed"; else echo "not-installed"; fi > /home/labex/project/package-lab/tree-removed.txt
cat /home/labex/project/package-lab/tree-removed.txt
로컬 Deb 패키지 검사 및 설치
이 단계에서는 준비된 .deb 패키지를 검사하고, apt 를 통해 설치한 뒤 명령을 실행하고 깔끔하게 제거합니다.
작업 디렉터리로 이동한 후, 설치하지 않고 패키지 메타데이터와 포함 파일을 확인합니다.
cd /home/labex/project/package-lab
dpkg-deb -I labex-greeter_1.0_all.deb
dpkg-deb -c labex-greeter_1.0_all.deb
./ 접두사는 apt 에 이 항목이 저장소 패키지 이름이 아니라 로컬 파일임을 알려 줍니다.
sudo apt install -y ./labex-greeter_1.0_all.deb
패키지를 조회하고 실행합니다.
dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' labex-greeter
labex-greeter | tee local-package-output.txt
테스트가 끝나면 패키지를 제거하고, 포함되어 있던 명령이 사라졌는지 확인합니다.
sudo apt remove -y labex-greeter
if command -v labex-greeter >/dev/null; then echo "still-installed"; else echo "local-package-removed"; fi > local-package-state.txt
cat local-package-state.txt
요약
저장소 메타데이터와 설치된 상태를 구분하고, apt 인덱스를 새로 고쳤으며, 설치 전에 패키지를 조사했습니다. 또한 패키지가 제공하는 파일과 명령 검색 경로를 확인하고, 저장소 패키지를 제거했으며, 검사한 로컬 .deb 패키지의 전체 설치 및 제거 과정을 완료했습니다.



