jak wygenerować listę zainstalowanych pakietów z pełnej kopii zapasowej systemu?

6

Gdybym miał uruchomiony system Debian, można by wydać następującą komendę, aby uzyskać listę zainstalowanych pakietów:

dpkg --get-selections > packages.lst

Ale teraz mam tylko pełną kopię zapasową partycji root (pełna kopia zapasowa systemu) działającego systemu i nic więcej. Jak mogę wygenerować listę zainstalowanych pakietów z tych plików?

ceremcem
źródło
Tylko partycja root - nie cały system? Które katalogi znajdują się na tej partycji?
Thomas Weinbrenner,
Miałem na myśli „pełną kopię zapasową systemu”, odpowiednio edytowałem pytanie.
ceremonie
Weź to również pod uwagę jako sposób na odróżnienie tylko tych, które zainstalowałeś. Zajmie
Eliptyczny widok

Odpowiedzi:

6

zrootować do niego i uruchomić dpkg byłoby najłatwiejszą rzeczą. Zobacz https://superuser.com/a/417004/20798 na jak dostać pracę /proc, /sysi /devwewnątrz chroot.

Ponieważ masz działający system debianowy poza kopią zapasową, prawdopodobnie możesz po prostu użyć

dpkg --admindir=dir --get-selections

W dirdomyślnie /var/lib/dpkg, więc umieścić ścieżkę do tworzenia kopii zapasowych /var/lib/dpkg.


Nie zapominaj, że dpkg --get-selectionsnie pokazuje, które pakiety zostały zainstalowane ręcznie, a które zostały zainstalowane tylko w celu spełnienia zależności (i dlatego powinny być automatycznie usuwane, gdy nie są już potrzebne, ponieważ nowsze wersje pakietów, których tak naprawdę chcesz, mają różne zależności lub ponieważ usuwasz ręcznie zainstalowany pakiet).

Używam aptitude, który ułatwia oznaczenie wszystkiego jako automatycznie zainstalowanego, a następnie przejrzenie i oznaczenie niektórych pakietów jako zainstalowanych ręcznie, dopóki nic, co chcesz zachować, nie zostanie automatycznie usunięte. Start z dużymi meta-pakietów, takich jak build-essential, ekwiwalenty Debiana z ubuntu-standardi ubuntu-desktopi takie tam. W aptitude, naciśnij, raby zobaczyć odwrotną zależność pakietu (pkgs, które zależą od niego).

Peter Cordes
źródło
1
Możesz użyć apt-marklub (znacznie wygodniej, ale nie instalować domyślnie), apt-cloneaby sklonować zestaw zainstalowanych pakietów, w tym flagę automatyczną / ręczną.
Gilles,
1
dpkg --admindir=dir --get-selectionszawiera również listę odinstalowanych pakietów i innych niezainstalowanych. Musisz go przeanalizować, aby uzyskać tylko zainstalowane pakiety.
terdon
@terdon: Zakładam, że zamierzonym zastosowaniem było nakarmienie listy dpkg --set-selections. W takim przypadku uruchom aptitudeprzed zezwoleniem dpkg na działanie na te wybory i zaznacz wszystkie pakiety, które mają zostać odinstalowane, jako niezmienione. Lub przejrzyj listę i zobacz, który cruft chcesz wyczyścić (i zmień go z deinstall na purge).
Peter Cordes
4

Podejście Piotra jest lepsze, ale możesz też po prostu przeanalizować, /var/lib/dpkg/statusco nie wymaga chroot:

 $ perl -00ne 'if(/: install/){/Package:\s*(\S+)/ && print "$1\n"}' /var/lib/dpkg/status

Na moim komputerze, który zwrócił tę samą listę pakietów co dpkg --get-selections | awk '$NF=="install"{print $1}'( awkparsowanie jest potrzebne, ponieważ w przeciwnym razie pokazuje również odinstalowane pakiety).

terdon
źródło
downvote, ponieważ daje inny zestaw pakietów w moim systemie. Mam 4113 paczek zgodnie z dpkg --get-selections, 3925 paczek zgodnie z twoją linią pojedynczą i 1473 paczek brakuje w jednej linijce.
ceremcem
@ceremcem tak, jak powiedziałem w mojej odpowiedzi, to dlatego, dpkg --get-selectionsże nie wyświetla tylko zainstalowanych pakietów. Wyświetli także te odinstalowane. Porównaj wyniki mojego jednowierszowego z tym dpkg --get-selections | awk '$NF=="install"{print $1}'zamiast. Alternatywnie, po prostu uruchom, dpkg --get-selections | grep deinstallaby zobaczyć na liście różne pakiety, których nie chcesz.
terdon
dpkg_installedPolecenie zwraca 193 mniej niż pakiety dpkg --get-selectionscommad. twój liniowiec ma 1204 dodatkowe, 1473 brakujące pakiety w porównaniu do dpkg --get-selectionskomendy i 1204 dodatkowe, 1280 brakujących pakietów w porównaniu do dpkg_installedkomendy.
ceremcem
@ceremcem co jest dpkg_installed? Gdzie mogę go znaleźć, to brzmi użytecznie i chciałbym to sprawdzić na moim komputerze. Mogę ci to powiedzieć tutaj, dpkg --get-selections | awk '$NF=="install"{print $1}'a linijka Perla zwraca tę samą listę. W każdym razie nie ma sensu porównywać tego, dpkg --get-selectionsponieważ drukuje różne rzeczy, których nie chcesz.
terdon
Wybacz mi, że wymyśliłem coś w rodzaju niezrozumiałego żartu, którego użyłem dpkg_installedzamiast dpkg --get-selections | awk '$NF=="install"{print $1}'. Nawiasem mówiąc, przeprowadzam kilka testów i wydaje się, że coś jest nie tak z moją bieżącą instalacją, ponieważ nie mogę znaleźć niektórych moich zainstalowanych aplikacji na dpkg --get-selectionsliście. Przełączam moją opinię, dopóki nie uruchomię tych poleceń w niektórych innych instalacjach.
ceremcem
0

Możesz mieć listę korzystającą z twoich pakietów, używając:

awk '/Package:/ {print $2}' /var/lib/dpkg/status

Poulpatine
źródło
To nie tylko pokaże zainstalowane pakiety.
terdon