Jak śledzić, które pakiety zostały zainstalowane na Ubuntu (Linux)?


38

(To pytanie jest bardzo podobne do 10458. Sugerowano, że Fedora i Ubuntu / Debian są na tyle różne, że uzasadniają różne odpowiedzi).

Podczas korzystania z dowolnej konfiguracji Ubuntu stopniowo instaluję wiele pakietów ponad instalacją podstawową. Jeśli przeprowadzam ponowną instalację lub muszę zainstalować nową maszynę, zwykle chcę ponownie zainstalować te konkretne pakiety i chcę to zrobić szybko, aby wrócić do pracy przy minimalnym wysiłku. O ile widziałem wszystkich menedżerów pakietów ( apt-get, aptitudei synaptic) może mi które są zainstalowane pakiety powiedzieć, a wszystkie one mają różne dzienniki (choć te dla każdego narzędzia, które jest uciążliwe). Ale żaden z nich nie może mi powiedzieć, które pakiety mamzainstalowane, w przeciwieństwie do ich zależności lub aktualizacji systemu. Nawet dzienniki są trudne, ponieważ nie jestem do końca pewien, co powinienem z nich wyciągać lub jak je zintegrować (w przypadku różnych narzędzi rodziny apt). Oznacza to, że za każdym razem, gdy ponownie instaluję, a nawet po prostu wykonuję kopię zapasową, nie jestem pewien, jak ponownie utworzyć tę listę.

Niekoniecznie oczekuję, że którekolwiek z narzędzi to dla mnie zrobi, ale jeśli nie, szukam obejścia. Przydałyby się nawet wzorce, za którymi należy się posługiwać, dobre ogólne zasady lub jasne wyobrażenie o tym, co dokładnie jest rejestrowane. Być może nie ma tutaj „najlepszej odpowiedzi”, ale dobre byłyby bardzo pomocne.


Większość poniższych odpowiedzi stanowi przybliżenie tego, czego szukam, i są do pewnego stopnia przydatne. Wybrany to ten, który zbliża się do rozsądnie automatycznego sposobu ponownej instalacji moich narzędzi w nowym systemie, nawet ze wszystkimi jego zastrzeżeniami.


Prawdopodobnie nie otrzymasz jednej łatwo udostępnionej odpowiedzi dla wszystkich dystrybucji Linuksa. Zarządzanie pakietami jest dużą częścią tego, co wyróżnia różne dystrybucje Linuksa.
Telemachus,

Telemachus - Prawda. Podzielenie tego na dwa pytania może mieć sens. Wydawało się to jednak dość wyspecjalizowane pytanie i używam obu systemów, więc nie chciałem zawężać go z wyprzedzeniem. Wygląda na to, że większość odpowiedzi tutaj dotyczy dpkg / apt, więc osobne pytanie dla rpm / yum może mieć sens.
kwark

Przełącz się na NixOS :) (tylko trolling).
Alexey

Odpowiedzi:


31

Na dowolnej maszynie opartej na Debianie jest to jeden z powszechnych sposobów powielania zestawu pakietów. Na starej maszynie:

dpkg --get-selections "*" > my_favorite_packages

Skopiuj plik my_favorite_packagesna nową maszynę (pamięć USB jest dobrą opcją, ale scpdziała również dobrze). Następnie uruchom następującą sekwencję (z uprawnieniami administratora):

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

Nie dostaniesz tylko zainstalowanych pakietów. Dostaje również ich zależności itp. Ponadto, jeśli repozytoria między dwoma maszynami są różne, wszystkie zakłady są wyłączone.

Jeśli chodzi o dzienniki, apt-getprowadzi dziennik na /var/log/apt/history.log(dzięki Tshepang za aktualizację tego w komentarzu); dpkgrobi (at /var/log/dpkg.log), ale słynie, że trudno go analizować i można go czytać tylko z uprawnieniami roota; aptitudema jeden na /var/log/aptitudei możesz przeglądać go z regularnymi uprawnieniami użytkownika.

