종속성을 포함하지 않고 설치된 데비안 패키지 목록을 찾는 방법은 무엇입니까?

종속성을 포함하지 않고 설치된 데비안 패키지 목록을 찾는 방법은 무엇입니까?

저는 두 개의 debian 11 시스템(서버 1과 서버 2), debian 9와 11 시스템(서버 3과 서버 2)을 비교하고 동일한 패키지가 있는지 확인하려고 합니다. 누락된 패키지를 설치하기 위해 ansible을 사용할 계획입니다.

내가 찾고 있어요데비안은 설치된 패키지 목록을 어디에 저장합니까?그러나 적절한 패키지 버전은 표시되지 않으며 종속성도 표시됩니다. system2에 누락된 패키지를 비교하고 설치할 수 있도록 버전 번호와 함께 system1에 설치된 데비안 패키지만 필요합니다.

답변1

apt-mark showmanual

수동으로 설치된 모든 패키지가 나열됩니다.종속성으로 끌어들이고 설치된 상태를 유지하는 것이 아니라 명시적으로 설치되는 패키지입니다.

해당 버전을 얻으려면 다음을 사용하십시오.

dpkg-query -W $(apt-mark showmanual)

그러나 이를 사용하여 한 시스템에서 다른 시스템으로 패키지 선택을 안정적으로 복사할 수는 없습니다. 종속성 계산은 (패키지 종속성이 발전함에 따라) 서로 다른 시점에서 서로 다른 결과를 생성하기 때문입니다. apt이는 패키지 세트를 설치하도록 요구해도 몇 달 또는 몇 년 전과 마찬가지로 현재 시스템에서 정확히 동일한 결과가 생성되지 않는다는 것을 의미합니다 .가능한특히 두 시스템이 동일한 기본 버전의 데비안으로 설치된 경우에는 동일한 결과를 생성하지만 이에 의존할 수는 없습니다.

또한 특정 버전에 의존하는 것은 그다지 유용하지 않습니다. apt저장소에서 현재 사용 가능한 버전만 설치할 수 있으므로 "소스" 시스템에 버전이 포함된 저장소를 유지하지 않는 한 거기에 설치된 버전을 알 수 있습니다. 귀하의 목표에 대해 실행 가능한 정보를 제공하지 않습니다. 당신은 또한 볼 수 있습니다이전 버전의 데비안 패키지가 패키지 저장소에서 사라지는 이유는 무엇입니까? (버전 관리 시스템 구성과 관련성이 높음)

실제로는 다음에 설명된 방법 중 하나를 사용해야 합니다.한 데비안 시스템에서 다른 데비안 시스템으로 설치된 패키지를 선택하여 복사하는 방법은 무엇입니까? (데비안 헐떡임)— 기본적으로 dpkg --get-selections모든 패키지 "선택 사항"을 나열한 다음 이를 대상 시스템에 dpkg --set-selections적용하는 데 사용됩니다.apt-get dselect-upgrade

답변2

기본 접근 방식은 다음과 같습니다.

dpkg -l | awk '/^ii/ {print $2}'

설치된 모든 패키지 목록을 반환합니다(^ii가 이에 해당합니다).

여기에는 버전 번호가 포함되지 않지만 사용 중인 저장소의 패키지 풀에서 버전이 변경되었을 수 있으므로 버전 번호를 기반으로 설치할 수는 없습니다.

apt-get update 를 실행한 후에만 apt에서 실제로 버전을 설치할 수 있고 두 시스템 모두 Debian 11이므로 풀 패키지 수에 동일한 버전이 있으므로 버전 번호가 필요하다고 생각하는 이유가 무엇인지 잘 모르겠습니다. , 타사 저장소 등을 사용하지 않는 한.

각 시스템에 대한 목록을 생성한 다음 대상 시스템 목록에 나타나지 않는 패키지만 설치할 수 있습니다.

스크립트를 사용하여 이와 같은 작업을 수행하면 패키지가 소스 시스템 목록에 대해 대상 시스템에 설치되어 있는지 테스트하고 패키지가 없는 경우에만 설치하지만 루프에서 이를 수행해야 하므로 더욱 강력해집니다. , 어떤 이유로 패키지를 대상 시스템의 저장소에서 사용할 수 없는 경우 하나씩 실행하지 않으면 모든 것이 실패하기 때문입니다.

