Ubuntu (Linux)에 설치된 패키지를 어떻게 추적합니까?


38

(이 질문은 10458 과 매우 유사합니다 . Fedora와 Ubuntu / Debian은 다른 답변을 보증 할만큼 충분히 다른 것으로 제안되었습니다.)

우분투 설치를 사용함에 따라 기본 설치 이상으로 많은 패키지를 점차 설치합니다. 다시 설치하거나 새 컴퓨터를 설치해야하는 경우 일반적으로 해당 특정 패키지 를 다시 설치 하고 싶습니다. 최소한의 번거 로움을 느끼기 위해 빠르게 작업하고 싶습니다. 내가 본 한 모든 패키지 관리자 ( apt-get, aptitudesynaptic)는 어떤 패키지가 설치되어 있는지 알려주고 모두 로그를 가지고 있습니다 (각 도구마다 다른 패키지이지만 번거 롭습니다). 그러나 그들 중 누구도 패키지를 말해 줄 수 없다 내가했습니다종속성 또는 시스템 업데이트와 반대로 설치됩니다. 로그에서 추출해야 할 내용 또는 통합 방법 (다양한 적절한 제품군 도구의 경우)을 확실하지 않다는 점에서 로그조차 까다 롭습니다. 다시 설치하거나 백업 할 때마다 해당 목록을 다시 만드는 방법을 잘 모르겠다는 의미입니다.

필자가이 작업을 수행하기위한 도구를 반드시 기대할 필요는 없지만, 그렇지 않은 경우 해결 방법을 찾고 있습니다. 잡을 패턴, 좋은 경험 법칙, 또는 정확히 기록되는 것에 대한 명확한 아이디어조차도 유용 할 것입니다. 여기에 "최고의 답변"이 없을 수도 있지만 좋은 답변이 도움이 될 것입니다.


아래의 대부분의 답변은 내가 찾고있는 것에 대한 근사치를 제공하며 어느 정도 유용합니다. 선택한 도구는 모든 경고가 있더라도 새로운 시스템에 도구를 자동으로 다시 설치하는 합리적 자동 방법에 가장 가까운 방법입니다.


모든 Linux 배포판에 대해 쉽게 공유되는 답변을 얻을 수있는 것은 아닙니다. 패키지 관리는 다른 Linux 배포판을 구별하는 데 큰 부분을 차지합니다.
Telemachus

Telemachus-맞습니다. 그리고 이것을 두 가지 질문으로 나누는 것이 합리적 일 수 있습니다. 그러나 상당히 전문적인 질문으로 보였고 두 시스템을 모두 사용하므로 너무 좁히고 싶지 않았습니다. 여기에있는 대부분의 답변은 dpkg / apt에 대한 것이므로 rpm / yum에 대한 별도의 질문이 의미가 있습니다.
quark

NixOS :)로 전환하십시오.
Alexey

답변:


31

데비안 기반 컴퓨터에서 이것은 패키지 세트를 복제하는 일반적인 방법 중 하나입니다. 이전 머신에서 :

dpkg --get-selections "*" > my_favorite_packages

파일 my_favorite_packages을 새 컴퓨터로 복사하십시오 (엄지 드라이브는 좋은 옵션이지만 scp잘 작동합니다). 그런 다음 루트 권한으로이 순서를 실행하십시오.

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

설치 한 패키지 얻을 수는 없습니다 . 또한 종속성 등을 얻습니다. 또한 두 머신 사이의 리포지토리가 다르면 모든 베팅이 해제됩니다.

로그까지 로그를 apt-get유지하십시오 /var/log/apt/history.log(주석에서 이것을 업데이트 한 Tshepang에게 감사드립니다). dpkg하지만 (at /var/log/dpkg.log) 구문 분석하기는 어렵고 루트 권한으로 만 읽을 수 있습니다. aptitude에 하나가 /var/log/aptitude있으며 일반 사용자 권한으로 페이지를 넘길 수 있습니다.