O ile mogę stwierdzić, masz rację, że żaden z tych dzienników nie śledzi dokładnie tego, co zainstalowałeś, w przeciwieństwie do automatycznie instalowanych zależności. Możesz jednak uzyskać te informacje z aptitudewyszukiwania. Wyszukaj wszystkie zainstalowane pakiety, które również zostały zainstalowane automatycznie:

aptitude search '~i ~M'

Jeśli chcesz tylko te, które zainstalowałeś (a nie automatyczne zależności), zaneguj ~M:

aptitude search '~i !~M'

Jeśli chcesz to sformatować tak, aby mieć tylko nazwy pakietów i słowo „zainstaluj”, aptitudemożesz to zrobić. To daje listę gotową do karmienia do dpkg --get-selections:

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

(Mam nic na systemach RedHat opartych lub RedHat. Przepraszam. Naprawdę nie ma jednej odpowiedzi na Linuksie per se od zarządzania pakietami jest duża część tego, co sprawia, że różne dystrybucje inny ).


Wydaje się, że jest to połączenie twojej rady i porady Ludwiga: aptitude może wygenerować skrypt do karmienia dpkg, więc jest to automatyczne, co jest poważną wygraną. A jeśli ktoś zrobiłby to na maszynie waniliowej, różnica w listach jest wystarczająco zbliżona do tego, o co proszę, aby był praktycznie użyteczny.
kwark

3
Zauważ, że APT teraz prowadzi dziennik w „/var/log/apt/history.log” i jest używane przez apt-get, synaptici aptitude(o ile widziałem). Dzieje się tak od początku 2010 roku.
tshepang

Te dpkg.logoświadczenia nie wydają się być prawdziwe w Ubuntu 14.04 jako dowolny użytkownik mogę dostać pozycje łatwo, nie jest trywialne, ale nie jest zbyt trudne. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas

W rzeczywistości zdaję sobie sprawę, że to nie jest tak proste, jak początkowo myślałem, wada w poprzednim skrypcie awk nie zwraca uwagi na odinstalowane pakiety. To 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 -urobi.
Steve Buzonas

7

Służy dpkg -l '*' > jaunty.originaldo zapamiętywania wszystkich zainstalowanych pakietów w świeżo zainstalowanym systemie.

Po zainstalowaniu wykonaj wszystkie dodatkowe pakiety dpkg -l '*' > mysystem.2009017.

Dodatkowe pakiety to tylko różnica: diff jaunty.original mysystem.2009017


3
Podstawowa idea jest silna: użyj wiersza polecenia, aby zrzucić listę aktualnie zainstalowanych aplikacji, a następnie użyj wiersza polecenia, aby zainstalować te pakiety na nowym komputerze. Dzięki temu podejściu możesz stać się bardzo kreatywny i konkretny.
pcapademic

1
Wolę dpkg --get-selections
CesarB

Chociaż nie śledzi to pakietów, które dodałem w odróżnieniu od ich zależności, zdecydowanie generuje przydatną listę.
kwark

3

Aptitude jest w tym całkiem niezła. Aptitude wie, kiedy coś zostało zainstalowane ręcznie lub zależnie, i możesz to powiedzieć, aby usunąć rzeczy, które nie są już potrzebne i zostały zainstalowane tylko dlatego, że coś innego zależało od tego, zawsze utrzymując twój system tak mały, jak to możliwe.

Istnieje garść pakietów, które składają się na instalację Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server i tak dalej. Jeśli powiesz Aptitude, aby oznaczyło je jako zainstalowane ręcznie i usunęło wszystko inne, to otrzymujesz minimalną możliwą liczbę pakietów.

Wyjaśniam, jak to wszystko zrobić w dwóch postach na moim blogu: Czyszczenie Debiana GNU / Linux i Czyszczenie Debiana GNU / Linux (lub Ubuntu), powtórz . Krótko mówiąc, odpowiedź, której szukasz, to:

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

