두 호스트에 설치된 패키지 간의 차이점 목록 계산


11

데비안 가상 서버에 문제를 추가하고 처음부터 다시 설치하기 위해 추가합니다. 그러나 여전히 이전 버전에 액세스 할 수 있었고 설치된 패키지 목록을 검색 할 수 있습니다.

앞으로 가상 서버를 복원하는 프로세스를 용이하게하기 위해 각 서버마다 특정 패키지 목록을 만들고 싶습니다.

내가 성취하고 싶은 것을 더 잘 설명하기 위해. 이미 기본 패키지와 구성을 사용하여 새 가상 서버를 만드는 자동화 된 프로세스가 이미 있습니다. 이제이 "골격"으로 델타를 저장하여 특정 서버를 쉽게 다시 설치할 수 있습니다.

실제 플러스는 변경된 구성 파일을 기본값에서 저장하는 것이지만 패키지 목록으로 만 살 수 있습니다.

간단히 말해서 호스트에는 설치되었지만 다른 패키지에는 설치되지 않은 패키지 목록을 만드는 방법이 필요합니다.

목록에 모든 종속성 목록이 아닌 수동으로 설치된 패키지 만 포함되어 있으면 정말 좋습니다.

이 특정 작업을 수행하도록 설계된 기존 도구가 있으면 자유롭게 제안하십시오. 그러나 가능한 한 종속성을 작게 유지하고 싶습니다. 정보는 정확히 가상 서버가 아니라 LXC 컨테이너입니다.


생각 만해도 반대 방향에서이 작업을 시작해야 할 때입니다. 정보를 가져 오는 대신 구성 관리 시스템 (인형)을 설정해야하는 이유. 그런 다음 관리되는 시스템으로 작업을 푸시하십시오.
Zoredache

오, BTW,이 질문을 보라. serverfault.com/questions/3852/…
Zoredache

@ Zoredache 나는 현재이 모든 것을 관리하는 더 좋은 방법을 찾고 있지만 그 동안 서버의 상태를 저장하는 빠른 방법을 찾고 싶었습니다. 링크 주셔서 감사합니다!
krtek

답변:


12

참조 설치에서 (한 번만) :

dpkg-query -W -f='${Package}\n' | sort > baselist.txt

(다음은 가정 bash)

참조 설치에서 패키지를 추가하려면 (제거 된 내용은 표시되지 않음) :

comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)

더 나은, 사본을 피하십시오 baselist.txt:

comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)

2

이전 서버에서 다음을 실행하십시오.

dpkg --get-selections> 이전 패키지 목록

위 파일을 새 서버에 복사하고 새 서버에서 실행하십시오.

dpkg --set-selections <이전 패키지 목록

적절한 업데이트

dselect 업데이트

또한 /etc/apt/sources.list패키지를 마이그레이션하기 전에 이전 서버에서 새 서버로 모든 추가 리포지토리를 추가 해야합니다. 그렇지 않으면 대부분의 패키지가 설치되지 않은 상태로 유지됩니다.


전체 패키지 목록이 저장되며 서버를 복원하는 데 사용한 솔루션입니다. 그러나 앞으로는 프로세스를 쉽게하기 위해 기본 서버와 다른 패키지 목록 만 저장하려고합니다.
krtek

1
좋아, 그것은 매우 쉽다. 먼저 "dpkg --get-selections> old-packages-list"로 오래된 서버에서 목록을 백업 한 다음 "dpkg --get-selections로 새로운 서버에서 패키지 목록을 얻는다. > new-packages-list ",,"cat old-packages-list | awk '{print $ 1}'> old-list ",,, 새 서버에서 동일한 명령을 실행하지만 old를 new로 바꿉니다. 두 파일에서 diff를 실행하면 차이점이 표시됩니다. 에 의해 diff -w 이전 목록 새 목록
Farhan

1
cut -f1probablz가 awk보다 빠르며 Khaled 답변에 대한 의견과 같이 diff가 항상 올바른 결과를 반환하지는 않습니다. 해결책 comm은 지금 정말로 기쁘게 생각합니다 ... 그러나 수동으로 설치된 패키지 만 나열하는 버전이 없습니다.
krtek

1

다음 명령을 사용하여 두 서버에서 전체 패키지 목록을 가져올 수 있습니다.

     dpkg -l | sort > old_file
     dpkg -l | sort > new_file

그런 다음 다음을 사용하여 차이점을 얻을 수 있습니다.

     diff -Nur old_file new_file > changes.txt

grep을 사용하여 필요한 변경 사항을 필터링 할 수 있습니다. 또한 diff를 사용하여 구성 파일의 변경 사항을 가져오고 필요한 경우 적용 할 패치를 생성 할 수 있습니다. 그건 그렇고, diff는 두 파일뿐만 아니라 두 폴더를 비교할 수 있습니다.


diff 출력의 문제점은 자동으로 모든 것을 다시 설치하기 위해 apt-get에 직접 공급할 수 없다는 것입니다. 그리고 제안 된 Shellholic과 같이 comm을 사용하는 것이 더 좋은 경우이 경우 diff는 잘못된 결과를 제공 할 수 있습니다 패키지 목록이 정말 깁니다.
krtek

또 다른 문제는 dpkg가 출력 열의 크기를 자동으로 조정한다는 것입니다. 따라서 더 긴 패키지 이름을 가진 서버의 dpkg -l은 diff를 어렵게 만듭니다.
Paolo

1

블루 프린트 는 정확히 당신의 필요를 위해 설계되었습니다. 설치된 설명 패키지와 변경된 구성 파일을 뱉습니다. 이 설명을 Puppet 또는 Chef 스크립트로 변환하여 깔끔한 상자에 적용 할 수 있습니다.


0

또한이 유용한 패키지를 찾았습니다. 설명은 다음과 같습니다.

데비안 패키지의 파일 시스템 트리를 현재 파일 시스템 트리와 비교하여 다른 파일에 대해 통합 된 diff를 인쇄하는 Bash 스크립트.

https://code.google.com/p/dpkg-diffs/

PATH에 어딘가에 붙어서 실행할 수있는 하나의 bash 파일 만 있으면 나에게 너무 오래되지 않은 것처럼 보입니다.

이것이 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.