내 시스템은 Debian Buster입니다. git을 사용하여 설치된 패키지 목록을 추적하고 싶습니다.
설치된 패키지 나열을 사용할 때 dpkg -l
목록은 어디에서 가져오나요?
에서 일부 패키지 정보를 찾았 /var/lib/dpkg/status
지만 해당 파일에는 내가 관심 있는 것보다 더 많은 정보가 포함되어 있습니다. 패키지 목록이 저장되는 다른 장소가 있나요?
설치된 패키지, 해당 버전 또는 제거된 패키지를 알 수 있는 가장 좋은 추적 파일은 무엇입니까?
고쳐 쓰다
git을 사용하여 /var/lib/dpkg/status 추적을 시도했지만 출력이 매우 불분명하고 혼란스러웠습니다. 상태 정보가 너무 많습니다. 설치된 패키지 목록과 해당 버전을 추적하면 됩니다. dpkg -l의 출력과 유사합니다.
dpkg -l로 표시된 패키지 목록이 일부 파일에 저장되어 있습니까, 아니면 매번 동적으로 생성됩니까?
/var/lib/dpkg/에 git 저장소를 만들고 git에 몇 가지 필터를 만들어 기본적으로 dpkg -l의 출력을 추적할 수 있나요? 아니면 git status를 실행할 때마다 목록이 동적으로 생성될 수도 있나요? 아니면 다른 솔루션이 있다면 git이 어떤 가능성을 제공하는지 잘 모르겠습니다.
답변1
설치된 패키지 목록예; 이것은 /var/lib/dpkg/status
정식 참조입니다. 설치된 패키지는 "설치 확인 설치됨" 상태로 이 파일에 표시됩니다. dpkg -l
이 파일은 실행될 때마다 처리되며 파일에 저장된 정보는 출력을 생성하는 데 사용됩니다.
더 간단한 데이터 집합을 추적하여 비교를 단순화하려면 필요할 때 생성해야 합니다.
설치된 패키지 목록을 추적하려면 다음을 실행할 수 있습니다.
dpkg --get-selections
git
버전도 원하므로 주기적으로 추적된 파일에 출력을 저장합니다.
dpkg -l
더 적절할 수도 있습니다.
지적한대로마틴 콘래드, 여기서 생성된 정보를 사용하여 나중에 시스템 상태를 복원할 수 있으려면 수동으로 설치된 태그도 추적해야 하며, 보존도 추가하겠습니다.
apt-mark showmanual
apt-mark showhold
위의 모든 내용을 후크에 추가하여 시스템의 모든 변경 사항을 추적할 수 있습니다 . dpkg
예를 들어 /etc/packages/
파일을 저장하려면(대신 /var/lib/dpkg
"소유자"는 dpkg
그대로 유지되어야 함)/etc/dpkg/dpkg.cfg.d/package-history
post-invoke="if [ -x /usr/local/bin/package-history ]; then /usr/local/bin/package-history; fi"
그리고 다음과 /usr/local/bin/package-history
같은 파일이 포함되어 있습니다
#!/bin/sh
cd /etc/packages
dpkg --get-selections > selections
dpkg -l > list
apt-mark showhold > holds
apt-mark showmanual > manual
후자는 실행 가능해야 합니다.
sudo chmod 755 /usr/local/bin/package-history
위 명령의 출력은 모두 정렬되어 있으므로 사후 처리할 필요가 없습니다. 이러한 파일을 사용하면 설치된 패키지의 상태를 정확하게 복원하고, 버전 변경 사항을 추적하고, 제거되었지만 제거되지 않은 패키지를 볼 수도 있습니다.
스크립트 에 추가 git commit
(변경 사항을 먼저 확인) 하거나 이를 사용하여 파일의 변경 사항을 추적 하거나 git 저장소 자체를 만들 수도 있습니다 . 후크를 사용하여 파일이 업데이트되는지 확인하세요.package-history
etckeeper
/etc/packages
/etc/packages
dpkg
어느apt
에 의해 구동 되거나 dpkg
에 기반한 다른 패키지 변경 사항 스크립트 자체 내에서 커밋 dpkg
하면 커밋 세분성이 실행 에 해당하고 관련 작업에 해당합니다 .package-history
dpkg
etckeeper
etckeeper
스크립트에서 제출을 처리하려면 다음을 추가하세요.
if [ "$(git status --porcelain | wc -l)" -gt 0 ]; then
git add *
git commit -m 'Update package information'
fi
위 스크립트의 끝으로 이동한 다음 루트로 수동으로 한 번 실행하여 git 기록을 초기화해야 합니다(나중에 mkdir /etc/packages; git init /etc/packages
).
답변2
패키지 목록(표시된 대로)이
dpkg -l
일부 파일에 저장되어 있습니까, 아니면 매번 동적으로 생성됩니까?
Stephen Kitt의 답변은 이미 이를 보여줍니다. /var/lib/dpkg/status
정보는 거기에 있고 다른 모든 것은 단지 그것을 구문 분석하는 것입니다. dpkg -l
정보를 하나의 (기본) 형식으로 표시하며 dpkg-query
(본질적으로는 dpkg -l
) 다른 형식으로 정보를 표시하는 데 사용할 수 있습니다.
유사한 기능을 가진 패키지에서 영감을 얻을 수 있으며,etckeeper
. 패키지 변경 사항에 대한 변경 사항을 dpkg
커밋하기 위한 후크를 추가 /etc
하고 커밋 메시지에 패키지 목록을 포함합니다. git에서는 패키지 목록을 추적하지 않으므로 직접 사용할 수 없습니다.
다음과 같은 후크를 추가합니다.
# cat apt/apt.conf.d/05etckeeper
DPkg::Pre-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
DPkg::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };
RPM::Pre-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
RPM::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };
dpkg-query -W -f '${Status}\t${Package} ${Version} ${Architecture}\n'
패키지 목록을 가져오기 위해 etckeeper 작업 자체가 호출됩니다 .
그래서 당신은 그런 일을 할 수 있습니다. 다음을 포함하는 파일을 만듭니다 /etc/apt/99-track-packages
.
DPkg::Post-Invoke { "/some/script"; };
다음 /some/script
과 같습니다.
#! /bin/sh
cd /some/git/directory
dpkg -l >> list-of-packages
git commit -am 'some message'
그런 다음 apt가 호출될 때마다 커밋이 발생합니다 dpkg
.