내가 알 수있는 한,이 로그 중 어느 것도 자동 설치 종속성과 달리 설치 한 내용을 구체적으로 추적하지 않습니다. 그러나 aptitude검색 에서 해당 정보를 얻을 수 있습니다 . 자동으로 설치된 모든 설치된 패키지를 검색하십시오.

aptitude search '~i ~M'

당신이 원하는 경우 에만 설치 한 것 (하지 자동 종속성을)의 부정 ~M:

aptitude search '~i !~M'

패키지 이름과 "install"이라는 단어 갖도록 형식을 지정하려면 그렇게 할 수 있습니다 aptitude. 피드리스트를 제공합니다 dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(저는 RedHat 또는 RedHat 기반 시스템에는 아무 것도 없습니다. 죄송합니다. 패키지 관리가 다른 배포판을 다르게 만드는 요소 중 하나 이기 때문에 Linux 자체에 대한 답변은 없습니다 .)


조언과 Ludwig의 조합이 트릭을 수행하는 것처럼 보입니다. aptitude는 dpkg에 피드를 제공하는 스크립트를 생성하여 자동화되어 심각한 승리입니다. 그리고 바닐라 머신에서 수행한다면 목록의 차이는 내가 실제로 유용하게 요구하는 것에 가깝습니다.
quark

3
이제 "/var/log/apt/history.log"의 로그를 유지, 그리고에 의해 사용되는 APT 것을 참고 apt-get, synapticaptitude(지금까지 내가 본대로). 이는 2010 년 초부터입니다
tshepang

dpkg.log문은 내 선택이 쉽게, 사소한하지,하지만 너무 어렵지 않다 얻을 수있는 사용자로 우분투 14.04에 사실이 표시되지 않습니다. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas

사실, 처음 생각했던 것처럼 쉽지 않다는 것을 알고 있습니다. 이전 awk 스크립트의 결함은 제거 된 패키지에주의를 기울이지 않습니다. 다음과 같습니다 awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u.
Steve Buzonas

7

dpkg -l '*' > jaunty.original새로 설치된 시스템에 설치된 모든 패키지를 기억하는 데 사용 합니다.

모든 추가 패키지를 설치 한 후에 설치하십시오 dpkg -l '*' > mysystem.2009017.

추가 패키지는 차이점입니다. diff jaunty.original mysystem.2009017


3
기본 개념은 강력합니다. 명령 줄을 사용하여 현재 설치된 응용 프로그램 목록을 덤프 한 다음 명령 줄을 사용하여 해당 패키지를 새 컴퓨터에 설치하십시오. 당신은 접근 방식으로 꽤 창의적이고 구체적으로 얻을 수 있습니다.
pcapademic

1
나는 때 dpkg --get-선택 선호
CesarB

이것은 의존성과 별도로 추가 한 패키지를 추적하지는 않지만 유용한 목록을 생성합니다.
quark

3

적성은 실제로 이것에 아주 능숙합니다. 적성은 어떤 것이 손으로 또는 의존성으로 설치되었는지 알고 있으며 더 이상 필요하지 않고 설치된 것만 제거하도록 지시 할 수 있습니다.

우분투 설치, 우분투 최소, 우분투 데스크탑, 우분투 서버 등을 구성하는 소수의 패키지가 있습니다. Aptitude에 수동으로 설치된 것으로 표시하고 다른 모든 항목을 제거하도록 지시하면 가능한 최소한의 패키지로 끝납니다.

필자는 블로그 에서 데비안 GNU / 리눅스 정리데비안 GNU / 리눅스 정리 (또는 우분투) reprise 라는 두 가지 글에서이 모든 작업을 수행하는 방법에 대해 설명합니다 . 요컨대, 당신이 찾고있는 대답은 다음과 같습니다.

aptitude search ~i | grep -v "i A"