Ostatnim razem, gdy nad tym pracowałem, jeśli użyłeś apt-get, to nie działało. Dlatego zawsze polecam aptitude i, o ile mi wiadomo, Debian nie stosuje apt-get na korzyść aptitude.

Nie wiem, jak to zrobić na Fedorze i prawdopodobnie powinieneś się rozdzielić niż na inne pytanie. Fedora i Ubuntu to różne systemy operacyjne i powinny być traktowane jako takie (nawet jeśli współużytkują jądro i inne rzeczy).


2
Myślę, że można uzyskać te informacje bez potrzeby grep: aptitude search '~i !~M'należy załatwić sprawę .
Telemachus,

1
Ponadto apt-getnie jest przestarzałe. Debian zaleca aptitudezarządzanie pakietami w wierszu poleceń, ale jest to dalekie od przestarzałych apt-get.
Telemachus

Jest tu coś subtelnego. Szukanie „A” w trzeciej kolumnie wydaje się oznaczać pakiety, o których wiem, że są zainstalowane jako zależności. Ale najwyraźniej nie łapie wszystkich: większość listy zdecydowanie nie została zainstalowana na moją wyraźną prośbę.
kwark

@Telemachus. Twoje polecenie i ten ze wzorem nie robią dokładnie tego samego: dwie listy mają różną zawartość. Nie wiem jednak wystarczająco dużo o umiejętnościach, by powiedzieć ci dlaczego.
kwark

@Pablo: Łącza do twojego dziennika wydają się uszkodzone. Jeśli możesz je naprawić, zdecydowanie chciałbym je przeczytać.
kwark


1

W systemach opartych na apt spójrz na /var/log/apt/term.log. Dla mnie jest dość wyraźna linia do narysowania, gdzie zakończyła się instalacja i gdzie zaczęły się moje instalacje.


Mniej przydatne dla mnie, ponieważ istnieje mieszanie ręcznych instalacji i aktualizacji systemu. Również w zależności od twojego terminu instalacji. Logi będą ostatecznie nieaktualne i usuwane, więc nie cofną się tak daleko, jak tego potrzebuję.
kwark

Dla każdego, kto to spróbuje, zwróć uwagę, że przebranie przez dziennik apt wydaje się o wiele więcej pracy niż inne omówione tutaj opcje. Wyodrębnienie listy pakietów z dziennika nie jest z pewnością automatyczne.
kwark

1

Od man aptitude-create-state-bundle:

aptitude-create-state-bundle tworzy skompresowane archiwum przechowujące pliki wymagane do zreplikowania aktualnego stanu archiwum pakietu.

Pozwoli to zachować te same informacje, które aptitudedotyczą ręcznego instalowania pakietów.

Jest przeznaczony do użytku z aptitude-run-state-bundle:

aptitude-run-state-bundle rozpakowuje podany pakiet stanu aptitude utworzony przez aptitude-create-state-bundle (1) do katalogu tymczasowego, wywołuje go z dostarczonym, a następnie usuwa katalog tymczasowy.


1

Podczas korzystania dpkgnie wiesz, czy pakiet został ręcznie zainstalowany przez użytkownika, czy automatycznie (jako zależność lub podczas pierwszej instalacji systemu operacyjnego). Jeśli chcesz zachować te informacje, musisz uzyskać listę tylko tych pakietów, które zostały faktycznie zainstalowane ręcznie.

W tym celu możesz użyć jednej z tych dwóch linijek. Oba dają dokładnie taką samą wydajność na moim komputerze i są bardziej precyzyjne niż wszystkie rozwiązania proponowane do tej pory w tym pytaniu. Są kombinacją dwóch odpowiedzi (1) i (2) . Pamiętaj, że pierwotnie opublikowałem tę odpowiedź tutaj .

Używanie apt-mark:

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

Używanie 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)

