Od wydania Fedory 26 podkomenda Dnf repoquery
obsługuje nową opcję wyświetlania wszystkich pakietów zainstalowanych przez użytkownika:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
W przeciwieństwie do innych metod wyświetla również wszystkie pakiety debuginfo. Dodatkowy grep w powyższym przykładzie je odfiltrowuje.
Aby zainstalować listę na hoście B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
W najnowszych wersjach Dnf (np. Fedora> = 23) do bazy danych pakietów można zapytać o nazwy pakietów instalowanych przez użytkownika za pomocą interfejsu API Dnf Python:
$ python3 -c 'import dnf; b = dnf.Base(); b.fill_sack(); \
l = sorted(set(x.name for x in b.iter_userinstalled() \
if not x.name.endswith("-debuginfo") \
and x.name not in \
["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \
print("\n".join(l)) ' > pkgs_a.lst
# dnf install $(cat pkgs_a.lst) # on host_b
Domyślnie dnf install
przerywa, jeśli jeden lub więcej pakietów nie jest już dostępnych. Alternatywnie, dnf może zostać zmuszony do zainstalowania wszystkich pozostałych:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Umieść powyższy kod i inne elementy, user-installed.py
które obsługują również inne dystrybucje.
historia zainstalowana przez użytkownika
W Fedorze 23 i nowszych Dnf zapewnia
# dnf history userinstalled
polecenie, które wyświetla listę wszystkich pakietów zainstalowanych przez użytkownika. Począwszy od 2016-11 roku, jego użyteczność jest ograniczona, ponieważ nie ma możliwości kontrolowania jego wyników i drukuje pakiety w pełni kwalifikowane (tj. Zawierające informacje o wersji).
Ograniczenia zainstalowane przez użytkownika
Zauważ, że oznaczanie pakietów jako instalowanych przez użytkownika ma pewne ograniczenia w niektórych wersjach Fedory, w przypadku systemów z 23-go okresu (od około 2015-11) istotne są następujące problemy):
Repoquery
W starszych systemach Fedory, w których Dnf, API Dnf i dnf history userinstalled
nie są dostępne, zamiast tego można użyć repozytorium , np .:
$ repoquery --installed \
--qf '%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}' --all \
| awk -F'|' ' $2 ~ /user/ && ($3 != 4294967295) { print $1 }' \
| sort -u > pkgs_a.lst
Drugi warunek awk służy do wykluczenia pakietów, które zostały zainstalowane przez instalatora. Identyfikator użytkownika instalatora był najwyraźniej zapisany jako 4294967295 - alternatywnie możesz napisać coś takiego ($3 == 0 || $3 == your-user-id)
.
Zauważ, że to polecenie działa w Fedorze do wersji 21 - ale np. Nie w wersji 23, ponieważ to polecenie repoquery
zostało zastąpione dnf repoquery
. I dnf repoquery
nie rozumie %{yumdb_info.reason}
tagu.
repoquery ...
: „Nieprawidłowy„ powód ”yumdb querytag dla zainstalowanego pkg: HandBrake-cli-0.9.5-1.fc14.x86_64”yum localinstall ...
. Miałem jednak sporo paczek, które trafiły do tego obozu.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
zwrócił 90 paczek.Najłatwiejszym i działającym przez długi czas jest:
... który działa podobnie do polecenia get / set selections dpkg, AIUI. Pamiętaj również, że jeśli odtwarzasz historię, możesz użyć:
... zamiast samodzielnie go analizować.
źródło
Zainspirowany slm „s odpowiedź Doszedłem z następującym
yum history
rozwiązaniem opartym:Uzyskaj całą szczegółową historię wszystkich transakcji instalacji yum (tj. Brak aktualizacji), z wyjątkiem tych wykonanych w ramach działań instalatora początkowego (transakcje 1 i 2 w moim systemie, przypisane do użytkownika „System”):
Filtruj jawnie zainstalowane pakiety i odcinaj prefiksy wersji.
Potrzebne jest brzydkie wyrażenie regularne, aby dopasować wszystkie rodzaje sufiksów wersji.
Wyniki wyglądają całkiem dobrze w moim systemie.
Porównanie z repozytorium ansatz (w moim systemie):
(Przekazałem wyniki repozytorium przez sort -u)
Dlaczego są różnice? Ponieważ repoquery obejmuje wszystkie pakiety z transakcji 1 i 2, tj. Wszystkie pakiety, które zostały zainstalowane przez instalator Fedory. To wyjaśnia, dlaczego repoquery obejmuje wspomniane pakiety xorg-x11-drv-mga i przyjaciół.
Porównanie 2. repoquery i yum-history pokazuje, że repoquery 2. jest dokładniejsze - nie zawiera niektórych już usuniętych pakietów. Ponadto zawiera kilka (2 w moim systemie) pakietów z operacji „mniam aktualizacja”, jak się wydaje.
Ostrzeżenie
Powyższa metoda oparta na historii wyświetla tylko wszystkie jawnie zainstalowane pakiety przez cały okres istnienia systemu. Nie równoważy tych pakietów, które zostały usunięte w późniejszej transakcji. Dlatego ta metoda wymaga ręcznego ustalania wyników i powinna być stosowana tylko w systemach, w których
repoquery
nie jest dostępna.źródło
Mam starszą wersję Fedory (14), więc moje yum zawiera mniej bogatą wersję
yum
, ale możesz rzucić okiem na tęyum history
funkcję. Wierzę, że możesz uzyskać informacje, których szukasz z tego polecenia.lista historii
Możesz wrócić do pierwszej transakcji, przekazując listę numerów do
yum history list
:informacje o historii
Poniżej pokazano, co zostało zainstalowane w ramach pierwszej transakcji yum:
Zauważ, w jaki sposób yum informuje, czy pakiet został jawnie zainstalowany, czy zainstalowany, ponieważ był potrzebny przez zależność. Możesz przeanalizować te informacje i uzyskać listę pakietów, które zostały jawnie zainstalowane.
źródło
yum history
pomysłu, porównuje ona również wyniki zrepoquery
metodą opartą na pomiarze. Jako efekt uboczny rozszerzyłem moją odpowiedź dotyczącą repoquery.źródło
--userinstalled
Przełącznik został właśnie dodany do DNF w maju . Przetestowałem to i daje dokładne wyniki. Modulo pakiety kernel / kernel-core / kernel-moduły, które tak naprawdę nie są instalowane przez użytkownika. Zawiera także wszystkie*-debuginfo
pakiety - ale w razie potrzeby można je łatwo odfiltrować.Do opakowań lista ty zainstalowanych, spróbuj to jedno-liner :
Wynik:
PS1: nie pokazuje zależności
PS2: jest posortowany alfabetycznie
PS3: nie pokazuje, czy pakiet został usunięty później
źródło
Co zrobiłem (zapomniałem szczegółów, a ja jestem leniwym dupkiem, więc ...
Pobierz wszystkie zainstalowane pakiety:
rpm -qa > file
Posługiwać się
sed(1)
aby pozbyć się numerów wersji i tym podobnych (zachowaj architekturę, jeśli jest wymagana). Wymagało to kilku iteracji, aby wszystko było w porządku, chcesz zastąpić ostatni odcinek-[0-9.]-[0-9].fc23
lub podobny niczym, ale są też zabawne „numery” wersji.Po normalnej instalacji wykonaj
yum -y install $(< file)
(lubdnf
, w razie potrzeby).Dostaniesz opadające pakiety, które już nie istnieją, zmieniły nazwę lub zostały zastąpione innymi.
źródło