내가 마지막으로 작업했을 때 apt-get을 사용하면 작동하지 않았습니다. 그렇기 때문에 항상 적성을 추천하고 내가 아는 한, 데비안은 적성을 선호하는 앱을 사용하지 않습니다.

Fedora에서 수행하는 방법을 모르므로 다른 질문으로 분리해야합니다. Fedora와 Ubuntu는 서로 다른 운영 체제 이므로 커널과 다른 항목을 공유하더라도 그와 같이 취급해야합니다.


2
나는 당신이 필요없이 그 정보를 얻을 수 있다고 생각합니다 grep: aptitude search '~i !~M'트릭을해야합니다.
Telemachus

1
또한 apt-get더 이상 사용되지 않습니다. 데비안 aptitude은 커맨드 라인에서 패키지 관리를 권장 하지만, 더 이상 사용되지 않습니다 apt-get.
Telemachus

여기에 미묘한 것이 있습니다. 세 번째 열에서 "A"를 찾으면 설치된 패키지가 종속성으로 표시되어있는 것으로 보입니다. 그러나 분명히 모든 것을 포착하지는 못합니다. 목록의 대부분은 명백한 요청에 의해 설치되지 않았습니다.
quark

@Telemachus. 명령과 패턴이있는 명령은 정확히 같은 기능을 수행하지 않습니다. 두 목록의 내용이 다릅니다. 왜 그런지 말해 줄 적성에 대해서는 잘 모르겠습니다.
quark

@Pablo : 로그 링크가 끊어진 것 같습니다. 당신이 그들을 고칠 수 있다면 나는 분명히 그들을 읽고 싶습니다.
quark


1

apt 기반 시스템에서 /var/log/apt/term.log를보십시오. 저에게는 설치가 끝난 곳과 설치가 시작된 곳을 그릴 명확한 선이 있습니다.


수동 설치와 시스템 업데이트가 혼합되어 있으므로 유용하지 않습니다. 또한 설정 용어에 따라 로그는 결국 오래되고 삭제되므로 필요할 때까지 되돌아 가지 않습니다.
quark

이것을 시도하는 사람이라면 apt의 로그를 넘어가는 것은 여기에서 논의 된 다른 옵션보다 훨씬 많은 작업 인 것 같습니다. 로그에서 패키지 목록을 추출하는 것은 자동이 아닙니다.
quark

1

보낸 사람 man aptitude-create-state-bundle:

aptitude-create-state-bundle은 현재 패키지 아카이브 상태를 복제하는 데 필요한 파일을 저장하는 압축 된 아카이브를 생성합니다.

이것은 aptitude수동으로 설치된 패키지 와 동일한 정보를 유지합니다 .

다음과 함께 사용하기위한 것입니다 aptitude-run-state-bundle.

aptitude-run-state-bundle은 aptitude-create-state-bundle (1)에 의해 생성 된 주어진 적성 상태 번들을 임시 디렉토리로 압축 해제하고, 제공된로 호출하여 임시 디렉토리를 제거합니다.


1

사용 dpkg하는 경우 사용자가 패키지를 수동으로 설치했는지 또는 자동으로 (종속성으로 또는 초기 OS 설치 중에) 설치했는지 알 수 없습니다. 해당 정보를 유지하려면 실제로 수동으로 설치된 패키지 목록 만 가져와야합니다.

이를 위해 두 개의 단일 라이너 중 하나를 사용할 수 있습니다. 둘 다 내 컴퓨터에서 정확히 동일한 결과를 산출 하며이 질문에서 지금까지 제안 된 모든 솔루션보다 더 정확합니다. 두 답변 (1)(2) 의 조합입니다 . 원래이 답변을 여기에 게시했습니다 .

사용 apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

사용 aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