Bardzo niewiele pakietów wciąż przechodzi przez pęknięcia, chociaż podejrzewam, że są one faktycznie instalowane przez użytkownika, albo bezpośrednio po instalacji poprzez konfigurację lokalizacji języka lub np. Przez instalator kodeków Totem. Wydaje się, że również wersje nagłówka linuxa kumulują się, mimo że zainstalowałem tylko niespecyficzny dla metapakietu pakiet. Przykłady:

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

Jak to działa

  1. Uzyskaj listę ręcznie zainstalowanych pakietów. Dla umiejętności, dodatkowe sedusuwa pozostałe białe znaki na końcu linii.
  2. Pobierz listę pakietów zainstalowanych zaraz po nowej instalacji.
  3. Porównaj pliki, wypisz tylko te wiersze w pliku 1, których nie ma w pliku 2.

Inne możliwości również nie działają:

  • Używanie ubuntu-14.04-desktop-amd64.manifestpliku ( tutaj dla Ubuntu 14.04) zamiast /var/log/installer/initial-status.gz. Więcej pakietów jest wyświetlanych jako zainstalowane ręcznie, nawet jeśli nie są.
  • Używanie apt-mark showautozamiast /var/log/installer/initial-status.gz. apt-markna przykład nie zawiera pakietu xserver-xorg, podczas gdy drugi plik tak.

Oba wyświetlają więcej pakietów niż powyższe rozwiązanie.


0

Jestem stronniczy, a przedstawione przeze mnie rozwiązanie nie zawsze jest możliwe, ale mam już dość tej sytuacji. W rezultacie nic nie instaluję już za pomocą narzędzi do aktualizacji / zarządzania pakietami.

Wybrałem jednak dość trudną trasę (miałem surowe wymagania dotyczące wersji). Stworzyłem ogromny plik makefile, który pobiera, kompiluje i instaluje w moim katalogu domowym każdą potrzebną paczkę (program, bibliotekę, cokolwiek). Rozwijałem go krok po kroku, kawałek po kawałku. Makefile pobiera i kompiluje wszystko, nawet kompilatory.

Kiedy przeprowadzam się do nowego systemu lub instaluję ponownie, po prostu kopiuję plik makefile (plus kilka dodatkowych elementów), uruchamiam make world i wracam następnego dnia.

W przypadku niektórych programów, które rozwijam (więc mam kontrolę), używam zaprogramowanego narzędzia, menedżera pakietów kasztanów . Coś w rodzaju folderów .app na MacOSX. Wszystko jest w pakiecie, więc wiem, co jest instalowane w dowolnym momencie, i wiem, że jest samowystarczalny i samowystarczalny (z wyjątkiem bibliotek systemowych)


Możesz po prostu umieścić polecenia instalacyjne menedżera pakietów w skrypcie i mieć ten sam efekt; zakładając, że potrzebny kod jest spakowany. Twoje podejście wygląda bardzo podobnie do gentoo.
wcoenen,

Miło wiedzieć. Wygląda na dużo dodatkowej pracy poza domyślnym systemem Ubuntu / Debian. Widzę ręczne utrzymywanie niektórych pakietów, ale utrzymanie ich wszystkich w ten sposób wymaga więcej pracy, niż chcę.
kwark

Tak, ale z dodatkowym problemem polegającym na tym, że rzeczy ubuntu / fink / darwinports nie wszędzie działają na różnych platformach (raz byłem na platformie cyfrowej i IBM sp4). Nie twierdzę, że to dobra droga. Mówię tylko, że spełnia swoje zadanie, choć w brzydki, śmierdzący sposób, i mam pełną kontrolę nad tym, co dzieje się w moim systemie.
Stefano Borini,

Oczywiście mógłbym zdecydować któregoś z tych dni, aby naprawdę poważnie przyjrzeć się temu, aby się z nim wyłonić i przerobić wszystko.
Stefano Borini

Ta ścieżka jest bardziej powszechna w dzisiejszych czasach, gdy rozważasz narzędzia takie jak szef kuchni i marionetka.
Steve Buzonas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.