명확한 방법은 두 개의 목록을 생성하고 대상 시스템에 없는 패키지의 작은 diff 목록을 만든 다음 해당 작은 목록을 반복하여 하나씩 설치하는 것입니다. 반복하면 설치가 실패하고 목록의 다음 설치가 계속되므로 고립된 문제가 해결됩니다.

Bash는 두 목록을 비교하여 누락된 항목을 찾습니다.

Bash만으로 목록을 비교하는 방법에 대한 예가 있지만 원하는 것보다 조금 더 복잡합니다.

이와 같은 작업을 수행하려면 전체 스크립트를 사용하는 것이 더 나을 것이라고 생각합니다. 저는 개인적으로 Perl에서 수행하겠지만 이런 종류의 작업에 사용하고 싶은 것은 무엇이든 사용할 수 있습니다.

고아를 만들다

또 다른 문제는 이로 인해 누락된 패키지가 하나씩 설치된다는 것입니다. 여기에는 다양한 종속성이 포함될 수 있지만 원하지 않는 고아 패키지가 포함될 수도 있습니다.

예를 들어, 시스템이 다음 Debian 안정 릴리스로 여러 번 업그레이드된 경우 고아 패키지가 발생할 수 있으며, 이로 인해 제거할 수 없는 고아 패키지가 남을 수 있습니다.

이 접근 방식의 가장 큰 단점은 해당 패키지가 변경되거나 새 버전을 얻을 수 있기 때문에 실제로 패키지의 종속성을 설치하고 싶지 않다는 것입니다. 그러면 해당 패키지는 고아가 되지만 명시적으로 설치했기 때문에 apt autoremove에 의해 제거되지 않습니다. 따라서 종속성이 도입되지 않고 명시적으로 설치된 것으로 표시됩니다. 이는 lib 패키지에 더 자주 영향을 주지만 설치 시 다양한 패키지를 가져오는 다른 항목에도 영향을 미칠 수 있습니다.

이 문제를 해결하기 위해 더 많은 스크립트를 사용할 수 있지만 복잡해질 수 있으므로 패키지를 일치시키는 것이 목표라면 완료될 때까지 하나씩 설치하면 됩니다. 설치가 약간 엉망이 되고 약간의 혼란이 추가되지만, 이를 수행하는 쉬운 방법입니다.

주의해서 추천합니다!

이 작업을 수행할 때 --no-install-recommends를 사용하는 것이 중요합니다. 그렇지 않으면 정말 엉망이 될 것입니다. 이러한 이유로 저는 항상 권장 사항을 설치하지 않도록 시스템을 구성합니다. 권장 사항은 제어할 수 없는 항목에 쉽게 데이지 체인으로 연결될 수 있습니다. --no-install-recommends 없이 단일 작은 CLI 프로그램이 설치된 경우 데이지 체인으로 인해 몇 가지를 가져오려고 시도하는 몇 가지 예를 온라인에서 본 적이 있습니다. 100MB 패킷 문제입니다.

예를 들어 /etc/apt/apt.conf.d/에는 80basics와 같은 파일에 다음 줄을 추가할 수 있습니다.

APT::Install-Recommends "0";
APT::Install-Suggests "0";
APT::AutoRemove::SuggestsImportant "false";
APT::AutoRemove::RecommendsImportant "false";

추천이나 제안을 자동으로 설치하고 싶은 상황은 본 적이 없습니다.

이렇게 하는 것이 더 좋은 방법일 수도 있습니다

나는 이것이 동기화 시스템의 표준 문제이기 때문에 이를 수행하는 더 좋은 방법이 있다고 생각합니다. 아마도 일부 기본 데비안 도구나 일부 타사 도구가 이 작업을 수행할 수 있을 것입니다. 이와 같은 일이 발생하지 않으면 나는 놀랄 것입니다. 존재하지 않지만 모르겠습니다.

답변3

다른 답변 dpkg의 변형은 다음과 같습니다.

dpkg-query -W

패키지 이름과 패키지 버전의 정렬된 목록을 출력합니다. 각 줄에는 패키지 이름, 탭 및 패키지 버전 문자열이 있습니다. -W목록을 일치하는 패키지 이름(예: 이름에 포함된 패키지)으로 줄이기 위해 옵션에 인수로 glob 표현식(작은따옴표)을 추가할 수 있습니다. dpkg-query -W '*apt*'또는 출력을 라인으로 파이프하거나 라인을 필터링하거나 리디렉션할 수 있습니다. 파일로 출력하고 텍스트 편집기를 사용하여 읽습니다.aptgrepawksedcat

관련 정보