Looking One Layer Down With dpkg
한국어 원문으로 표시합니다.
목표
dpkg 로 시스템을 조회하고, 직접 .deb 를 빌드해 설치까지 해 봅니다. apt 없이 패키지를 다뤄 보면 apt 가 무엇을 대신해 주고 있었는지가 분명해집니다.
왜 중요한가
dpkg 는 저장소를 모릅니다. 주어진 파일을 풀고(unpack), 의존이 만족되면 마무리(configure)할 뿐입니다. 그래서 dpkg -i 는 의존성을 자동으로 끌어오지 않고 iU 상태로 멈춥니다. 이 분업을 알면 폐쇄망에서 왜 "설치 순서"가 중요한지, apt-get -f install 이 무엇을 고치는지가 전부 설명됩니다. 그리고 dpkg -S 로 파일의 출신을 확인하는 습관은 낯선 서버에서 가장 먼저 쓰는 무기입니다.
단계
/root/dpkg디렉터리를 만들고, 현재 설치 완료(ii) 상태인 패키지의 개수만 숫자 한 줄로/root/dpkg/count.txt에 적으세요.coreutils패키지가 설치한 파일 중/usr/bin/아래에 있는 것만 골라/root/dpkg/coreutils-bin.txt로 저장하세요./usr/bin/ls를 소유한 패키지 이름만 한 줄로/root/dpkg/owner.txt에 적으세요.dpkg-query로bash패키지의이름 버전 아키텍처를 공백으로 구분한 한 줄로 만들어/root/dpkg/bash-fields.txt에 저장하세요./opt/fixtures/pkg/labhub-tool디렉터리를.deb로 빌드해/root/dpkg/labhub-tool_1.2.0-labhub1_all.deb로 저장하세요.- 빌드한 패키지의 제어 정보를
/root/dpkg/deb-info.txt로, 파일 목록을/root/dpkg/deb-contents.txt로 저장하세요. - 그 패키지를 설치하고,
labhub-tool명령을 실행한 결과를/root/dpkg/run.txt에 저장하세요. /root/dpkg/report.txt를 다음 4줄로 만드세요.PACKAGE=labhub-tool/VERSION=<설치된 버전>/FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)>/OWNER_OF_LS=<3번에서 찾은 패키지 이름>
참고
dpkg-deb --build <디렉터리> <출력파일>로 빌드합니다.dpkg -L <패키지> | while read p; do [ -f "$p" ] && echo "$p"; done | wc -l이면 디렉터리를 뺀 파일 수가 나옵니다.- 흔한 실수 1: 1번에서
dpkg -l | wc -l을 그대로 쓰면 머리말까지 세어 5줄이 더해집니다. - 흔한 실수 2: 5번에서 빌드 대상 디렉터리 안으로 들어가서
dpkg-deb --build .를 하면 상대 경로 때문에 헷갈립니다. 절대 경로로 지정하세요.
작업 디렉터리와 설치 목록
/root/dpkg 디렉터리를 만들고, 현재 설치 완료(ii) 상태인 패키지의 개수만 숫자 한 줄로 /root/dpkg/count.txt 에 적으세요.
dpkg -l 의 출력에서 실제 패키지 줄은 상태 표시(ii 등)로 시작합니다. 머리말 다섯 줄은 패키지가 아닙니다.
패키지가 깐 파일 목록
coreutils 패키지가 설치한 파일 중 /usr/bin/ 아래에 있는 것만 골라 /root/dpkg/coreutils-bin.txt 로 저장하세요.
dpkg -L 은 디렉터리도 함께 출력합니다. 실행 파일만 필요하다면 경로로 걸러야 합니다.
이 파일은 누가 깔았나
/usr/bin/ls 를 소유한 패키지 이름만 한 줄로 /root/dpkg/owner.txt 에 적으세요.
dpkg -S 는 '패키지: 경로' 형식으로 답합니다. 필요한 것은 콜론 앞부분입니다.
원하는 필드만 뽑기
dpkg-query 로 bash 패키지의 이름 버전 아키텍처 를 공백으로 구분한 한 줄로 만들어 /root/dpkg/bash-fields.txt 에 저장하세요.
dpkg-query -W -f 의 형식 문자열에서 필드는 달러 기호와 중괄호로 감쌉니다. 줄바꿈은 백슬래시 n 입니다.
픽스처로 .deb 빌드하기
/opt/fixtures/pkg/labhub-tool 디렉터리를 .deb 로 빌드해 /root/dpkg/labhub-tool_1.2.0-labhub1_all.deb 로 저장하세요.
dpkg-deb --build 는 DEBIAN/control 이 들어 있는 디렉터리를 통째로 패키지로 만듭니다. 출력 파일 이름을 두 번째 인자로 줄 수 있습니다.
빌드한 패키지 뜯어보기
빌드한 패키지의 제어 정보를 /root/dpkg/deb-info.txt 로, 파일 목록을 /root/dpkg/deb-contents.txt 로 저장하세요.
dpkg-deb 에는 -I(정보)와 -c(내용 목록) 옵션이 있습니다. 두 출력은 성격이 완전히 다릅니다.
설치하고 상태 확인
그 패키지를 설치하고, labhub-tool 명령을 실행한 결과를 /root/dpkg/run.txt 에 저장하세요.
dpkg -i 로 설치한 뒤 dpkg -s 의 Status 줄을 확인하세요. 의존성이 안 풀리면 iU 상태로 남습니다.
패키지 종합 보고서
/root/dpkg/report.txt 를 다음 4줄로 만드세요.
PACKAGE=labhub-tool / VERSION=<설치된 버전> / FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)> / OWNER_OF_LS=<3번에서 찾은 패키지 이름>
앞 단계에서 만든 파일들을 재활용하세요. 파일 개수는 dpkg -L 결과에서 실제 파일만 세면 됩니다.