비록 언어 현지화 설정을 통한 설치 직후 또는 Totem 코덱 설치 프로그램을 통해 설치 한 직후에 사용자 실제로 설치 한 것으로 생각되지만 여전히 크랙을 겪는 패키지는 거의 없습니다 . 또한 비 버전 별 메타 패키지 만 설치했지만 Linux 헤더 버전도 누적되는 것처럼 보입니다. 예 :

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

작동 원리

  1. 수동으로 설치된 패키지 목록을 가져옵니다. 적성을 위해 추가로 sed줄 끝에 남은 공백이 제거됩니다.
  2. 새로 설치 한 직후에 설치된 패키지 목록을 가져옵니다.
  3. 파일을 비교하고 파일 2에없는 파일 1의 행만 출력하십시오.

다른 가능성도 잘 작동하지 않습니다.

  • 은 Using ubuntu-14.04-desktop-amd64.manifest파일 ( 여기에 대신 우분투 14.04를 들어) /var/log/installer/initial-status.gz. 더 많은 패키지가 설치되어 있지 않아도 수동으로 설치 한 것으로 표시됩니다.
  • apt-mark showauto대신에 사용 /var/log/installer/initial-status.gz. apt-mark예를 들어 xserver-xorg 패키지는 포함하지 않지만 다른 파일은 포함합니다.

둘 다 위의 솔루션보다 더 많은 패키지를 나열합니다.


0

나는 편견이 있고, 내가 제시 한 해결책이 항상 가능한 것은 아니지만,이 상황에 질려있다. 결과적으로 업데이트 / 패키지 관리자 도구로 더 이상 아무것도 설치하지 않습니다.

나는 꽤 어려운 길을 갔다 (버전에 대한 엄격한 요구 사항이 있었다). 필자는 필요한 모든 패키지 (프로그램, 라이브러리 등)를 홈 디렉토리에 다운로드, 컴파일 및 설치하는 거대한 makefile을 만들었습니다. 단계별로 단계별로 개발했습니다. makefile은 컴파일러까지 모든 것을 다운로드하고 컴파일합니다.

새 시스템으로 이동하거나 다시 설치하면 makefile (일부 지원 항목 포함)을 복사하고 make world를 실행하고 다음 날 다시 방문합니다.

내가 개발 한 일부 프로그램 (제어 할 수 있음)에는 프로그래밍 된 도구 인 밤나무 패키지 관리자를 사용 합니다. MacOSX의 .app 폴더와 같은 종류. 모든 것이 패키지에 포함되어 있으므로 언제든지 설치되는 것을 알고 있으며 자체 포함되어 있고 충분하다는 것을 알고 있습니다 (시스템 라이브러리 제외).


패키지 관리자 설치 명령을 스크립트에 넣고 동일한 효과를 얻을 수 있습니다. 필요한 코드가 패키지되어 있다고 가정합니다. 당신의 접근 방식은 젠투와 매우 유사합니다.
wcoenen

알고 반갑습니다. 기본 우분투 / 데비안 시스템 이외의 추가 작업처럼 보입니다. 수동으로 일부 패키지를 유지 관리하는 것을 볼 수 있지만 이러한 방식으로 모든 패키지를 유지 관리 하는 것이 원하는 것보다 더 많은 작업입니다.
quark

예, 그러나 우분투 / 핀 / darwinports 물건이 모든 플랫폼에서 작동하지 않는다는 추가 문제가 있습니다 (한 번 디지털과 IBM sp4를 사용했습니다). 나는 이것이 좋은 방법이라고 주장하지 않습니다. 나는 추악하고 냄새 나는 방식으로 일을한다고 말하고 내 시스템에 어떤 일이 일어나는지 완벽하게 제어합니다.
스테파노 Borini

물론 요즘에는 실제로 모든 것을 드러내고 재 작업하기 위해 진지하게 살펴보기로 결정할 수 있습니다.
Stefano Borini

이 경로는 요즘 요리사와 꼭두각시와 같은 도구를 고려할 때 더 일반적입니다.
Steve Buzonas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.